Kiến thức UserForm cơ bản

1. UserForm là gì?
Nói đơn giản, UserForm là giao diện người dùng. Tuy nhiên giao diện người dùng thì có thể thiết kế trực tiếp trên sheet của Excel. Vì vậy, định nghĩa rõ ràng hơn, UserForm là giao diện người dùng hiển thị dưới dạng DialogBox, tức là các đối tưởng nổi lên trên như dạng popup, trên đó chúng ta có thể sử dụng hay đặt tùy ý các đối tượng ActiveX Control như Label, TexBox, Button.

2. Các đối tượng Control hay dùng.
  • Label: là các nhãn, bạn có thể ghi ký tự lên đó để hiển thị ra ngoài.
  • TextBox: Là ô nhập dữ liệu. Thường được dùng để nhập đường link của một file hay folder. Hoặc để người dùng nhập thông tin tên, tuổi,... vào đó.
  • CommandButton: Là nút bấm để người dùng click vào.
  • CheckBox: Để người dùng tích chọn, có hai trạng thái On/Off hoặc True/False.
  • Option button (radio button) : Có từ 2 hạng mục trở lên và bạn muốn người dùng hãy tích chọn 1 lựa chọn trong số đó, khi đó sẽ dùng Radio Button.
  • ListBox: Hiển thị một danh sách, có thể thiết định nhiều cột và hiển thị nhiều dòng dữ liệu. Người dùng có thể chọn một hay nhiều dòng dữ liệu trong đó.
  • ComboBox: Hiển thị một danh sách để người dùng lựa chọn. Người dùng có thể nhập giá trị tùy ý vào để tìm kiếm trong danh sách của nó.

3. Tạo UserForm:
Trên VBE, bạn click chuột phải vào VBAProject, chọn Insert, chọn UserForm.
Bạn cần đăng nhập để thấy hình ảnh

Kết quả: UserForm đã được tạo ra.
Bạn cần đăng nhập để thấy hình ảnh

Từ ToolBox, bạn có thể lấy các đối tượng rồi gắp đặt lên UserForm.
Chẳng hạn ở đây tôi lấy ra Label và CommandButton (nút bấm):
Bạn cần đăng nhập để thấy hình ảnh

Để đặt tên hiển thị cho nút bấm, bạn hãy chỉnh sửa thông số Caption cho nó:
Bạn cần đăng nhập để thấy hình ảnh

Hãy nhớ thuộc tính Caption. Bạn muốn người dùng nhìn thấy gì thì nhập vào Caption nội dung như thế.

Để viết code cho nút bấm, ta làm như sau.
Bạn click chuột phải vào nút bấm và chọn View Code. (Thực ra bạn có thể double click vào nút bấm).
Bạn cần đăng nhập để thấy hình ảnh

Giao diện soạn thảo code hiện ra:
Bạn cần đăng nhập để thấy hình ảnh
Tại đây tôi viết code như sau:
Mã:
Private Sub CommandButton1_Click()
    Label1.Caption = "tuhocvba.net"
End Sub
Bây giờ để UserForm hiển thị, trên VBE bạn ấn Run hoặc phím tắt là nút F5 trên bàn phím.
Bạn cần đăng nhập để thấy hình ảnh

Giao diện UserForm hiện ra như sau:
Bạn cần đăng nhập để thấy hình ảnh

Tôi ấn vào nút Run trên UserForm, kết quả được như sau:
Bạn cần đăng nhập để thấy hình ảnh
Tên nhãn đã thay đổi, lúc này hiển thị là "tuhocvba.net".
(Còn nữa)
Nguồn tham khảo:
 
4. Hiển thị UserForm
Cấu trúc:
UserFrom.Show [Modal]
Tên tham sốCó thể giản lược không?Thuyết minh
ModalChỉ thị chế độ hiển thị UserForm

Giá trị tham số Modal được mô tả như dưới đây:
Hằng sốGiá trịÝ nghĩa
vbModal
1​
Cho tới khi UserForm được đóng thì người dùng không thể thao tác lên các đối tượng khác bên trong ứng dụng Excel (chế độ mặc định)
vbModeless
0​
Người dùng có thể thao tác với các đối tượng khác bên trong ứng dụng Excel

Ví dụ:
Mã:
Sub test_uf013_01()
    UserForm1.Show
End Sub
Dòng code số 2 ta thấy rằng người viết code đã giản lược không chỉ định tham số Modal. Vì vậy nó sẽ thuộc chế độ mặc định, tức là tham số Modal mặc định được hiểu là vbModal (1). Vì vậy, trong trường hợp này, khi UserForm hiển thị lên thì người dùng không thao tác lên trên sheet của Excel được nữa.
Bạn cần đăng nhập để thấy hình ảnh

Bây giờ tôi viết lại code như sau:
Mã:
Sub test_uf013_02()
    UserForm1.Show vbModeless
End Sub
Kết quả:
Bạn cần đăng nhập để thấy hình ảnh

Chú ý:
Nếu bạn chọn chế độ vbModal thì trong thủ tục đó, các dòng code sau sẽ bị gián đoạn cho tới khi nào UserForm được đóng.
Ví dụ:
Mã:
Sub test_uf013_03()
    UserForm1.Show
    MsgBox "test"   'hop thoai nay se khong hien ra cho toi khi Userform chua dong.
End Sub
Ngược lại, ở chế độ vbModeless thì sẽ không bị gián đoạn như trên.
Mã:
Sub test_uf013_04()
    UserForm1.Show vbModeless
    MsgBox "test"   'UserForm khong dong thi hop thoai nay van hien thi ra
End Sub
5. Đóng UserForm
Trên UserForm tôi tạo một nút bấm là CommandButton2 có Caption là "Close":
Bạn cần đăng nhập để thấy hình ảnh

Tôi viết code cho nó như sau:
Mã:
Private Sub CommandButton2_Click()
    Unload Me
End Sub
Khi UserForm hiện ra, nếu ấn vào nút bấm này thì UserForm sẽ được đóng lại.

Nguồn tham khảo:
 
5. Các sự kiện thường được dùng với UserForm
Các sự kiện dưới đây thường được dùng và những người mới học thường thắc mắc vì khó hiểu.

  • Initialize: Ngay trước khi UserForm được hiển thị, thì sự kiện này phát sinh. Chúng ta thường nạp các giá trị khởi tạo cho các biến hay đối tượng trong sự kiện này.
Nói một cách chặt chẽ thì không phải là ngay trước khi UserForm được hiển thị, mà là quá trình load UserForm thì diễn ra sự kiện này.

  • QueryClose: Ngay trước khi UserForm bị ẩn đi, thì sự kiện này phát sinh. Ví dụ khi thực thi lệnh Unload Me, hoặc khi người dùng click vào dấu X trên góc phải phía trên của UserForm.

  • Terminate: Ngay sau khi UserForm được đóng, thì sự kiện này phát sinh. Chúng ta thường gán giá trị cho các biến toàn cục hoặc ghi kết quả lên worksheet trong sự kiện này.

Cụ thể:
Bạn cần đăng nhập để thấy hình ảnh
Chúng ta sẽ tiến hành thực nghiệm như sau:
Thí nghiệm 1: Ta tạo một Label1 trên UserForm, Caption mặc định là "Label1". Đây được coi là trạng thái ban đầu.
Chúng ta không viết code gì hết.
Bạn cần đăng nhập để thấy hình ảnh

Khi cho UserForm hiện lên thì ta có kết quả như sau:
Bạn cần đăng nhập để thấy hình ảnh
-Label1 hiển thị ra là "Label1".
-Nếu ta ấn vào dấu X phía góc trên bên phải thì UserForm được đóng.

Thí nghiệm 2:
Ta viết code cho sự kiện Initialize:
Mã:
Private Sub UserForm_Initialize()
    Label1.Caption = "Dien dan VBA"
End Sub
Kết quả:
Bạn cần đăng nhập để thấy hình ảnh
-Label 1 hiển thị là "Dien dan VBA"
-Nếu ta click vào dấu X phía trên góc bên phải thì UserForm được đóng.

Thí nghiệm 3: Ta viết code cho các sự kiện QueryCloseTerminate.
Mã:
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    MsgBox "NG"
End Sub

Private Sub UserForm_Terminate()
    MsgBox "OK"
End Sub
Khi UserForm hiện ra, nếu ta click vào dấu X phía trên góc bên phải để đóng UserForm thì điều gì sẽ xảy ra?

NG => UserForm biến mất => OK

Thí nghiệm 4:
Tôi viết thêm code cho nút bấm Close (CommandButton2) như sau:
Mã:
Private Sub CommandButton2_Click()
    Unload Me
End Sub
Khi UserForm hiện ra, nếu ta click vào nút Close thì điều gì sẽ xảy ra?

NG => UserForm biến mất => OK
Nguồn tham khảo:
 
Top