объектный массив или набор в VBA Excel

я хотел бы иметь массив объектов в Excel, которые называют один обработчик событий. конкретно у меня есть несколько кнопок, которые выполняют ту же функцию к различным ячейкам, и удерживаться от дублирования кода, я хотел бы, просто ссылаются на эти объекты кнопки через индекс (как, я раньше делал в VB 6.0).... путем нахождения, какая кнопка была нажата, я хотел бы заполнить определенные ячейки и т.д., таким образом, вопрос: массив кнопок в Excel VBA? Я сделал немного работы в VB.net, где я использовал наборы, и это работало хорошо..., но кажется, что я не могу сделать этого в VBA.

10
задан driveguy 15 December 2009 в 19:24
поделиться

2 ответа

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
1
ответ дан 4 December 2019 в 03:39
поделиться

В 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 и, возможно, еще что-нибудь.

4
ответ дан 4 December 2019 в 03:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: