Kiểm tra dữ liệu trên Userform.

Liên hệ QC

khoavu87

Vũ Trần Khoa
Tham gia
5/3/09
Bài viết
1,311
Được thích
1,769
Nghề nghiệp
Kỹ Sư Xây dựng cầu đường
Em có tạo một userform và có các texbox. Viết đoạn code để nó kiểm tra dữ liệu đầu vào nhập trên các Texbox đó, nếu ko có dữ liệu nhấn Nút Ok nó sẽ hiện lên Msgbox("Dữ liệu...."&txtctr)
Nhưng không hiểu sao đoạn code đó không chạy được, mong mọi người chỉ giáo.
 

File đính kèm

Em có tạo một userform và có các texbox. Viết đoạn code để nó kiểm tra dữ liệu đầu vào nhập trên các Texbox đó, nếu ko có dữ liệu nhấn Nút Ok nó sẽ hiện lên Msgbox("Dữ liệu...."&txtctr)
Nhưng không hiểu sao đoạn code đó không chạy được, mong mọi người chỉ giáo.
Khoa sửa lại chỗ này nhé (thêm chỗ màu đỏ í):
Mã:
If TypeOf ctr Is [COLOR=red]MSForms.[/COLOR]TextBox Then
 
Upvote 0
Em có tạo một userform và có các texbox. Viết đoạn code để nó kiểm tra dữ liệu đầu vào nhập trên các Texbox đó, nếu ko có dữ liệu nhấn Nút Ok nó sẽ hiện lên Msgbox("Dữ liệu...."&txtctr)
Nhưng không hiểu sao đoạn code đó không chạy được, mong mọi người chỉ giáo.
Sửa câu:
PHP:
If TypeOf ctr Is TextBox Then
Thành:
PHP:
If TypeOf ctr Is MSForms.TextBox Then
 
Upvote 0
Em có tạo một userform và có các texbox. Viết đoạn code để nó kiểm tra dữ liệu đầu vào nhập trên các Texbox đó, nếu ko có dữ liệu nhấn Nút Ok nó sẽ hiện lên Msgbox("Dữ liệu...."&txtctr)
Nhưng không hiểu sao đoạn code đó không chạy được, mong mọi người chỉ giáo.
Bạn sửa lại chỗ này thành
If TypeOf ctr Is MSForms.TextBox Then là được
 
Upvote 0
Em cảm ơn các Anh ạ. Làm em loay hoay mãi không ra trong khi VBA for cad thì ok.
 
Upvote 0
Nếu thay TextBox bằng ComboBox thì câu lệnh: If TypeOf ctr Is ComboBox Then lại chạy bình thường (mà không cần phải là If TypeOf ctr Is MSForms.ComboBox then)
Đố ai biết tại sao?
Ẹc...Ẹc...
 
Upvote 0
Nếu thay TextBox bằng ComboBox thì câu lệnh: If TypeOf ctr Is ComboBox Then lại chạy bình thường (mà không cần phải là If TypeOf ctr Is MSForms.ComboBox then)
Đố ai biết tại sao?
Ẹc...Ẹc...
Em nghĩ là do với đối tượng Textbox thì trên Sheet và trên Form đều có, còn đối tượng Combobox thì chỉ có ở trên Form. Do đó với đối tượng Textbox thì ta cần khai báo cho biết đây là Textbox của Sheet hay của Form, còn với Combobox thì không cần.
 
Upvote 0
Hình như ...
Một số control vẽ trên form từ Toolbox lại không phải form control, mà là ActiveX control?
Và có thể là loại khác nữa!
 
Upvote 0
Em nghĩ là do với đối tượng Textbox thì trên Sheet và trên Form đều có, còn đối tượng Combobox thì chỉ có ở trên Form. Do đó với đối tượng Textbox thì ta cần khai báo cho biết đây là Textbox của Sheet hay của Form, còn với Combobox thì không cần.
Chưa chắc à nha
Thử vẽ 1 TextBox trên Sheet, bấm Atl + F11 rồi vào Tools\References sẽ thấy mục Microsoft Form 2.0 Object Library đã được check
Đóng Excel, khởi động lại Excel và làm lại thao tác trên nhưng thay TextBox bằng ComboBox thì cũng thấy mục trên đã dược check trong Refrences
Điều này có nghĩa là dù là TextBox hay ComboBox và dù là trên Sheet hay trên form thì chúng cũng thuộc thư viện Form 2.0 Object Library
--------------------
Có 1 sự nhầm lẫn gì đó trong việc gọi tên các control...
Cái vụ này phải để Nguyễn Duy Tuân giải thích mới rõ ràng
 
Upvote 0
Chưa chắc à nha
Thử vẽ 1 TextBox trên Sheet, bấm Atl + F11 rồi vào Tools\References sẽ thấy mục Microsoft Form 2.0 Object Library đã được check
Đóng Excel, khởi động lại Excel và làm lại thao tác trên nhưng thay TextBox bằng ComboBox thì cũng thấy mục trên đã dược check trong Refrences
Điều này có nghĩa là dù là TextBox hay ComboBox và dù là trên Sheet hay trên form thì chúng cũng thuộc thư viện Form 2.0 Object Library
--------------------
Có 1 sự nhầm lẫn gì đó trong việc gọi tên các control...
Cái vụ này phải để Nguyễn Duy Tuân giải thích mới rõ ràng
Cũng lạ nhỉ? cũng công cụ trên Form mà nó dùng ở VBA for cad nó lại chạy được em đang nghĩ chắc trên Excel không dùng được là do thư viện gì đó chưa liên kết được.Không biết thế nào.
 
Upvote 0
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á.)
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom