UserForm [hay còn gọi là Form người dùng, Form tự tạo] là một đối tượng rất được ưa thích sử dụng khi chúng ta lập trình VBA trong Excel. UserForm giúp tạo ra 1 mẫu bảng được thiết kế tùy thích theo nhu cầu của người dùng, giúp cho việc nhập dữ liệu, quản lý dữ liệu trong Excel trở nên dễ dàng hơn rất nhiều. Sau đây Học Excel Online sẽ hướng dẫn các bạn cách tạo UserForm trong VBA Excel chi tiết nhất. Các bước thực hiện như sau:
1. MỞ CỬA SỔ VBA TRONG EXCEL
Userform được thiết kế và quản lý trong môi trường VBA, do đó chúng ta cần phải biết cách mở cửa sổ VBA trong Excel. Điều này đồng nghĩa với việc file Excel của chúng ta sẽ phải lưu dưới dạng đuôi file chứa macro.
Ngoài ra còn 1 lưu ý nữa là bộ cài Microsoft Office của bạn phải chắc chắn là có thể sử dụng được VBA. Thông thường hầu hết các phiên bản Office đều có sẵn VBA, tuy nhiên đặc biệt với bộ Office 2007 trong một số máy tính không kèm theo VBA. Do đó các bạn cần kiểm tra lại xem máy tính của mình có sẵn sàng để sử dụng VBA không nhé.
Có 2 cách để mở cửa sổ VBA là:
- Sử dụng tổ hợp phím tắt Alt + F11
- Mở Visual Basic từ thẻ Developer trên thanh công cụ
Giao diện cửa sổ VBA được mở như sau:
2. CÁCH THÊM MỚI 1 USERFORM / TẠO MỚI 1 USERFORM
Để tạo mới 1 UserForm, các bạn đưa chuột vào trong vùng cửa sổ Project – VBAProject [bên tay trái] và bấm chuột phải, chọn tới mục Insert [thêm, chèn] => Chọn UserForm
Sau khi Insert/UserForm thành công, chúng ta sẽ tạo được 1 UserForm có tên là UserForm1 như hình sau:
Khi ta muốn tạo ra file excel cho nhiều người dùng, trong đó có người nước ngoài thì muốn có hiển thị 2 ngôn ngữ. Do diện tích form có giới hạn nên không phải lúc nào cũng có thể tạo label 2 ngôn ngữ như sau:
Những tiêu đề nhỏ như sau lại càng không thể:
Hãy làm 1 cách chuyên nghiệp: Cho phép người dùng chọn ngôn ngữ hiển thị, và code căn cứ vào ngôn ngữ được chọn để thay đổi tất cả caption của tất cả các control hiển thị. Bao gồm:
- Form title
- Label
- Frame
- Option button
- Checkbox
- Command button
Tạo 1 tự điển Anh Việt
Trên sheet, hãy tạo 1 tự điển 2 cột: 1 cột tiếng Anh và 1 cột tiếng Việt tương đương. Bên phải bỏ trống không được làm gì. Cột tiếng Anh liệt kê hết các caption có trên tất cả các form, không trùng. Cột tiếng Việt là các hiển thị tương đương bằng tiếng Việt.
Vùng này đặt 1 name động co giãn 2 chiều. Chiều dọc có thể thêm dòng dữ liệu, chiều ngang có thể thêm ngôn ngữ thử 4, thứ 5.
Tạo 1 form chuyển đổi ngôn ngữ
Gồm 1 combobox chọn ngôn ngữ và 1 nút Apply
Khi nhấn nút Apply, lưu 1 giá trị của combobox xuống sheet
Mã:
Private Sub BtnClose_Click[]
Sheet2.[B1].Value = Me.ComboBox1.ListIndex
Unload Me
End Sub
Giá trị ô B1 này sẽ dùng để xác định ngôn ngữ và tìm tên tiếng Việt tương ứng tiếng Anh.
Thiết kế các user form
Vẽ các user form như hướng dẫn ở trên, caption các control tất cả là tiếng Anh. Viết code đến khi hoàn thiện.
Viết trong Module:
Viết 1 hàm lấy caption đúng ngôn ngữ
Mã:
Function GetLg[FindCap As String] As String
CurrLang = Sheet2.[B1].Value
GetLg = Sheet2.Range["EVDictionary"].Find[FindCap].Offset[0, CurrLang].Value
End Function
Với mỗi caption tiếng Anh sẽ tìm được 1 chuỗi tiếng Việt tương ứng, hoặc để nguyên nếu ngôn ngữ chọn là tiếng Anh. Biến Current language đọc ở ô B1 [là 1 con số đã được gán từ form chuyển đổi ngôn ngữ]
Viết 1 thủ tục dùng chung, có tham số truyền là Userform. Thủ tục này duyệt tất cả control để xét control nào có caption thì chuyển ngôn ngữ đúng như ngôn ngữ chọn. [chuyển bằng hàm GetLg]. Có thể chuyển ngôn ngữ cho cả controlTipText.
Mã:
Sub ApplyLanguage[SForm]
Dim Ctrl As Control
With SForm
.Caption = GetLg[.Caption]
For Each Ctrl In .Controls
If Ctrl.ControlTipText "" Then Ctrl.ControlTipText = GetLg[Ctrl.ControlTipText]
If TypeOf Ctrl Is msforms.CommandButton Or _
TypeOf Ctrl Is msforms.Label Or _
TypeOf Ctrl Is msforms.Frame Or _
TypeOf Ctrl Is msforms.CheckBox Or _
TypeOf Ctrl Is msforms.OptionButton Then
Ctrl.Caption = GetLg[Ctrl.Caption]
End If
Next
End With
End Sub
Thêm lệnh cho các form
Mỗi user form, trong sự kiện Initialize thêm 1 câu lệnh ApplyLanguage Me
Mã:
Private Sub UserForm_Initialize[]
HideUnhide
ApplyLanguage Me
CalSquare = True
Shape1 = True
End Sub
Trường hợp đặc biệt
Các trường hợp label có caption phụ thuộc vào control khác, thì thay vì gán caption mới, hãy gán GetLg[“Caption mới”]
Mã:
Sub TwoDimension[]
Shape1.Caption = GetLg["Rectangle"]
Shape2.Caption = GetLg["Round"]
Shape3.Caption = GetLg["Square shape"]
End Sub
Trường hợp gán caption ngay khi mở form cũng vậy:
Mã:
Private Sub UserForm_Initialize[]
Me.LblTieude.Caption = GetLg[Sheet1.Range["PNK"]]
ApplyLanguage Me
Me.OptPNhap = True
End Sub
Trường hợp message box cũng cứ ghi vào tự điển và GetLng
Mã:
Private Sub UserForm_QueryClose[Cancel As Integer, CloseMode As Integer]
If CloseMode = 0 Then
MsgBox GetLg["Finish your work and click Close button"], , GetLg["Close form fail"]
Cancel = True
End If
End Sub
Kết quả:
Cả tooltip cũng tiếng Việt theo tự điển
Thông báo tiếng Việt cũng cho vào tự điển:
Hiển thị dữ liệu đa ngôn ngữ
Nếu dữ liệu có thêm cột tiếng Anh kế bên cột tiếng Việt, thậm chí còn có thể hiển thị theo ngôn ngữ đã chọn. Thí dụ danh mục khách hàng:
Code như sau:
Mã:
Private Sub UserForm_Initialize[]
ApplyLanguage Me
If Sheet2.[B1].Value = 0 Then
Me.CbCustomer.BoundColumn = 1
Me.CbCustomer.ColumnWidths = "200;0;0;0"
Else
Me.CbCustomer.BoundColumn = 2
Me.CbCustomer.ColumnWidths = "0;200;0;0"
End If
End Sub
Lấy đủ các cột A, B , C, D nhưng nếu tiếng Anh thì Bound column là cột 1, ngược lại là cột 2. Column with thì nếu không chọn sẽ bằng 0, chọn sẽ bằng 200