Đố 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
 
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
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.
Về triết lý của vòng FOR thì ở ngôn ngữ nào cũng thế. Nhưng về chi tiết thì có thể có khác biệt trong mỗi ngôn ngữ
Vd. như trong Delphi (Object Pascal):
0. Biến điều khiển i phải có kiểu thứ tự. Tức vd. BYTE, WORD (trong VBA là Integer), Integer (trong VBA là Long). Không thể là Double hay Single được. Nếu thế thì không compile project được.
1. Biến điều khiển i phải là biến cục bộ (local variable). Khai báo biến toàn cục (global) thì vẫn compile project được, chạy nhiều khi vẫn ra kết quả. Nhưng khi compile thì sẽ có cảnh báo (Warning). Tức tôi lưu ý, còn anh làm khác đi thì tôi không đảm bảo luôn luôn không có trục trặc.
2. Trong vòng FOR không được phép thay đổi biến điều khiển i (vd. i := i + 1). Nếu thay đổi i trong vòng FOR thì chả có warning gì cả mà là Error và không thể compile được project.
3. Sau khi ra khỏi vòng FOR một cách tự nhiên thì biến điều khiển không xác định (undefined). Dùng biến i sau FOR trong trường hợp này thì vẫn compile project được, chạy nhiều khi vẫn ra kết quả. Nhưng khi compile thì sẽ có cảnh báo (Warning). Tức tôi lưu ý, còn anh làm khác đi thì tôi không đảm bảo biến i luôn đúng, luôn xác định.
Nhưng nếu ra khỏi vòng FOR bằng code (trong VBA là Exit For, trong Delphi là Break) thì sau FOR biến i có giá trị như lúc ra khỏi For.
Trong VBA sau FOR biến i luôn xác định.
 
Upvote 0
Web KT

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

Back
Top Bottom