Cách sử dụng biến đối tượng trên Userform
Nói về Controls chúng ta phân biệt 2 loại: Built-in Controls và ActiveX Controls.
Built-in Controls - Các controls có sẵn trong Excel khi khởi động. Các controls mà hình dáng của nó giống trên Userform:
Button
Buttons
CheckBox
CheckBoxes
DropDown - Giống ComboBox trên Userform
DropDowns
EditBox - Giống TextBox trên Userform
EditBoxes
GroupBox
GroupBoxes
Label
Labels
ListBox
ListBoxes
OptionButton
OptionButtons
Picture
Pictures
TextBox
TextBoxes
Các controls trên được sử dụng trong Dialog Sheet. Cụ thể đối tượng DialogSheet sẽ sử dụng (chứa) các controls này!
ActiveX Controls - Các controls có trong các thư viên bên ngoài (*.dll, *.ocx) được tự động hoặc phải tự thêm vào. Các controls này được các cá nhân hay các công ty lập trình ra nó bằng các ngôn ngữ lập trình khác nhau. Trong VBA ngầm định sử dụng ActiveX Controls trong thư viện FM20.dll - Microsoft Form 2.0 Object Library. Các controls có trong thư viện này là:
CheckBox
ComboBox
CommandButton
Control
Controls
Frame
Image
Label
ListBox
MultiPage
OptionButton
Page
Pages
ScrollBar
SpinButton
Tab
Tabs
TabStrip
TextBox
ToggleButton
UserForm
Khi chúng ta chèn một control (có trong danh sách trên) từ menu Excel hay trong VBA chúng ta chèn Userform thì lập tức thư viện FM20.dll được nhúng vào. Trong VBA, chúng ta có thể kiểm tra các thư viện được nhúng, bằng cách vào menu
Tools\References .
Khi chúng ta khai báo biến kiểu control thì phải lưu ý tên thư viện và tên của control.
Ví dụ:
Dim objEdit As TextBox
VBA sẽ hiểu TextBox là của Excel (builtin control) nên khai báo này hiểu tương đương là
Dim objEdit As Excel.TextBox
"Excel" - Tên thư viện của các đối tượng trong Microsoft Excel.
Nếu biến objEdit khai báo trên được gán cho một đối tượng TextBox trong Userform thì VBA sẽ báo lỗi sai kiểu đối tượng. Điều này là vì các control trong Userform là ActiveX Controls. Thư viện FM20.dll có tên là "MSForm".
Vậy để khai báo đối tượng dùng cho Userform thì trong kiểu đối tượng chúng ta phải chỉ ra
tên thư viện của nó.
Dim objEdit As MSForm.TextBox
Có người hỏi, tại sao khai báo
Dim objList As ComboBox vẫn chạy được trong Userform mà không cần phải
Dim objList As MSForm.ComboBox
Lý do là đối tượng ComboBox chỉ có duy nhất trong ActiveX Controls FM20.dll - "MSForm"
Như vậy, nếu một control mà tên của nó bị trùng trong các thư viện, muốn sử dụng nó trong thư viện nào thì khi khai báo phải chỉ định tên thư viện đó đứng trước.
Đối tượng TextBox đều có trong Excel và FM20.dll khi khai báo không chỉ định thư viện như
Dim objEdit As TextBox thì VBA ưu tiên lấy của Excel trước (Ưu tiên Builtin Controls).
Nói thêm về ActiveX Controls. Khi sử dụng các controls trên Userform mà chúng ta muốn sử dụng giao diện phong phú, tiện ích hay muốn đẹp hơn thì có thể dùng các ActiveX Controls:
Các ActiveX Controls của
Microsoft:
MSCOMCTL.OCX - Có TreeView, ListView, ListImage, ComboBoxImage,....Nhưng không hỗ trợ unicode, miễn phí.
comdlg32.ocx - Có các hộp thoại mở Printer, OpenFile, SaveFile, Color,....Nhưng không hỗ trợ unicode, miễn phí.
MSDatGrd.ocx - Có Grid,....Nhưng không hỗ trợ unicode, miễn phí.
Các ActiveX Controls của
BLUESOFTS:
BSAC.ocx - Có BSTreeView, BSListView, BSComboBox(Image), BSTaskPane,....Cho phép vẽ thêm đối tượng và hỗ trợ unicode, tính phí.
Còn rất nhiều các ActiveX của các cty khác cung cấp các bạn có thể tự tìm hiểu thêm trên internet.
Khi chúng ta sử dụng các ActiveX Controls trong chương trình thì khi chạy nó trên máy khác phải đảm báo máy đó cũng có các ActiveX Controls mà chương trình sử dụng nếu không nó sẽ báo lỗi. Khi lỗi để kiểm tra thư viện nào lỗi hoặc không có thì vào VBA, menu
Tools\References, mục nào có từ MISSING là ActiveX đó không có hoặc lỗi.
Có vấn đề nào các bạn chưa rõ tôi sẽ giải thích thêm sau.
(Lâu quá không viết bài dài như thế này trên GPE, thấy lâu quá.)