В VBA нет управляющих массивов, как в VB. Для определенных элементов управления вы можете создать собственный класс для обработки событий. Например, предположим, что у вас есть пользовательская форма с двумя командными кнопками. В модуле userform введите этот код
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 в измерении переменных опрашивает события и запускает команду, как если бы она была привязана к определенному элементу управления и в модуле пользовательской формы.
Вот что вы сделали: вы создали коллекцию для хранения экземпляров вашего пользовательского класса, пока пользовательская форма активна. Это гарантирует, что эти экземпляры остаются в области видимости. Затем вы создали новый экземпляр класса, присвоили ему определенную кнопку и сохранили его в коллекции. Вы сделали то же самое для следующей кнопки. В этом примере есть только две кнопки, но если бы у вас было больше, вы могли бы продолжать делать это, пока не закончится память.
Я создаю свойство RangeAddress в модуле пользовательского класса в качестве примера. Какая информация вам потребуется для хранения, будет зависеть от того, чего вы в конечном итоге пытаетесь достичь.
Чтобы этот пример работал, вам нужно установить для свойства ShowModal пользовательской формы значение FALSE, кнопки команд с именами CommandButton1 и CommandButton2, иметь лист с кодовым именем Sheet1 и, возможно, некоторые другие вещи.