Hướng dẫn tạo userform giao diện tự tạo trong excel

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

Chủ Đề