- Tham gia
- 13/6/06
- Bài viết
- 4,893
- Được thích
- 10,364
- Giới tính
- Nam
- Nghề nghiệp
- Giáo viên, CEO tại Bluesofts
Nhập liệu nâng cao trong Add-in A-Tools cho phép tìm và lọc trên sheet. Từ phiên bản v10.1 cho phép người dùng lập trình với class BSSearchEngine để tạo cửa sổ tìm kiếm này với điều khiển - control trên Userform. Tốc độ nhanh dù hàng trăm ngàn dòng. BSSearchEngine cung cấp phong phú các thủ tục, thuộc tính, sự kiện để tùy biến giao diện và hành động.
Khi cài A-Tools bạn mở tập tin tại đường dẫn dưới đây để xem mã nguồn ví dụ đầy đủ:
(*) File mã nguồn ví dụ: "C:\A-Tools\HELP & DEMOS\A-Tools VBA Programming\BSSearchEngine - Create DropDown List on control\BSSearchEngine - DropDown List.xlsm"
(*) Bài viết gốc tại đây
Chủ đề này tôi sẽ hướng dẫn từng bước lập trình từ cơ bản đến nâng cao với BSSearchEngine để tạo tính năng tìm và lọc với control trên Userform giống như chức năng Nhập liệu nâng cao trên sheet.
Video phần 01 - Tạo mục tìm và lọc đơn giản
Dòng lệnh tối thiểu để tạo cửa sổ tìm và lọc với control (các code trong chủ đề này là ngôn ngữ VBA, dùng định dạng C# để hình thức đẹp hơn)
+ Bước 1: Nhúng thư viện AddinATools.dll
Trong cửa sổ lập trình VBA, chọn Project bạn muốn lập trình, vào menu Tools -> References... tick chọn "AddinATools.dll"
+ Bước 2: Tạo Userform và chèn một control TextBox
Control phục vụ để nhập liệu là TextBox. Bạn có thể sử dụng các control ComboBox, BSEdit hoặc control nào cho phép nhập liệu.
Nhấp đúp chuột vào Userform - Vào chế độ soạn thảo code trong Userform. Copy đoạn code dưới đây dán vào.
Giải thích mã nguồn
+ BSSearchEngine: là class thực hiện tìm và lọc dữ liệu khi thay đổi dữ liệu trên control nhập liệu.
là thủ tục kết nối control nhập liệu và dữ liệu nguồn:
EditControl: có thể là: Handle of the editor control; BSAC.BSEdit Control; MSForms.TextBox, MSForms.ComboBox
DataSource: có thể là Excel Range, Array2D, ADODB.Recordset
DataHasHeaderRow: ngầm định là True, chỉ ra dữ liệu nguồn có dòng tiêu đề.
ShowHeader: ngầm định là True, chỉ ra cửa sổ tìm kiếm hiển thị dòng tiêu đề không.
Trong mã nguồn:
SE_MAHH.Create txtMAHH, Range("DMHH")
control txtMAHH sẽ được kích hoạt cửa sổ tìm kiếm và lọc, dữ liệu nguồn tại vùng NAME "DMHH" - Range("DMHH")
+ BSSearchEngine.BoundColumn: là số nguyên, ngầm định là 1 chỉ ra vị trí cột trong dữ liệu nguồn giá trị được lấy về control nhập liệu.
Muốn tương tác lệnh trong khi thực hiện các hành động thì phải lập trình sự kiện cho BSSearchEngine.
Sự kiện OnAfterUpdate() chạy ngay sau khi giá trị được cập nhật vào control. Cấu trúc sự kiện là
+ RowIndex: là mảng 1D chứa tạo độ các dòng được chọn.
+ Values: là mảng 2D chứa giá trị đã chọn từ danh sách.
+ Text: là chuỗi được nhập vào control.
Nếu bạn muốn chọn và nhận về sự kiện này nhiều dòng thì phải khai báo thuộc tính MultiInputColumns.
+ BSSearchEngine.MultiInputColumns = True cho phép chọn và nhận về nhiều dòng giá trị.
Kết quả khi chạy
Bài viết tiếp theo tôi sẽ thêm ví dụ và giải thích thêm...
Khi cài A-Tools bạn mở tập tin tại đường dẫn dưới đây để xem mã nguồn ví dụ đầy đủ:
(*) File mã nguồn ví dụ: "C:\A-Tools\HELP & DEMOS\A-Tools VBA Programming\BSSearchEngine - Create DropDown List on control\BSSearchEngine - DropDown List.xlsm"
(*) Bài viết gốc tại đây
Chủ đề này tôi sẽ hướng dẫn từng bước lập trình từ cơ bản đến nâng cao với BSSearchEngine để tạo tính năng tìm và lọc với control trên Userform giống như chức năng Nhập liệu nâng cao trên sheet.
Video phần 01 - Tạo mục tìm và lọc đơn giản
Dòng lệnh tối thiểu để tạo cửa sổ tìm và lọc với control (các code trong chủ đề này là ngôn ngữ VBA, dùng định dạng C# để hình thức đẹp hơn)
+ Bước 1: Nhúng thư viện AddinATools.dll
Trong cửa sổ lập trình VBA, chọn Project bạn muốn lập trình, vào menu Tools -> References... tick chọn "AddinATools.dll"
+ Bước 2: Tạo Userform và chèn một control TextBox
Control phục vụ để nhập liệu là TextBox. Bạn có thể sử dụng các control ComboBox, BSEdit hoặc control nào cho phép nhập liệu.
Nhấp đúp chuột vào Userform - Vào chế độ soạn thảo code trong Userform. Copy đoạn code dưới đây dán vào.
C#:
Private WithEvents SE_MAHH As BSSearchEngine
Private Sub UserForm_Initialize()
Set SE_MAHH = New BSSearchEngine 'Khởi tạo
SE_MAHH.Create txtMAHH, Range("DMHH") 'Nhập thông tin cho BSSearchEngine
SE_MAHH.BoundColumn = 1 'Ngầm định là 1 - Chỉ ra vị trí cột giá trị lấy về control
'EditControl: TextBox, ComboBox, BSEdit, Handle to Edit
'DataSource: Excel Range (high speed!)
' Array2D
' ADODB.Recordset
End Sub
'Sự kiện nhận giá trị chọn từ danh sách. Lấy giá trị trong mảng điền vào các control khác.
Private Sub SE_MAHH_OnAfterUpdate(RowIndex As Variant, Values As Variant, ByVal Text As String)
lblTenHH.Caption = Values(1, 2) 'Tên hàng
txtDVT.Text = Values(1, 4) 'Đơn vị tính
End Sub
Giải thích mã nguồn
+ BSSearchEngine: là class thực hiện tìm và lọc dữ liệu khi thay đổi dữ liệu trên control nhập liệu.
C#:
Sub BSSearchEngine.Create(EditControl, DataSource, [DataHasHeaderRow As Boolean = True], [ShowHeader As Boolean = True])
là thủ tục kết nối control nhập liệu và dữ liệu nguồn:
EditControl: có thể là: Handle of the editor control; BSAC.BSEdit Control; MSForms.TextBox, MSForms.ComboBox
DataSource: có thể là Excel Range, Array2D, ADODB.Recordset
DataHasHeaderRow: ngầm định là True, chỉ ra dữ liệu nguồn có dòng tiêu đề.
ShowHeader: ngầm định là True, chỉ ra cửa sổ tìm kiếm hiển thị dòng tiêu đề không.
Trong mã nguồn:
SE_MAHH.Create txtMAHH, Range("DMHH")
control txtMAHH sẽ được kích hoạt cửa sổ tìm kiếm và lọc, dữ liệu nguồn tại vùng NAME "DMHH" - Range("DMHH")
+ BSSearchEngine.BoundColumn: là số nguyên, ngầm định là 1 chỉ ra vị trí cột trong dữ liệu nguồn giá trị được lấy về control nhập liệu.
Muốn tương tác lệnh trong khi thực hiện các hành động thì phải lập trình sự kiện cho BSSearchEngine.
Sự kiện OnAfterUpdate() chạy ngay sau khi giá trị được cập nhật vào control. Cấu trúc sự kiện là
C#:
Sub OnAfterUpdate(RowIndex, Values, Text As String)
+ RowIndex: là mảng 1D chứa tạo độ các dòng được chọn.
+ Values: là mảng 2D chứa giá trị đã chọn từ danh sách.
+ Text: là chuỗi được nhập vào control.
Nếu bạn muốn chọn và nhận về sự kiện này nhiều dòng thì phải khai báo thuộc tính MultiInputColumns.
+ BSSearchEngine.MultiInputColumns = True cho phép chọn và nhận về nhiều dòng giá trị.
Kết quả khi chạy
Bài viết tiếp theo tôi sẽ thêm ví dụ và giải thích thêm...
Lần chỉnh sửa cuối:



