L oop над объектами ActiveX в Excel VBA - PullRequest
0 голосов
/ 26 марта 2020

Я новичок в VBA в Excel и испытываю некоторые трудности в понимании принципов использования циклов для объектов ActiveX в модулях и пользовательских формах. У меня есть несколько раскрывающихся списков, которые были созданы с использованием ActiveX ComboBox в электронной таблице под названием Summary. После работы с этими списками, я хотел бы сбросить их все в исходное положение и удалить содержимое из некоторых других ячеек, используя кнопку на той же странице. Таким образом, я бы смог использовать этот файл в качестве универсального шаблона. Вот короткий пример, который, кажется, работает:

Private Sub Clear_Click()
Worksheets("Summary").ComboBox1.ListIndex = 0
Worksheets("Summary").ComboBox2.ListIndex = 0
Worksheets("Summary").ComboBox3.ListIndex = 0
Worksheets("Summary").Range("B4,B6:B8,B10:B12,B18:B21").Select
Selection.ClearContents
End Sub

Но, поскольку все блоки следуют шаблону, и у меня много блоков, я пытался реализовать следующее l oop, используя OLEObjects или Controls ( L oop через Comboboxes VBA ). В обоих случаях я испытываю ошибку либо 1004, либо 438 (объект не поддерживает свойство или метод) соответственно.

Private Sub CommandButton1_Click()
Dim cmb As ComboBox, i As Integer
    For i = 1 To 3
 Sheets("Summary").Controls ("ComboBox" & i).ListIndex = 0
‘ Sheets("Summary").OLEObjects("ComboBox" & i).ListIndex = 0
    Next i

End Sub

Не могли бы вы направить меня к решению, использующему циклы, или порекомендовать лучший метод генерации отбрасывания списки шаблонов с возможностью сброса?

1 Ответ

0 голосов
/ 26 марта 2020

Думаю, вам просто нужно сослаться на свойство Object

Private Sub CommandButton1_Click()

Dim cmb As ComboBox, i As Integer, c As OLEObject

For i = 1 To 3
    Sheets("Summary").OLEObjects("ComboBox" & i).Object.ListIndex = 0
Next i

'alternative
'For Each c In Sheets("Summary").OLEObjects
'    c.Object.ListIndex = 0
'Next c

End Sub
...