1. Chuẩn bị sẵn userform
Việc đầu tiên là bạn cần chuẩn bị sẵn userfom.
Ví dụ bạn có 1 bảng dữ liệu và 1 userform tương ứng như sau:
Mục đích của chúng ta là khi double click vào 1 dòng bất kỳ trong bảng dữ liệu (trừ dòng tiêu đề) thì sẽ mở userform1 lên, và dữ liệu tại vị trí dòng double click đó sẽ được tự động lấy vào vị trí các textbox tương ứng trong userform.
Hãy cùng tìm hiểu cách làm ở những phần sau đây nhé.
2. Viết lệnh lấy dữ liệu vào Userform
Trong VBA có 1 đối tượng là ActiveCell. Đối tượng này được hiểu là vị trí đang được người dùng chọn, tác động.
Theo logic chúng ta sẽ có là:
- Textbox Ngày sẽ lấy dữ liệu theo cột Ngày (cột A), dòng là tại vị trí dòng của ActiveCell
- Textbox Loại sẽ lấy dữ liệu theo cột Loại (cột B), dòng là tại vị trí dòng của ActiveCell
- Textbox Tên mặt hàng sẽ lấy dữ liệu theo cột Tên mặt hàng (cột C), dòng là tại vị trí dòng của ActiveCell
- Textbox Số lượng sẽ lấy dữ liệu theo cột Số lượng (cột D), dòng là tại vị trí dòng của ActiveCell
Bây giờ sẽ không xét vị trí cột của ActiveCell, vì cột luôn xác định được cụ thể, trong khi ActiveCell có thể là vị trí bất kỳ, chỉ có dòng là giống nhau giữa các vị trí.
Logic trên được biểu diễn bằng câu lệnh VBA như sau:
3. Tạo sự kiện khi sử dụng double click trong sheet
a. Phân tích yêu cầu và tính logic
Trong đối tượng worksheet có rất nhiều sự kiện, một trong số đó là sự kiện Before DoubleClick. DoubleClick nghĩa là trước khi hoàn thành thao tác double click trong Sheet thì Excel sẽ chạy 1 vài câu lệnh macro để khi hoàn tất thao tác double click thì cũng hoàn thành câu lệnh macro đó. Kết quả là khi double click chuột thì những điều bạn mong muốn sẽ được thực hiện một cách tự động.
Ở đây, chúng ta sẽ gán macro Mở userform (Userform1.Show) vào sự kiện này.
Tuy nhiên có 1 lưu ý mà bạn cần phải nắm được đó là: Chỉ double click trong phạm vi bảng dữ liệu thì mới mở userform, còn ngoài phạm vi này (bao gồm cả dòng tiêu đề) thì sẽ không mở userform.
Với yêu cầu trên thì chúng ta phải có 1 câu lệnh để biện luận xem phạm vi bảng tính tới đâu.
- Số cột: Từ cột A tới cột D
- Số dòng: bắt đầu từ dòng 2, kết thúc tới dòng cuối cùng có dữ liệu trong bảng
Như vậy ở đây chúng ta phải xét tới 1 biến là biến dòng cuối của bảng là dòng nào.
b. Lệnh tìm dòng cuối trong bảng dữ liệu
Lệnh tìm dòng cuối là câu lệnh đặc trưng và rất thường sử dụng trong lập trình VBA. Câu lệnh như sau:
Sheet_Name.Cells(Rows.Count, Column_Num).End(xlUp).Row
- Sheet_name: vùng bảng đó nằm ở Sheet nào (thay đổi tên Sheet)
- Rows.count: đếm các dòng chứa giá trị
- Column_num: xét trong cột nào (thay đổi vị trí cột)
- End(xlUp).Row: xét từ dòng cuối cùng trong sheet, tính ngược dần tới vị trí dòng cuối có dữ liệu.
Như vậy viết câu lệnh tìm dòng cuối trong trường hợp này có thể viết như sau:
Xét dòng cuối tại Sheet1, cột A
c. Lệnh gọi userform trong vùng bảng dữ liệu
Câu lệnh giới hạn như sau:
Câu lệnh nghĩa là:
- If not : nếu không phải (xét cả câu lệnh thì là: nếu không phải dữ liệu trong vùng được chọn từ A2 tới dòng cuối cột D là không có gì => Phủ định của phủ định => Hiểu ngược lại là nếu có tác động vào vùng A2 tới dòng cuối cột D)
- Intersect(Range(“A2”, “D” & DongCuoi), Range(Target.Address)): giao nhau, giao giữa vùng A2:D&DongCuoi với vùng được chọn Target.Address. Câu này hiểu là chọn vào vùng A2:D&Dongcuoi
- Is Nothing: là 1 mệnh đề phủ định. Kết hợp với IF not ở trên để hoàn thành 1 mệnh đề phủ định của phủ định.
- Userform1.Show là câu lệnh gọi ra Userform1. Khi gọi ra Userform1 thì tương ứng với đó vị trí được double click chính là Activecell.
Như vậy bài viết trên đã hướng dẫn bạn đọc cách mở userform bằng thao tác double click VBA Excel. Hi vọng bài viết sẽ có ích cho các bạn trong việc thành thạo các thủ thuật của Excel