2009-12-15 650 views
9

我想在Excel中有一個調用一個事件處理程序的對象數組。具體來說,我有多個按鈕,它們對不同的單元格執行相同的功能,爲了避免重複代碼,我希望通過索引(像我以前在VB 6.0中做的那樣)簡單地引用這些按鈕對象....通過查找哪個按鈕被點擊我想填充特定的單元格等,所以問題是:在Excel VBA按鈕數組?我在VB.net中做了一些工作,我在那裏使用了集合,並且運行得很好......但是看起來我不能在VBA中這樣做。在VBA中的對象數組或集合Excel

回答

1

將公共代碼分隔成單個方法並傳遞單元格作爲參數。爲每個按鈕分配它自己的事件方法,然後調用與特定單元格共同的方法作爲參數進行編輯。類似這樣的:

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

因此,每個按鈕可以分配給它自己的方法。這已經內置,所以不要試圖重新創建它,保持簡單。

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

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

VBA中沒有像VB中那樣的控件數組。對於某些控件,您可以創建一個自定義類來處理事件。例如,假設你有一個帶兩個命令按鈕的用戶窗體。在用戶窗體模塊,把這段代碼

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 

然後創建一個名爲CEventButton自定義類模塊,並把這個代碼

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 

可變尺寸民調WithEvents關鍵字的命令按鈕的事件和火災,就好像它被綁定到特定的控件和用戶窗體模塊中。

以下是您所做的:只要用戶表單處於活動狀態,就創建了一個Collection來保存自定義類的實例。這確保這些實例保持在範圍內。然後,您創建了該類的新實例,爲其指定了一個特定的按鈕,並將其保存在集合中。你爲下一個按鈕做了同樣的事情。在這個例子中只有兩個按鈕,但是如果你有更多的按鈕,你可以繼續這樣做,直到內存不足。

我在自定義類模塊中創建一個RangeAddress屬性作爲示例。你需要存儲什麼信息取決於你最終想要完成什麼。

對於這個例子的工作,你需要將用戶窗體的ShowModal屬性設置爲FALSE,必須命名爲CommandButton1和CommandButton2的命令按鈕,具有代碼名爲Sheet1的工作表,以及其他可能的東西。