anhtuan1066
Thành viên gạo cội
- Tham gia
- 10/3/07
- Bài viết
- 5,802
- Được thích
- 6,911
Tôi đang trong những bước đầu tiên nghiên cứu về Class Module nên sẽ viết theo sự hiểu biết của tôi. Nếu có sai sót, mong các cao thủ bổ sung thêm
Mục đích của bài viết này là:
- Tạo sự kiện người dùng khi mà các sự kiện cung cấp sẳn không đáp ứng được nhu cầu
- Khi mà chúng ta có nhu cầu "thu gom" tất cả các code của 1 số object (có cùng chức năng) về chung thành 1 code
------------------------------------------------------------------------------------------------
Giả định tình huống thế này:
- Tôi có 1 Workbook bao gồm 9 sheet, trong đó có 1 sheet Menu và 8 sheet con
- Tại sheet Menu, tôi vẽ 8 CommandButton để link đến 8 sheet con
- Tại các sheet con, mỗi sheet tôi vẽ 1 CommandButton để link đến sheet Menu
Thông thường bài toán này người ta sẽ viết cho mỗi CommandButton 1 đoạn code riêng lẻ. Như vậy, nếu số lượng object càng nhiều thì code của chúng ta sẽ trở nên dài dòng
Đàng nào thì các đoạn code ấy cũng có chung 1 mục đích... Vậy liệu có cách nào gom toàn bộ chúng thành 1 code duy nhất hay không? Câu trả lời là: Hoàn toàn có thể nếu biết dùng đến Class Module
Chúng ta cùng tiến hành giải pháp nhé
- Cứ cho rằng toàn bộ các CommandButton đã được vẽ xong
- Chuỗi mà ta gõ trên Caption của CommandButton chính là tên của sheet cần link
Vậy code của chúng ta sẽ bao gồm 2 phần
1> Trong Class Module
Hãy chèn 1 Class Module và nhớ đặt tên cho nó (trong file tôi đặt tên là MyClass) rồi đặt vào nó đoạn code này:
2> Trong Module
Chèn 1 Module và đặt vào nó đoạn code này:
Vậy là xong! Hãy chạy Autpen rồi nhấn nút thử
Nếu có ý định cho hiện 1 sheet duy nhất, các sheet khác ẩn thì sửa lại code trong Class Module như sau:
Cũng chạy Autpen và thử bấm các nút
Điểm mấu chốt mà ta cần ghi nhớ trong toàn bộ code chỉ có 2 đoạn:
Public WithEvents CB As CommandButton (Khai báo)
và
Set Button(i).CB = Obj.Object (thiết lập để chúng "bắt tay" nhau)
Không có chúng thì toàn bộ sẽ "tan rã"
------------------------------------------------------------------------------------------------
Tóm lại công việc của chúng ta chỉ là:
- Đặt 2 đoạn code vào đúng vị trí
- Đặt tên cho Class Module
- Vẽ các CommandButton và gõ tên sheet cần link vào caption của chúng
- Chạy Autpen để khởi động việc "thu gom"
Điểm thú vị ở đây là:
- Chỉ có các CommandButton (thuộc ActiveX Control) mới bị ảnh hưởng bởi code này (các object khác hoàn toàn không bị ảnh hưởng)
- Với các CommandButton, chỉ cái nào có caption là tên sheet mới bị ảnh hưởng bởi code này
------------------------------------------------------------------------------------------------
Xin lưu ý với các bạn rằng:
- Việc dùng CommandButton để link với các sheet không phải là mục đích chính của bài viết này (chỉ lấy ví dụ để minh họa), vì thế mà tôi đã không đặt nó vào chung với topic: Tạo nút nhấn để link đến các sheet
- Mục đích chính của bài viết này là hướng dẩn cách dùng Class Module để tự tạo 1 sự kiện người dùng
- Code này chỉ thuộc dạng cơ bản, có thể tùy biến đề áp dụng cho rất nhiều bài toán khác
------------------------------------------------------------------------------------------------
Chỉ với 1 bài viết thì chưa đủ để nói về EventClass, vậy nên rất mong các cao thủ khác cùng góp sức hoàn thiện bài viết này
Mục đích của bài viết này là:
- Tạo sự kiện người dùng khi mà các sự kiện cung cấp sẳn không đáp ứng được nhu cầu
- Khi mà chúng ta có nhu cầu "thu gom" tất cả các code của 1 số object (có cùng chức năng) về chung thành 1 code
------------------------------------------------------------------------------------------------
Giả định tình huống thế này:
- Tôi có 1 Workbook bao gồm 9 sheet, trong đó có 1 sheet Menu và 8 sheet con
- Tại sheet Menu, tôi vẽ 8 CommandButton để link đến 8 sheet con
- Tại các sheet con, mỗi sheet tôi vẽ 1 CommandButton để link đến sheet Menu
Thông thường bài toán này người ta sẽ viết cho mỗi CommandButton 1 đoạn code riêng lẻ. Như vậy, nếu số lượng object càng nhiều thì code của chúng ta sẽ trở nên dài dòng
Đàng nào thì các đoạn code ấy cũng có chung 1 mục đích... Vậy liệu có cách nào gom toàn bộ chúng thành 1 code duy nhất hay không? Câu trả lời là: Hoàn toàn có thể nếu biết dùng đến Class Module
Chúng ta cùng tiến hành giải pháp nhé
- Cứ cho rằng toàn bộ các CommandButton đã được vẽ xong
- Chuỗi mà ta gõ trên Caption của CommandButton chính là tên của sheet cần link
Vậy code của chúng ta sẽ bao gồm 2 phần
1> Trong Class Module
Hãy chèn 1 Class Module và nhớ đặt tên cho nó (trong file tôi đặt tên là MyClass) rồi đặt vào nó đoạn code này:
PHP:
Public WithEvents CB As CommandButton
Private Sub CB_Click()
On Error Resume Next
Sheets(CB.Caption).Select
End Sub
Chèn 1 Module và đặt vào nó đoạn code này:
PHP:
Public Button() As New MyClass
Sub Auto_Open()
Dim i As Long, Obj As OLEObject, Ws As Worksheet
For Each Ws In ThisWorkbook.Worksheets
For Each Obj In Ws.OLEObjects
If InStr(Obj.progID, "Forms.CommandButton") Then
ReDim Preserve Button(i)
Set Button(i).CB = Obj.Object
i = i + 1
End If
Next Obj
Next Ws
End Sub
Nếu có ý định cho hiện 1 sheet duy nhất, các sheet khác ẩn thì sửa lại code trong Class Module như sau:
PHP:
Public WithEvents CB As CommandButton
Private Sub CB_Click()
Dim Sh As Worksheet
On Error Resume Next
Application.ScreenUpdating = False
Set Sh = ActiveSheet
Sheets(CB.Caption).Visible = True
Sheets(CB.Caption).Select
Sh.Visible = 2
Application.ScreenUpdating = True
End Sub
Điểm mấu chốt mà ta cần ghi nhớ trong toàn bộ code chỉ có 2 đoạn:
Public WithEvents CB As CommandButton (Khai báo)
và
Set Button(i).CB = Obj.Object (thiết lập để chúng "bắt tay" nhau)
Không có chúng thì toàn bộ sẽ "tan rã"
------------------------------------------------------------------------------------------------
Tóm lại công việc của chúng ta chỉ là:
- Đặt 2 đoạn code vào đúng vị trí
- Đặt tên cho Class Module
- Vẽ các CommandButton và gõ tên sheet cần link vào caption của chúng
- Chạy Autpen để khởi động việc "thu gom"
Điểm thú vị ở đây là:
- Chỉ có các CommandButton (thuộc ActiveX Control) mới bị ảnh hưởng bởi code này (các object khác hoàn toàn không bị ảnh hưởng)
- Với các CommandButton, chỉ cái nào có caption là tên sheet mới bị ảnh hưởng bởi code này
------------------------------------------------------------------------------------------------
Xin lưu ý với các bạn rằng:
- Việc dùng CommandButton để link với các sheet không phải là mục đích chính của bài viết này (chỉ lấy ví dụ để minh họa), vì thế mà tôi đã không đặt nó vào chung với topic: Tạo nút nhấn để link đến các sheet
- Mục đích chính của bài viết này là hướng dẩn cách dùng Class Module để tự tạo 1 sự kiện người dùng
- Code này chỉ thuộc dạng cơ bản, có thể tùy biến đề áp dụng cho rất nhiều bài toán khác
------------------------------------------------------------------------------------------------
Chỉ với 1 bài viết thì chưa đủ để nói về EventClass, vậy nên rất mong các cao thủ khác cùng góp sức hoàn thiện bài viết này