User form và các controls
Bài này viết cho những ai chưa biết hoặc muốn biết về user form một cách căn bản, và cả những người đã từng tạo form những bỏ qua lý thuyết rất căn bản, nên form chạy bị lỗi, hoặc chỉ dùng cho mỗi 1 tình huống cụ thể.User form bao gồm một nền chính và các thành phần bên trên gọi là các controls. Bản thân user form và các controls của nó có những thuộc tính (properties) và phương thức tác động (methods). Ngoài ra mỗi đối tượng như vậy sẽ có những sự kiện riêng biệt (events), và ứng với những sự kiện đó sẽ có những thủ tục cho từng sự kiện.
1. User form
Trên cửa sổ VBA, nhấn chuột phải vào 1 workbook và chọn Insert User form.Một user form trong tình trạng thiết kế sẽ có kèm một controls toolbox, chứa những controls thường dùng để thao tác.
a. Các thuộc tính thường dùng
- Caption
- BackColor
- Font
- ForeColor
- Height, Width
- Picture
- ShowModal
b. Các phương thức
- Show: mở form từ câu lệnh bên ngoài form, cú phápUserForm1.Show
- Hide: Câu lệnh tạm ẩn form, thực hiện từ bên ngoài hoặc từ code của chính bên trong form, cú pháp
UserForm1.Hide, Me.Hide
- Unload: Câu lệnh đóng form, thực hiện từ bên ngoài hoặc từ code của chính bên trong form, cú pháp
Unload UserForm1, Unload Me
- Activate: Kích hoạt 1 user form đang bị ẩn hoặc đang bị che khuất bởi 1 user form khác
UserForm1.Activate
c. Các sự kiện
- Initialize: Sự kiện xảy ra trước khi vẽ form lên màn hình (draw hoặc render). Thủ tục cho sự kiện này là Private Sub UserForm_Initialize(). Thường trong sự kiện này người ta gắn những giá trị mặc định cho các textbox, hiện hoặc ẩn các control, gắn giá trị True/ False cho các control có giá trị boolean, gắn dữ liệu nguồn cho listbox, combobox, gắn caption ban đầu cho các label, button.
- KeyUp, KeyDown, KeyPress: Sự kiện nhấn phím trên bàn phím khi form đang mở. KeyPress (KeyASCII) bao gồm các phím ký tự chữ và số có phân biệt hoa thường; KeyUp, KeyDown (KeyCode) bao gồm chữ, ký số và cả các phím chức năng. Trong KeyCode, chữ hoa chữ thường cùng 1 KeyCode. Như vậy khi cần lấy sự kiện tất cả các ký tự chữ, số và ký tự đạc biệt thì sử dụng KeyPress (ASCII), còn sự kiện phím chức năng thì dùng KeyUp, KeyDown
- Tùy theo nhấn phím nào sẽ có hành động tương đương. Tuy nhiên KeyDown xảy ra trước KeyPress và trước KeyUp
- Thí dụ
Mã:
Private Sub UserForm_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Me.Caption = Chr(KeyAscii) & "(" & KeyAscii & ")"
End Sub
- Click: Sự kiện xảy ra khi click chuột vào form (chỗ trống, không click vào các controls khác)
Mã:
Private Sub UserForm_Click()
Randomize
r = Int(Rnd() * 255) ‘ lấy 1 giá trị ngẫu nhiên trong khoảng 0 ~ 255 cho màu đỏ
g = Int(Rnd() * 255) ‘ lấy 1 giá trị ngẫu nhiên trong khoảng 0 ~ 255 cho màu xanh lá
b = Int(Rnd() * 255) ‘ lấy 1 giá trị ngẫu nhiên trong khoảng 0 ~ 255 cho màu xanh dương
Me.BackColor = RGB(r, g, b) ‘ gắn màu cho nền User form bằng màu với hàm RGB khi thực hiện click chuột
End Sub
- Terminate: Sự kiện xảy ra khi đóng form bằng nút X hoặc command button
Mã:
Private Sub UserForm_Terminate()
MsgBox "Close your eyes and enjoy"
End Sub
- Sự kiện di chuyển chuột (Mouse Move), ít dùng
- Sự kiện nhấn chuột (Mouse Down và Mouse Up). Sự kiện này có tham số Button cho biết nhấn chuột trái hay phải (trái = 1, phải = 2), các tham số x và y là vị trí của con trỏ chuột trên form.
Mã:
Private Sub UserForm_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
If Button = 1 Then
MsgBox "left, x = " & X & ", y = " & Y
ElseIf Button = 2 Then
MsgBox "right"
End If
End Sub
Kết quả nhấn chuột trái:
- MouseMove
Xảy ra khi di chuyển chuột trên form. Sự kiện này rất ít dùng, chỉ dùng trong trường hợp form chỉ để nhìn không thao tác, move mouse để đóng form cho nhanh.
- Sự kiện QueryClose
Xảy ra trước khi đóng form. Sự kiện này có tham số Cancel để chặn việc đóng form. Ngoài ra còn tham số CloseMode cho biết người dùng đóng form bằng cách nào:
vbFormControlMenu | 0 | Người dùng đóng form bằng nút x |
vbFormCode | 1 | Người dùng sử dụng code để đóng form |
vbAppWindows | 2 | Người dùng tắt session window hiện tại |
vbAppTaskManager | 3 | Người dùng nhấn End task trong Task manager |
Ứng dụng: Không cho đóng form bằng nút x (vô hiệu hóa nút x), mà phải dùng cách khác đã quy định.
Mã:
Private Sub UserForm_Click()
Unload Me
End Sub
______________________
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = 0 Then Cancel = True
Me.Caption = "The Close box won't work! Click me!"
End Sub
Nếu nhấn x thì CloseMode = 0, Cancel sẽ = True và ngăn cản đóng form, và hiện thông báo trên tiêu đề form.
Nếu click trên form thì chạy thủ tục Click, CloseMode = 1 và đóng bình thường.
Lần chỉnh sửa cuối: