adam_tran nói:
Sub ResetButton_Click()
Dim C As CheckBox
For Each C In UserForm1 '// (1)
Set C.Value = False '// (2)
Next C End Sub
Có 4 cái lỗi ở đây:
1. Không phải control nào cũng có property là
Value, vì thế phải kiểm tra kiểu của control object (nếu ko thì phải cho cái bẫy lỗi là On Error Resume Next

2.
Set C.Value = False là sai vì người ta chỉ dùng lệnh
Set với các object (ví dụ như font chẳng hạn, cũng là property nhưng lại là object), còn gán giá trị cho các property không phải dạng object thì chỉ là lệnh gán bình thường (=). Như vậy đúng ra phải là: C.Value = False
3. Bao giờ trong lập trình cũng phải cố gắng vét cạn hết các trường hợp xảy ra để xử lý hết các lỗi. Ví dụ trong trường hợp này, giả sử các CheckBox Controls trên form đã bị .Enable = False (hoặc .Visible = False) thì việc gán giá trị cho các thuộc tính của control sẽ ko thực hiện được (lỗi xảy ra). Vì vậy, các bạn phải kiểm tra nếu Enable = True (If theControl.Enable Then ...) trước khi gán giá trị cho thuộc tính. (Cũng giống như việc trước khi Delete (hay Move) File, Folder, Record... thì phải kiểm tra sự tồn tại, thuộc tính (Read, Write,...) của File, Folder hay Record đó rồi mới thực hiện lệnh Delete (Move)... (Dĩ nhiên là phải thực hiện sau khi đã nhắc nhở người dùng trước khi thực hiện lệnh)
4. Trong lập trình, nhất là lập trình C, Delphi trong windows, một khi đã sử dụng các resources của hệ thống thì phải giải phóng hết memory. Việc bạn sử dụng Object (Control, form, recordset, connection, v.v...) cũng vậy, phải Kill Object(s) sau khi đã dùng xong. Bạn cũng đừng tin là các chương trình viết bằng VB sau khi thoát khỏi chương trình sẽ tự động giải phóng resources. Hãy cứ lập trình theo phong cách chuyên nghiệp.
Ví dụ:
If Not objObject Is Nothing Then
'// Nếu có thể close được thì close object (ví dụ, object là recordset, connection, v.v...)
If objObject.Open Then objObject.Close '// Tùy theo loại object mà viết các phương thức tương ứng
If Not objObject Is Nothing Then Set objObject = Nothing
'//
Chú ý: Tại sao lại cứ phải check các trang thái open, nothing trước khi thực hiện: Vì những lệnh check đó thường sẽ làm code chạy nhanh hơn (trong trường hợp phủ định của lệnh check, như ở trên, trường hợp đó là Object đang close hay là nothing sẵn rồi thì nó sẽ bỏ qua lệnh close hay set = nothing - những lệnh này thường chậm hơn lệnh kiểm tra). Ai đã từng viết object như activeX control... rồi thì thì sẽ hiểu cách giải thích (hơi dài dòng) trên

.
End If
5. Suggestion: Trong mọi trường hợp nên viết Error handle, Comments phải đầy đủ cho từng dòng lệnh (nếu có thể) hoặc từng Code Block...
6. Nên "
đóng gói" (viết thành object, thủ tục, hàm dùng chung,...) tất cả những gì bạn thấy có thể reuse lại được.
7. Tài liệu hóa nếu có thể
---------------------------
Trên đây chỉ là một vài chia sẻ kinh nghiệm viết code với các bạn. Hy vọng các bạn có thể viết nhiều chương trình với những dòng code thật "đẹp"