массив объектов или коллекция в VBA Excel - PullRequest
10 голосов
/ 15 декабря 2009

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

Ответы [ 2 ]

4 голосов
/ 15 декабря 2009

В 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 и, возможно, некоторые другие вещи.

1 голос
/ 15 декабря 2009

Разделите общий код на один метод и передайте ячейку в качестве параметра. Присвойте каждой кнопке свой собственный метод события, который в свою очередь вызывает общий метод с определенной ячейкой для редактирования в качестве параметра. Примерно так:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...