Đố vui về VBA!

Liên hệ QC

anhtuan1066

Thành viên gạo cội
Tham gia
10/3/07
Bài viết
5,802
Được thích
6,905
Nhằm cũng cố kiến thức về VBA cho các bạn mới bắt đầu và cả những bạn đang ứng dụng mà chưa hiểu nhiều về nó, tôi mở topic này với mong mõi qua những câu hỏi vui, các bạn sẽ nhận định lại sự hiểu biết cũa mình... (Kễ cã chính tôi cũng đang tập tành nên có rất nhiều cái chưa biết)
Mong rằng topic sẽ mang đến cho các bạn những khám phá thú vị với những cái tưỡng chừng như đã biết
Mong nhận dc bài viết về câu đố cũa các cao thủ! Còn các bạn mới thì đừng ngại khi đưa ra ý kiến cũa mình.. Có sai có sữa sẽ hoàn thiện!
Tôi xin mỡ màn trước bằng 1 câu hỏi đơn giãn
ANH TUẤN

CÂU HỎI 1: Tại sao biến K ko hoạt động?
Tôi muốn khi nhấn vào 1 button thì cell A1 sẽ tăng lên 1 đơn vị... Tôi đã làm như sau:
-Tạo 1 Command Button (nút nhấn thuộc thanh Control Toolbox), click phải chuột lên nút nhấn, chọn View code, rồi gõ vào đoạn code sau:
PHP:
Private Sub CommandButton1_Click()
   K = K + 1
   Range("A1").Value = K
End Sub
Ban đầu K chưa có gì, xem như =0, nhấn nút lần thứ nhất thì K dc tăng thêm 1, vậy K hiện tại sẽ bằng 1, và gán K vào cell A1 thì đương nhiên A1 sẽ =1... Nhấn nút lần 2, K lại dc tăng thêm 1 nên hiện tại K sẽ =2 và cell A1 cũng sẽ =2... vân vân.. từ đó diễn tiến tiếp...
Hi.. hi.. Điều này nghe qua có vẽ rất hợp lý, ấy thế mà khi nhấn nút nó chỉ hoạt động dc duy nhất 1 lần (A1 = 1) rồi thôi ko nhút nhít nữa...
Các bạn có thể giãi thích tại sao lại như thế ko? Tại sao những lần nhấn nút sau đó K lại ko tăng thêm tí nào (vì thực tế A1 vẫn cứ = 1 hoài) ?
ANH TUẤN
 
Cuối tuần mời các bạn thư giãn nhẹ nhàng:
Mình có 2 thư mục như này:

View attachment 200754
Mỗi thư mục đều chứa file tên là myfile.xlsb
Bây giờ ta đang đứng ở file myfile.xlsb nằm trong thư mục local, mời các bạn thử viết code để chạy các tác vụ:
1/Đóng file myfile.xlsb trong thư mục local.
2/Copy file myfile.xlsb trong thư mục server chép đè vào thư mục local.
3/Mở lại file myfile.xlsb trong thư mục local.

Cám ơn các bạn. --=0--=0
Thêm module với code dưới vào tập tin, không cần lưu lại, sau đó chạy code
Mã:
Sub test()
    Application.DisplayAlerts = False
    ThisWorkbook.ChangeFileAccess xlReadOnly
   
    With CreateObject("Scripting.FileSystemObject")
        .CopyFile Replace(ThisWorkbook.FullName, "\local\", "\server\"), ThisWorkbook.FullName
    End With
    Workbooks.Open ThisWorkbook.FullName
    ThisWorkbook.Close False
    Application.DisplayAlerts = True
End Sub
 
Upvote 0
Lấy lại kích thước gốc của một hình đã chèn trên bảng tính
Có tình huống thế này:
- Tôi chèn 1 hình vào bảng tính
- Xong, tôi chỉnh lại kích thước cho nó tùy ý (kéo chiều ngang, kéo chiều dọc)
- Cuối cùng tôi lưu và đóng file
Sau này mở file lên, nếu tôi muốn lấy lại kích thước gốc của hình, tôi sẽ chọn vào hình, vào tab Format, bấm mũi tên xổ xuống của nút Reset Picture và chọn "Reset Picture & Size". Vậy là hình sẽ trở lại kích thước nguyên thủy
----------------------------
Xin hỏi: Nếu viết code thì phải viết thế nào (chức năng này không cho record macro)
Trong file đính kèm dưới đây tôi có chèn 1 hình. Các bạn giúp tôi lấy lại kích thước gốc của nó với nhé
 

File đính kèm

  • ResetPicture.xlsx
    21.8 KB · Đọc: 7
Upvote 0
Lấy lại kích thước gốc của một hình đã chèn trên bảng tính
Có tình huống thế này:
- Tôi chèn 1 hình vào bảng tính
- Xong, tôi chỉnh lại kích thước cho nó tùy ý (kéo chiều ngang, kéo chiều dọc)
- Cuối cùng tôi lưu và đóng file
Sau này mở file lên, nếu tôi muốn lấy lại kích thước gốc của hình, tôi sẽ chọn vào hình, vào tab Format, bấm mũi tên xổ xuống của nút Reset Picture và chọn "Reset Picture & Size". Vậy là hình sẽ trở lại kích thước nguyên thủy
----------------------------
Xin hỏi: Nếu viết code thì phải viết thế nào (chức năng này không cho record macro)
Trong file đính kèm dưới đây tôi có chèn 1 hình. Các bạn giúp tôi lấy lại kích thước gốc của nó với nhé
Cái này search là ra anh.
Mã:
ActiveSheet.Shapes(1).ScaleWidth 1, True
 
Upvote 0
Đố tiếp anh. Trường hợp nào thì lệnh này không dùng được? :)
Thử thì biết chứ gì. Ví dụ thử với shape (không phải picture)
---------------------------------------
Nói thật là tôi đang cần cái Reset picture này lâu lắm rồi. Tự dưng hôm này tình cờ phát hiện ra, thấy hay nên gửi lên cho bà con tham khảo
 
Upvote 0
Em vẫn xét picture anh gửi thôi.
Chắc thêm dòng này phía trước bài trên cho chắc ăn:
PHP:
ActiveSheet.Shapes(1).LockAspectRatio = msoTrue
Đúng là chắc ăn hơn thật!
Tại thấy mặc định (chưa can thiệp) thì LockAspectRatio đã được check rồi nên không để ý
----------------
(trời! gửi bài xong thấy hiện ra linh tinh cái gì đâu không, xóa mệt luôn)
 
Upvote 0
Đố dễ ẹt nè.
Cô giáo ra bài:
Viết code cho 1 hàm VBA nhận 3 số thực a, b, c (3 điểm) và giải phương trình aX2 + bX + c = 0 (5 điểm)
và lý luận, giải thích cách dùng (2 điểm)

Ba Ếch viết như sau:
Mã:
Sub giaiptbac2()
' sub giải phương trình bậc 2
' chạy sub, gõ các trị a, b, c vào các câu hỏi và nhận kết quả
{ code hỏi và nhận a, b, c ở đây }
' đến đây thì đã có a, b, c
If a = 0 Then
  If b = 0 Then
    MsgBox "Phuong trinh " & IIF(c = 0, "co vo so nghiem", "vo nghiem")
  Else
    MsgBox "Co 1 nghiem la " & -c / b
  End If
  Exit Sub
End If
Dim delta
delta = b*b - 4*a*c
If delta < 0 Then
  MsgBox "Phuong trinh vo nghiem"
ElseIf delta = 0 Then
  MsgBox "Co 1 nghiem la " & -b / 2 / a
Else
  delta = sqrt(delta)
  MsgBox "Co 2 nghiem la " & (-b + delta) / 2 / a & " va " & (-b - delta) / 2 / a
End If
End Sub
Như vậy, Ếch sẽ được bao nhiêu điểm? Và theo bạn, nếu dưới 9 điểm thì muốn 9-10 điểm phải thế nào?
 
Upvote 0
Đố dễ ẹt nè.
Cô giáo ra bài:
Viết code cho 1 hàm VBA nhận 3 số thực a, b, c (3 điểm) và giải phương trình aX2 + bX + c = 0 (5 điểm)
và lý luận, giải thích cách dùng (2 điểm)

Ba Ếch viết như sau:
Mã:
Sub giaiptbac2()
' sub giải phương trình bậc 2
' chạy sub, gõ các trị a, b, c vào các câu hỏi và nhận kết quả
{ code hỏi và nhận a, b, c ở đây }
' đến đây thì đã có a, b, c
If a = 0 Then
  If b = 0 Then
    MsgBox "Phuong trinh " & IIF(c = 0, "co vo so nghiem", "vo nghiem")
  Else
    MsgBox "Co 1 nghiem la " & -c / b
  End If
  Exit Sub
End If
Dim delta
delta = b*b - 4*a*c
If delta < 0 Then
  MsgBox "Phuong trinh vo nghiem"
ElseIf delta = 0 Then
  MsgBox "Co 1 nghiem la " & -b / 2 / a
Else
  delta = sqrt(delta)
  MsgBox "Co 2 nghiem la " & (-b + delta) / 2 / a & " va " & (-b - delta) / 2 / a
End If
End Sub
Như vậy, Ếch sẽ được bao nhiêu điểm? Và theo bạn, nếu dưới 9 điểm thì muốn 9-10 điểm phải thế nào?
Câu hỏi chưa rõ giải phương trình tìm nghiệm trên tập hợp nào, ở đây hiểu là số thực R, nếu trên tập C thì kết quả khác.
Nếu a=b=c=0 thì câu trả lời có vô số nghiệm là chưa đủ mà phải là tất cả R đều là nghiệm.
Đề yêu cầu viết hàm thì ếch viết sub.
Code không chạy vì căn bậc 2 trong vba là SQR, không phải SQRT như trên sheet.
Điểm thì em cũng không biết được mấy vì code không chạy và em cũng không sửa được, chờ mấy thầy chuyên gia sửa điểm ở Lạng Sơn, Hà Giang vào giúp.
 
Upvote 0
Câu hỏi chưa rõ giải phương trình tìm nghiệm trên tập hợp nào, ở đây hiểu là số thực R, nếu trên tập C thì kết quả khác.
Nếu a=b=c=0 thì câu trả lời có vô số nghiệm là chưa đủ mà phải là tất cả R đều là nghiệm.
Đề yêu cầu viết hàm thì ếch viết sub.
Code không chạy vì căn bậc 2 trong vba là SQR, không phải SQRT như trên sheet.
Điểm thì em cũng không biết được mấy vì code không chạy và em cũng không sửa được, chờ mấy thầy chuyên gia sửa điểm ở Lạng Sơn, Hà Giang vào giúp.
1. Khi tôi nói số thực, mặc định là tập hợp R.
2. Hàm và sub : bạn đúng (bây giờ thử đặt câu hỏi tại sao Cô bảo làm hàm mà không là sub?)
3. SQRT, gõ nhầm, xin lỗi
4. Điểm chỉ là sự tương đối để đánh giá. Lỡ nói chuyện Hà giang rồi thì tôi hé thêm: thực ra bài này còn phần điểm cho thêm (bô nớt). Nếu biết phần ấy thì được trên cả 10. Nhưng cũng thú thật, nó trên trình của tôi.
 
Upvote 0
Trich

Pt là bậc 2 khi và chỉ khi a <> 0.
Bác ơi đề có bảo là phương trình bậc 2 đâu, đấy là bài làm đặt vậy chứ.
@VetMini em đoán chắc là muốn 11 điểm thì giải luôn phương trình ax^4 + bx^3 +cx^2 + dx + e = 0. Bây giờ bỏ toán 20 năm rồi em chỉ nhớ đến bậc 3 thôi.
 
Upvote 0
Bác ơi đề có bảo là phương trình bậc 2 đâu, đấy là bài làm đặt vậy chứ.
Theo tôi nếu đề bài là
Viết code cho 1 hàm VBA nhận 3 số thực a, b, c (3 điểm) và giải phương trình aX2 + bX + c = 0 (5 điểm)
Mà ta biết là khi học về pt bậc 2 luôn có đk a <> 0 nên ta phải xét dữ liệu nhập:
- nếu a = 0 thì không giải, vì pt không là bậc 2
- nếu a <> 0 thì xét delta rồi ...

Cũng có thể trước khi xét delta thì xét xem có a+b+c=0, a-b+c=0 hay không :D
 
Lần chỉnh sửa cuối:
Upvote 0
@VetMini em đoán chắc là muốn 11 điểm thì giải luôn phương trình ax^4 + bx^3 +cx^2 + dx + e = 0. Bây giờ bỏ toán 20 năm rồi em chỉ nhớ đến bậc 3 thôi.
Không phải vậy đâu. Dân chuyên giải phương trình có con toán gọi là đồng bộ thừa số (terms normalisation/ization)
Ví dụ, nếu a = 1 * 10^-10, b = 2 * 10^-10, c = 3 * 10^-10 thì ngừoi ta đồng bộ chúng thành 1, 2, 3 để giảm thiểu sai số. Đây chỉ là 1 ví dụ, còn nhiều vấn đề nữa, không chỉ có vậy. Đại khái là phải so sánh độ lớn tương đối của các thừa số trước khi bắt đầu giải.
Tức là phải viết thêm 1 hàm đồng bộ. Nhưng đã nói, cái này là trình cao lắm.
 
Upvote 0
Không phải vậy đâu. Dân chuyên giải phương trình có con toán gọi là đồng bộ thừa số (terms normalisation/ization)
Ví dụ, nếu a = 1 * 10^-10, b = 2 * 10^-10, c = 3 * 10^-10 thì ngừoi ta đồng bộ chúng thành 1, 2, 3 để giảm thiểu sai số. Đây chỉ là 1 ví dụ, còn nhiều vấn đề nữa, không chỉ có vậy. Đại khái là phải so sánh độ lớn tương đối của các thừa số trước khi bắt đầu giải.
Tức là phải viết thêm 1 hàm đồng bộ. Nhưng đã nói, cái này là trình cao lắm.
Đúng là việc này thường làm khi giải phương trình cụ thể, hóa ra lập trình cũng cần. Em lại tưởng là phải xét trường hợp số nhập vào vượt giới hạn của double, chắc khi đó phải viết lại cả các hàm cộng trừ nhân chia căn.
 
Upvote 0
Như tôi đã nói, nó cao trên trình của tôi thì còn hỏi "phải làm gì"
Theo tôi thì học sinh chỉ cần chú thích cho Cô giáo biết là mình có biết đến chuyện này, nhưng nó trên trình độ lớp cho nên không thể code. Thế là hưởng 1 điểm. Viết cái code sau đây thì cho 2 điểm. (điểm chỉ là tương đối để nói chuyện thôi)

Function DongBo(byRef a As Double, byRef b As Double, byRef c As Double)
' hàm đồng bộ ba thừa số a b c của phương trình bậc 2 để gảm sai số.
' chỉ biết hàm nó đại khái thế thôi chứ chi tiết nó cao trên trình độ của lớp
End Function

Code giải phương trình gọi hàm này. Vì hàm không làm gì cả cho nên gọi nó cũng chả chết ai. Khi nào biết phải code ra sao thì cho vào hàm.
 
Upvote 0
Cũng có thể trước khi xét delta thì xét xem có a+b+c=0, a-b+c=0 (*)hay không :D
Em nghĩ cái này không cần thiết, bởi (*) xảy ra thì (delta)^(1/2) =|a-c|
Làm thử : Khi a+b+c=0 =>b=-(a+c)
Delta=b^2-4ac=[-(a+c)]^2-4ac=a^2+c^2-2ac=(a-c)^2
Căn bậc hai của delta =|a-c|
 
Upvote 0
Em nghĩ cái này không cần thiết, bởi (*) xảy ra thì (delta)^(1/2) =|a-c|
Làm thử : Khi a+b+c=0 =>b=-(a+c)
Delta=b^2-4ac=[-(a+c)]^2-4ac=a^2+c^2-2ac=(a-c)^2
Căn bậc hai của delta =|a-c|
Nhưng tiếp theo thì sao? Dùng công thức biết trước
Mã:
x1 = (-b + (a-c)) / 2a = (- b + a -c) / 2a = 2a / 2a = 1
x2 = (-b - (a-c)) / 2a = (- b - a + c) / 2a = 2c / 2a = c/a
?

Thế có phải là sa đà vào việc tính toán không?

Trong khi đó nếu a + b + c = 0 (a - b +c = 0) thì rõ ràng có ngay 2 nghiệm là 1 và c/a (-1 và -c/a).

Nghiệm 1 và -1 nhìn ra ngay, vd. nhìn ra ngay là khi a + b + c = 0 thì 1 thỏa pt ax² + bx + c = 0. Nghiệm thứ 2 suy ra từ định lý Vi-et: x1 * x2 = c/a

Làm thế để cô giáo biết là em A không phải ... dạng vừa. Vì những trường hợp "đặc biệt" này có học trên lớp. :D
 
Upvote 0
Web KT
Back
Top Bottom