Hướng dẫn cách mở userform bằng thao tác double click VBA Excel

Chia sẻ bài viết này:
  •  
  •  
  •  
  •  
  •  
  •  
  •   
  •   

Khi sử dụng phần mềm hoặc một chương trình, có một thao tác khiến tôi rất thích dùng đó là bấm double click chuột tại 1 vị trí nhất định sẽ tự động hiện lên 1 form để sửa chữa, cập nhật lại dữ liệu. Sau đây tôi sẽ hướng dẫn các bạn cách làm đó trong VBA Excel.

1. Chuẩn bị sẵn userform

Tất nhiên là chúng ta cần phải có sẵn userform từ trước rồi. Và các bạn hãy tự chuẩn bị sẵn 1 userform nhé. Nếu chưa biết cách tạo userform thì tham khảo bài viết:

Cách tạo form nhập liệu đơn giản trong VBA Excel

Giả sử chúng ta 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.

Nghe thật hấp dẫn phải không nào? Hãy xem chúng ta sẽ làm việc đó thế nào 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

Ở đây chúng ta sẽ không xét vị trí cột của ActiveCell, bởi 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

Sự kiện này được hiểu 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à bạn sẽ thấy 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.

Trong trường hợp này, chúng ta sẽ gán macro Mở userform (Userform1.Show) vào sự kiện này.

Nhưng có 1 lưu ý mà ngay từ ban đầu đã nói rõ: 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

Nếu bạn đã tìm hiểu về VBA thì hẳn bạn phải biết về câu lệnh tìm dòng cuối. Đây 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 của chúng ta như sau:

Câu lệnh trên được hiểu 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.

Không khó phải không nào. Tôi tin rằng khi bạn đã hiểu toàn bộ nội dung trên và thực hành nhiều thì bạn sẽ thấy việc này trở nên rất đơn giản mà lại có hiệu quả rất  lớn.

Các bạn có thể tải về file mẫu tại địa chỉ: http://bit.ly/2sU3TLf

Để tìm hiểu thêm nhiều kiến thức về VBA, mời bạn tham dự khóa học VBA101 – Tự động hóa Excel với lập trình VBA. Đây là khóa học rất hữu ích dành cho bạn: Ngoài kiến thức về kỹ thuật bẫy lỗi trong VBA chúng ta còn được học thêm rất nhiều kiến thức khác về VBA, ứng dụng VBA vào công việc. Hãy cùng khám phá nào:


Chia sẻ bài viết này:
  •  
  •  
  •  
  •  
  •  
  •  
  •   
  •