2009-12-15 54 views
9

tôi muốn có một mảng đối tượng trong excel gọi một trình xử lý sự kiện. Cụ thể là tôi có nhiều nút thực hiện chức năng tương tự cho các ô khác nhau và giữ mã trùng lặp Tôi chỉ muốn tham khảo các đối tượng nút này qua chỉ mục (như tôi đã từng làm trong VB 6.0) .... bằng cách tìm nút nào đã được nhấp vào Tôi muốn cư các tế bào cụ thể vv vì vậy câu hỏi là: một loạt các nút trong VBA excel? Tôi đã làm một công việc nhỏ trong VB.net, nơi tôi đã sử dụng các bộ sưu tập, và nó hoạt động tốt ... nhưng có vẻ như tôi không thể làm điều đó trong VBA.mảng hoặc bộ sưu tập đối tượng trong VBA Excel

Trả lời

1

Tách mã chung thành một phương thức và chuyển ô làm tham số. Chỉ định mỗi nút là phương thức sự kiện riêng của nó, lần lượt gọi phương thức chung với ô cụ thể để chỉnh sửa dưới dạng tham số. Một cái gì đó như thế này:

Private Sub CommonMethod(someCell as String) 
    ' Do your stuff 
    Range(someCell).Value = something 
End Sub 

Vì vậy, mỗi nút có thể được gán cho phương pháp riêng của nó. Điều này đã được xây dựng nên không cố gắng tạo lại nó, giữ nó đơn giản.

Private Sub Button1_Click() 
    CommonMethod("A1"); 
End Sub 

Private Sub Button2_Click() 
    CommonMethod("A2"); 
End Sub 
3

Không có mảng điều khiển nào trong VBA như trong VB. Đối với các điều khiển nhất định, bạn có thể tạo một lớp tùy chỉnh để xử lý các sự kiện. Ví dụ, giả sử bạn có một userform với hai nút lệnh. Trong mô-đun userform, đặt mã này

Private mcolEventButtons As Collection 

Private Sub UserForm_Initialize() 

    Dim clsEventButton As CEventButton 

    Set mcolEventButtons = New Collection 

    Set clsEventButton = New CEventButton 
    Set clsEventButton.EventButton = Me.CommandButton1 
    clsEventButton.RangeAddress = "A1" 
    mcolEventButtons.Add clsEventButton, Me.CommandButton1.Name 

    Set clsEventButton = New CEventButton 
    Set clsEventButton.EventButton = Me.CommandButton2 
    clsEventButton.RangeAddress = "A10" 
    mcolEventButtons.Add clsEventButton, Me.CommandButton2.Name 

End Sub 

Sau đó tạo một mô-đun lớp tùy chỉnh tên CEventButton và đặt mã này

Private WithEvents mctlEventButton As MSForms.CommandButton 
Private msRangeAddress As String 

Public Property Set EventButton(ctlButton As MSForms.CommandButton) 

    Set mctlEventButton = ctlButton 

End Property 

Public Property Get EventButton() As MSForms.CommandButton 

    Set EventButton = mctlEventButton 

End Property 

Private Sub mctlEventButton_Click() 

    Sheet1.Range(Me.RangeAddress).Value = "Something" 

End Sub 

Public Property Get RangeAddress() As String 

    RangeAddress = msRangeAddress 

End Property 

Public Property Let RangeAddress(ByVal sRangeAddress As String) 

    msRangeAddress = sRangeAddress 

End Property 

Từ khóa WithEvents trong các cuộc thăm dò đo kích thước biến sự kiện và cháy của CommandButton cũng giống như khi nó được gắn với một điều khiển cụ thể và trong mô-đun userform.

Đây là những gì bạn đã làm: Bạn đã tạo một Bộ sưu tập để giữ các phiên bản của lớp tùy chỉnh của bạn miễn là biểu mẫu người dùng đang hoạt động. Điều này đảm bảo rằng những trường hợp đó nằm trong phạm vi. Sau đó, bạn tạo một thể hiện mới của lớp, gán một nút cụ thể cho nó và lưu nó vào bộ sưu tập. Bạn đã làm tương tự cho nút tiếp theo. Trong ví dụ này chỉ có hai nút, nhưng nếu bạn có nhiều hơn, bạn có thể tiếp tục làm điều này cho đến khi bạn hết bộ nhớ.

Tôi tạo thuộc tính RangeAddress trong mô-đun lớp tùy chỉnh làm ví dụ. Những thông tin bạn cần để lưu trữ sẽ phụ thuộc vào những gì bạn đang cố gắng hoàn thành. Để ví dụ này hoạt động, bạn cần đặt thuộc tính ShowModal của biểu mẫu người dùng thành FALSE, phải có các nút lệnh có tên CommandButton1 và CommandButton2, có một trang tính có tên mã là Sheet1 và có thể một số nội dung khác.

Các vấn đề liên quan