я хотел бы иметь массив объектов в Excel, которые называют один обработчик событий. конкретно у меня есть несколько кнопок, которые выполняют ту же функцию к различным ячейкам, и удерживаться от дублирования кода, я хотел бы, просто ссылаются на эти объекты кнопки через индекс (как, я раньше делал в VB 6.0).... путем нахождения, какая кнопка была нажата, я хотел бы заполнить определенные ячейки и т.д., таким образом, вопрос: массив кнопок в Excel VBA? Я сделал немного работы в VB.net, где я использовал наборы, и это работало хорошо..., но кажется, что я не могу сделать этого в VBA.
Separate the common code into a single method and pass the cell as the parameter. Assign each button it's own event method, which in turn calls the common method with the specific cell to edit as a parameter. Something like this:
Private Sub CommonMethod(someCell as String)
' Do your stuff
Range(someCell).Value = something
End Sub
So each button could be assigned to it's own method. This is already built in so don't try to recreate it, keep it simple.
Private Sub Button1_Click()
CommonMethod("A1");
End Sub
Private Sub Button2_Click()
CommonMethod("A2");
End Sub
В 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 в параметрах измерения переменных опрашивает события командной кнопки и запускается так же, как если бы он был привязан к определенному элементу управления и в модуле пользовательской формы.
Вот что вы сделали: вы создали коллекцию для хранения экземпляров вашего пользовательского класса до тех пор, пока пользовательская форма активна. Это гарантирует, что эти экземпляры останутся в области видимости. Затем вы создали новый экземпляр класса, назначили ему определенную кнопку и сохранили его в коллекции. Вы сделали то же самое для следующей кнопки. В этом примере есть только две кнопки, но если у вас их больше, вы можете продолжать делать это, пока не закончится память.
Я создаю свойство RangeAddress в модуле пользовательского класса в качестве примера. Какая информация вам понадобится для хранения, будет зависеть от того, чего вы в конечном итоге пытаетесь достичь.
Для того, чтобы этот пример работал, вам нужно установить для свойства ShowModal пользовательской формы значение FALSE, использовать командные кнопки с именами CommandButton1 и CommandButton2, есть лист с кодовым именем Sheet1 и, возможно, еще что-нибудь.
и сохранил в коллекции. Вы сделали то же самое для следующей кнопки. В этом примере есть только две кнопки, но если у вас их было больше, вы можете продолжать делать это, пока не закончится память.В качестве примера я создаю свойство RangeAddress в модуле настраиваемого класса. Какая информация вам понадобится для хранения, будет зависеть от того, чего вы в конечном итоге пытаетесь достичь.
Для того, чтобы этот пример работал, вам нужно установить для свойства ShowModal пользовательской формы значение FALSE, использовать командные кнопки с именами CommandButton1 и CommandButton2, есть лист с кодовым именем Sheet1 и, возможно, еще что-нибудь.
и сохранил в коллекции. Вы сделали то же самое для следующей кнопки. В этом примере есть только две кнопки, но если у вас их было больше, вы можете продолжать делать это, пока у вас не закончится память.В качестве примера я создаю свойство RangeAddress в модуле пользовательского класса. Какая информация вам понадобится для хранения, будет зависеть от того, чего вы в конечном итоге пытаетесь достичь.
Для того, чтобы этот пример работал, вам нужно установить для свойства ShowModal пользовательской формы значение FALSE, использовать командные кнопки с именами CommandButton1 и CommandButton2, есть лист с кодовым именем Sheet1 и, возможно, еще что-нибудь.
В качестве примера я создаю свойство RangeAddress в модуле настраиваемого класса. Какая информация вам понадобится для хранения, будет зависеть от того, чего вы в конечном итоге пытаетесь достичь.
Для того, чтобы этот пример работал, вам нужно установить для свойства ShowModal пользовательской формы значение FALSE, использовать командные кнопки с именами CommandButton1 и CommandButton2, есть лист с кодовым именем Sheet1 и, возможно, еще что-нибудь.
В качестве примера я создаю свойство RangeAddress в модуле настраиваемого класса. Какая информация вам понадобится для хранения, будет зависеть от того, чего вы в конечном итоге пытаетесь достичь.
Для того, чтобы этот пример работал, вам нужно установить для свойства ShowModal пользовательской формы значение FALSE, использовать командные кнопки с именами CommandButton1 и CommandButton2, есть лист с кодовым именем Sheet1 и, возможно, еще что-нибудь.