2013-07-16 3 views
0

Есть ли более эффективный способ написать этот код пользовательской формы?EXCEL VBA: код пользовательской формы, улучшение повторяющегося кода

Private Sub Userform_Initialize() 

'do stuff 

    With Item1_DropDown 
     .AddItem "Monday" 
     .AddItem "Tuesday" 
     .AddItem "Wednesday" 
    End With 

    With Item2_DropDown 
     .AddItem "Monday" 
     .AddItem "Tuesday" 
     .AddItem "Wednesday" 
    End With 

    With Item3_DropDown 
     .AddItem "Monday" 
     .AddItem "Tuesday" 
     .AddItem "Wednesday" 
    End With 

'and so on, and so on. (I have about fifty of these 'With/End With' blocks) 

End Sub 

В принципе, я хотел бы иметь возможность прекратить записывать многие из этих блоков «С/с С». Прямо сейчас, у меня есть этот тип кода в четырех моих аналогично построенных пользовательских формах. Это занимает столько текстового пространства, и это кажется пустой тратой. Есть лучший способ сделать это?

Пожалуйста, знайте, что я никогда не писал модуль класса. Итак, если это требует решение, мне нужно будет в него поработать.

Спасибо,

Элиас

+1

Вывести код «addItem» в отдельный элемент, который выдает раскрывающийся список в качестве параметра. Затем вы можете вызвать это как 'PopulateList Item1_DropDown'. Вы также можете упростить, перейдя через все элементы управления формы, проверив тип каждого, а затем, если это раскрывающийся список, перейдите к вашему подпрограмму для заполнения. Если у вас есть несколько типов выпадающих списков в одной и той же форме, вы можете использовать какое-то правило именования, которое вы можете использовать для определения того, как каждый обрабатывается. –

+0

А, да; Я понимаю что ты имеешь ввиду. Я реализовал что-то подобное. В принципе, я создал цикл For, который прокручивает каждый из них с именем ComboBox и добавляет все элементы к нему. Единственное, что не касается этого, это то, что у меня есть строка кода для каждого элемента. – Elias

ответ

5

полочкам код с подпрограммами :)

Предполагая, что ваши выпадающие являются ComboBox управления формы:

Private Sub Userform_Initialize() 

    PopulateDropDown Item1_DropDown 
    PopulateDropDown Item2_DropDown 
    PopulateDropDown Item3_DropDown 

End Sub 

Sub PopulateDropDown(cb as MSForms.ComboBox) 

    With cb 
     .AddItem "Monday" 
     .AddItem "Tuesday" 
     .AddItem "Wednesday" 
    End With 

End Sub 
+0

Спасибо. Это было очень ясно и легко реализовать. На самом деле я должен был подумать об этом раньше времени. Благодарю. – Elias

+0

Вопрос №1: Почему этот код не работает, когда я помещаю аргумент в круглые скобки. Когда я пишу «PopulateDropDown (Item1_DropDown)», он ошибается («требуется объект». Но когда я удаляю те охватывающие круглые скобки, он работает? – Elias

+0

Вопрос №2: Какие еще способы сделать такую ​​вещь? – Elias

1

взгляд на создание подпрограммы для заполнения его. Подробнее здесь ...

http://www.vbforums.com/showthread.php?607511-RESOLVED-Excel-VBA-How-to-add-the-same-items-to-multiple-combo-boxes

+0

Прохладный. Спасибо за ресурс. – Elias

+0

Наблюдение №1: Из вашей связанной нити решение второго парня не работает для меня. MS Excel 2013, похоже, не распознает команду «Shapes». Ошибка компиляции: «Метод или элемент данных не найден». Хотя, если я изменю его на «Controls» и удалю этот OLE-материал, он будет работать. – Elias

+0

Если источник использует 'фигуры ', вероятно, потому, что он работает с элементами управления на листе формы элементов управления nit на userfirm –

3

Кроме того, вы можете заполнить элементы с помощью List :

Private Sub UserForm_Initialize() 
    Me.ComboBox1.List = Array("Monday", "Tuesday", "Wednesday") 
End Sub 

Вы можете определить этот массив (Variant) один раз:

Private days As Variant 

Private Sub UserForm_Initialize() 
    days = Array("Monday", "Tuesday", "Wednesday") 
    Me.ComboBox1.List = days 

End Sub 

Я хотел бы также воспользоваться Tag собственности (каждого выпадающий список), чтобы отличить тех, которые должны быть заполнены с этими значениями:

Private days As Variant 

Private Sub UserForm_Initialize() 
    Dim ctl As Control 

    days = Array("Monday", "Tuesday", "Wednesday") 

    For Each ctl In Me.Controls 
     If TypeOf ctl Is ComboBox And ctl.Tag = "days" Then 
      ctl.List = days 
     End If 
    Next ctl 

End Sub 
+0

Да, да, да. Я должен был использовать «Список» вместо «AddItem». Я действительно предпочитаю загружать массив в Combobox вместо того, чтобы делать это один за другим. В качестве моего окончательного решения я использовал цикл For, который загружает один и тот же массив во все мои ComboBoxes. Большое спасибо. – Elias

+1

Вы можете поприветствовать вас. Свойство Tag полезно также, поскольку вы можете просто установить его для тех списков, которые нужно заполнить, и не беспокоиться об их именах. –

+0

Ах. Теперь я знаю, что делает это свойство «Tag». Благодарю. Мне, возможно, придется это использовать. – Elias

Смежные вопросы