Đố 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,911
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
 
Dịch chuyển mũi tên xổ xuống của Validation

Ngồi buồn "vọc" thằng Validation, thấy có trò này cũng hơi buồn cười, post lên cho bà con xem

[video=youtube;A6V_xDD38vA]http://www.youtube.com/watch?v=A6V_xDD38vA[/video]


Có ai làm được giống vậy không ta?
Ẹc... Ẹc...
 
Upvote 0
Đại khái chắc như hình "Vali đi lạc" sau:

vali-di lac.jpg

Vụ này chắc ndu và lão chết tiệt cùng tình cờ phát hiện khi xử 1 file trong topic xoá object rác.
 
Lần chỉnh sửa cuối:
Upvote 0
Hôm nay mạo muội vào đây hỏi một câu, múa rìu qua mắt thợ, hoặc gọi là đố cũng được - đố cho người chưa biết hà hà ...
Trả lời nhanh: Đoạn code này trả về True hay False? không được chạy thử nha
Sub Thu1()
[A1] = "GPE1"
[A2] = "GPA"
Set Tim = Columns("A").Find("GPE")
MsgBox (Not Tim Is Nothing)
End Sub
 
Upvote 0
Nói trật là trật mà, xin mời các Bạn khác.
 
Upvote 0
Nếu mình set Tim như vậy là chắc chắn True rồi cài này nó tìm thấy mà Phủ định của True, False cuối cùng Msgbox là False mà bạn Learning-Excel trả lời không phải True là False rồi
 
Upvote 0
Cả hai Bạn đều sai, kinh nghiệm "xương máu" đó, cảm ơn đi mình giải cho
 
Lần chỉnh sửa cuối:
Upvote 0
Hôm nay mạo muội vào đây hỏi một câu, múa rìu qua mắt thợ, hoặc gọi là đố cũng được - đố cho người chưa biết hà hà ...
Trả lời nhanh: Đoạn code này trả về True hay False? không được chạy thử nha
TRUE cũng trật mà FALSE cũng trật lất luôn
Do Find method anh thanhlanh viết thiếu
Nếu vầy thì ra kết quả = TRUE
Mã:
Sub Thu1()
  Dim Tim As Range
  [A1] = "GPE1"
  [A2] = "GPA"
  Set Tim = Columns("A").Find("GPE", , , [COLOR=red][B]xlPart[/B][/COLOR])
  MsgBox (Not Tim Is Nothing)
End Sub
Còn vầy thì FALSE
Mã:
Sub Thu1()
  Dim Tim As Range
  [A1] = "GPE1"
  [A2] = "GPA"
  Set Tim = Columns("A").Find("GPE", , , [COLOR=red][B]xlWhole[/B][/COLOR])
  MsgBox (Not Tim Is Nothing)
End Sub
Còn nếu ta cố tình bỏ qua cái màu đỏ ở trên thì nó sẽ theo cái sự tìm kiếm của lần trước ---> Lần trước mình tìm chính xác thì giờ chạy code nó sẽ tìm chính xác... Còn lần trước mình tìm gần đúng thì lần này nó cũng sẽ tìm gần đúng
---------------
Kết luận cuối cùng: Có dùng Find Method thì cố mà ghi cho đầy đủ, thiếu 1 tham số có thể gây hậu quả nghiêm trọng
 
Lần chỉnh sửa cuối:
Upvote 0
Đúng là như Anh NDU nói, nhưng do tác giả hỏi trả về TRUE hay FALSE và vì viết thiếu (hoặc sai cấu trúc) của hàm Find thì đã cho kết quả FALSE rồi, và khi Msgbox phủ định của FALSE chỉ có trả vềTRUE thôi. Thực tế chạy code như vậy. Chạy nhiều lần vẫn vậy.
 
Lần chỉnh sửa cuối:
Upvote 0
TRUE cũng trật mà FALSE cũng trật lất luôn
Do Find method anh thanhlanh viết thiếu
Nếu viết đủ thì còn đố gì được nữa, vậy nên mới có mẹo là không được thử chứ nếu được thử chưa chắc trả lời được, Hà hà ...
Vậy nếu viết thiếu mà chạy lần đầu thì sao?
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu viết đủ thì còn đố gì được nữa, Hà hà ...
Vậy nếu viết thiếu mà chạy lần đầu thì sao?
Không chắc! Như em đã nói ở trên:
Còn nếu ta cố tình bỏ qua cái màu đỏ ở trên thì nó sẽ theo cái sự tìm kiếm của lần trước ---> Lần trước mình tìm chính xác thì giờ chạy code nó sẽ tìm chính xác... Còn lần trước mình tìm gần đúng thì lần này nó cũng sẽ tìm gần đúng
 
Upvote 0
Đúng là như Anh NDU nói, nhưng do tác giả hỏi trả về TRUE hay FALSE và vì viết thiếu (hoặc sai cấu trúc) của hàm Find thì đã cho kết quả FALSE rồi, và khi Msgbox phủ định của FALSE chỉ có trả vềTRUE thôi. Thực tế chạy code như vậy. Chạy nhiều lần vẫn vậy.
Cái này cũng sai nha!
 
Upvote 0
Không chắc! Như em đã nói ở trên:

Không ndu à, nếu bỏ qua tham số thì nếu chạy lần đầu nó còn phụ thuột tùy chon Find trên Excel (giả sử như mình tìm gì đó trên Excel trước khi chạy code),hình như mặc định là tìm gần đúng
 
Lần chỉnh sửa cuối:
Upvote 0

Nếu như viết hàm FIND("GPE") như vậy thì mặc định của nó được tính như LookAt:=xlPart, trong trường hợp này thì giá trị trả về GPE1, nhưng nếu Find("GP") thì trả về giá trị GPA. Thêm cái msgbox đó lại trả về TRUE là đúng rồi còn gì?
 
Upvote 0
Nếu như viết hàm FIND("GPE") như vậy thì mặc định của nó được tính như LookAt:=xlPart, trong trường hợp này thì giá trị trả về GPE1, nhưng nếu Find("GP") thì trả về giá trị GPA. Thêm cái msgbox đó lại trả về TRUE là đúng rồi còn gì?

Câu này : MsgBox (Not Tim Is Nothing) = nếu tìm thấy thì trả về là true chớ bạn?
 
Upvote 0
Đúng là như Anh NDU nói, nhưng do tác giả hỏi trả về TRUE hay FALSE và vì viết thiếu (hoặc sai cấu trúc) của hàm Find thì đã cho kết quả FALSE rồi, và khi Msgbox phủ định của FALSE chỉ có trả vềTRUE thôi. Thực tế chạy code như vậy. Chạy nhiều lần vẫn vậy.

Nếu 1 người khác nói rằng False, thực tế chạy ra False, chạy nhiều lần vẫn False thì sao?

Thực tế có xảy ra đấy. Cho nên câu nói của ndu phải hiểu rõ ràng, chứ không thể hiểu sơ sài rồi tuyên bố mạnh miệng.
ndu đã viết:
Còn nếu ta cố tình bỏ qua cái màu đỏ ở trên thì nó sẽ theo cái sự tìm kiếm của lần trước
lần trước phải hiểu là lần sử dụng công cụ find trước khi chạy code của thanhlanh lần đầu tiên. Có thể bằng code, bằng Ctrl F, Ctrl H, bằng menu, ... Có thể là hồi sáng, hôm qua, và có thể là năm ngoái.

Muốn test thì phải test đầy đủ như sau:
PHP:
Sub Thu1()
[A1] = "GPE1"
[A2] = "GPA"
Set Timkiem = Columns("A").Find("LCT", , , xlPart)
Set Tim = Columns("A").Find("GPE")
MsgBox (Not Tim Is Nothing)
End Sub
PHP:
Sub Thu2()
[A1] = "GPE1"
[A2] = "GPA"
Set Timkiem = Columns("A").Find("LCT", , , xlWhole)
Set Tim = Columns("A").Find("GPE")
MsgBox (Not Tim Is Nothing)
End Sub
Thu1 luôn luôn True

Thu2 luôn luôn False
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom