Đố 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
 
Tôi có một câu đố nho nhỏ. Đúng nghĩa đó vui luôn :)
Viết code copy giá trị và định dạng từ A1:A10 sang C1:C10 sao cho code gọn nhất.
 
Upvote 0
Vậy phải copy thêm định dạng qua nữa hả anh?
PHP:
Sub vidu()
Range("A1:A10").Copy
With Range("C1:C10")
    .PasteSpecial xlPasteValues  'Ý 1: Lấy giá trị
    .PasteSpecial xlPasteFormats  'Ý 2: Lấy định dạng
    '.PasteSpecial xlPasteFormulasAndNumberFormats 'Nếu đề bài chỉ lấy định dạng số thì dòng này là được :D
End With
Application.CutCopyMode = False
End Sub
 
Upvote 0
PHP:
Sub vidu()
Range("A1:A10").Copy
With Range("C1:C10")
    .PasteSpecial xlPasteValues  'Ý 1: Lấy giá trị
    .PasteSpecial xlPasteFormats  'Ý 2: Lấy định dạng
    '.PasteSpecial xlPasteFormulasAndNumberFormats 'Nếu đề bài chỉ lấy định dạng số thì dòng này là được :D
End With
Application.CutCopyMode = False
End Sub
Dài quá :D
 
Upvote 0
Rút lại nhưng vẫn còn dài

[a1:A10].Copy
[c1].PasteSpecial 12
Selection.PasteSpecial -4163
 
Upvote 0
Ngồi buồn thử đố quý vị. Code hết sức đơn giản.

code 1
For i = 1 to giaTriCuoi
' code gì đó
if (dk) then Exit For
Next i

code 2
For i = 1 to giaTriCuoi
' code gì đó
if (dk) then i = giaTriCuoi
Next i

Hai code trên khác nhau chỗ nào (dễ rồi). Khi nào tôi dùng 2 mà không dùng 1? (gợi ý: câu trước không hẳn dễ lắm đâu)
 
Upvote 0
Upvote 0
Ngồi buồn thử đố quý vị. Code hết sức đơn giản.

code 1
For i = 1 to giaTriCuoi
' code gì đó
if (dk) then Exit For
Next i

code 2
For i = 1 to giaTriCuoi
' code gì đó
if (dk) then i = giaTriCuoi
Next i

Hai code trên khác nhau chỗ nào (dễ rồi). Khi nào tôi dùng 2 mà không dùng 1? (gợi ý: câu trước không hẳn dễ lắm đâu)
Theo tôi thì:
1. Điểm khác nhau là giá trị của i khi thoát vòng lặp. Với code 1 i sẽ là giá trị khi dk = True, code 2 thì giá trị của i giống như khi vòng lặp được duyệt hết, bằng giaTriCuoi + 1.
2. Nếu muốn sử dụng tiếp biến i và giá trị của nó giống như vòng lặp được duyệt hết thì dùng code 2. (Tôi không biết có trường hợp nào đặc biệt hơn không chứ nếu như thế này thì chỉ cần gán i = giaTriCuoi sau vòng lặp là được)
 
Upvote 0
Theo tôi thì:
1. Điểm khác nhau là giá trị của i khi thoát vòng lặp. Với code 1 i sẽ là giá trị khi dk = True, code 2 thì giá trị của i giống như khi vòng lặp được duyệt hết, bằng giaTriCuoi + 1.
2. Nếu muốn sử dụng tiếp biến i và giá trị của nó giống như vòng lặp được duyệt hết thì dùng code 2. (Tôi không biết có trường hợp nào đặc biệt hơn không chứ nếu như thế này thì chỉ cần gán i = giaTriCuoi sau vòng lặp là được)

Đúng như còn thiếu hai chi tiết quan trọng.
Chi tiết thứ nhất liên quan đến cách hoạt động của vòng lặp For trong VBA (nhấn mạnh, VBA. Có nghĩa là ngôn ngữ khác chưa chắc hoạt động như thế)
Chi tiết thứ hai liên quan đến cách sử dụng biến đếm vòng lặp.

Hai chi tiết trên, một cái là lý thuyết ngôn ngữ và cái thứ hai là thực hành.
 
Upvote 0
Web KT
Back
Top Bottom