For для combobox в vba excel

The syntax you are looking for is

Me.Controls.Item("ComboBox" & j)

But leaving the user controls at their random default names is bad style. Give them appropriate names right from the start, so references to them in VBA code can actually be meaningful.

Here is a more refined approach: In your UserForm that contains the color combo boxes, edit their properties and name them ColorBox_0 through ColorBox_4. Then, in the code for that UserForm, add this:

Option Explicit

Private Const COLOR_BOX_COUNT As Integer = 4  ' actually that's 5, as we count from 0

Private Sub UserForm_Initialize()
    Dim cmb As ComboBox, i As Integer

    ' Prepare color combo boxes with actual RGB color codes and names
    For i = 0 To COLOR_BOX_COUNT
        Set cmb = Me.Controls.Item("ColorBox_" & i)
        cmb.Clear
        cmb.ColumnCount = 2
        cmb.ColumnHeads = False
        cmb.ColumnWidths = "0;"
        cmb.AddItem "000000": cmb.Column(1, 0) = "Black"
        cmb.AddItem "FF0000": cmb.Column(1, 1) = "Red"
        cmb.AddItem "00FF00": cmb.Column(1, 2) = "Green"
        cmb.AddItem "0000FF": cmb.Column(1, 3) = "Blue"
        cmb.AddItem "FF00FF": cmb.Column(1, 4) = "Magenta"
        cmb.AddItem "7C2927": cmb.Column(1, 5) = "Brown"
        cmb.MatchRequired = True
        cmb.Value = cmb.List(0)  ' pre-select first entry
    Next i
End Sub

Public Function GetSelectedColors() As Long()
    Dim cmb As ComboBox, i As Integer
    Dim result(COLOR_BOX_COUNT) As Long

    For i = 0 To COLOR_BOX_COUNT
        Set cmb = Me.Controls.Item("ColorBox_" & i)
        If IsNull(cmb.Value) Then
          result(i) = -1
        Else
          result(i) = GetColor(cmb.Value)
        End If
    Next i

    GetSelectedColors = result
End Function

Note how GetSelectedColors() returns an array of colors.

There also is a helper function to convert RGB color codes to a number (colors are Long values in VBA, so if you would like to actually use the color in some way, like setting the BackColor of a control, you can actually use that value straight-away):

Function GetColor(rgb As Variant) As Long
    If Len(rgb) = 6 And IsNumeric("&H" & rgb) Then
        GetColor = CLng("&H" & Right(rgb, 2) & Mid(rgb, 3, 2) & Left(rgb, 2))
    End If
End Function

With all this, you don’t need magic constants (1 = Black, 3 = Red) anymore, the UserForm bootstraps itself on start and global variables are gone as well, which is a good thing.

The only convention I made is that a color value of -1 means that the user has not selected an item in the ComboBox. This should not happen as the ComboBoxes start with the first entry pre-selected.

Now you can get the selected colors directly

Private Sub TestButton_Click()
    Dim colors() As Long

    colors = Me.GetSelectedColors

    ' do something with them'
End Sub

Or maybe

Private Sub ColorBox_1_Change()
    ColorLabel_1.BackColor = GetColor(ColorBox_1.Value)
End Sub

Заполнение списка ComboBox из кода VBA Excel по условию в зависимости от выбранного значения в другом элементе управления ComboBox на примере ФИО.

Описание примера по заполнению списка ComboBox по условию в зависимости от выбранного значения в другом элементе управления ComboBox.

1. Исходная таблица со списками фамилий, имен и отчеств для заполнения элементов управления ComboBox из кода VBA Excel:

Таблица со списками фамилий, имен и отчеств

Список ФИО отсортирован по алфавиту, что позволит без использования дополнительного кода VBA Excel заполнить ComboBox1 только уникальными фамилиями, а также облегчит поиск фамилии для выбора в раскрывающемся списке.

2. Пользовательская форма с элементами управления ComboBox1, ComboBox2 и ComboBox3 для фамилий, имен и отчеств с соответствующими им надписями:

Пользовательская форма с элементами управления Label и ComboBox

3. Необходимо с помощью кода VBA Excel:

  • заполнить список элемента ComboBox1 уникальными фамилиями;
  • заполнить ComboBox2 именами, соответствующими выбранной фамилии в ComboBox1;
  • заполнить ComboBox3 отчествами, соответствующими выбранной фамилии в ComboBox1 и выбранному имени в ComboBox2.

Условие заполнения следующего элемента ComboBox — выбранное значение в предыдущем поле со списком.

Заполнение ComboBox1 уникальными фамилиями

Заполняем список ComboBox1 фамилиями из таблицы с помощью кода VBA Excel при открытии пользовательской формы, используя событие UserForm_Initialize:

Private Sub UserForm_Initialize()

Dim arr() As Variant, n As Long, i As Long

    With Worksheets(«Лист5»)

        ‘Определяем количество строк в таблице

        n = .Cells(1, 1).CurrentRegion.Rows.Count

        ‘Копируем фамилии из диапазона в массив

        arr = .Range(.Cells(1, 1), .Cells(n, 1)).Value

    End With

    For i = 2 To n

        ‘Условие используем для добавления в список уникальных фамилий

        If arr(i 1, 1) <> arr(i, 1) Then

            ‘Добавляем очередную фамилию в список ComboBox1

            ComboBox1.AddItem arr(i, 1)

        End If

    Next

End Sub

Фамилии из столбца таблицы копируются в массив для ускорения цикла, так как в массивах циклы работают быстрее, чем в диапазонах.

Заполнение ComboBox2 именами по условию

Когда мы выбираем значение в поле со списком ComboBox1, происходит событие ComboBox1_Change, которое будем использовать для автоматического заполнения элемента ComboBox2 именами, соответствующими выбранной фамилии:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

Private Sub ComboBox1_Change()

Dim arr() As Variant, n As Long, i As Long

    With Worksheets(«Лист5»)

        ‘Определяем количество строк в таблице

        n = .Cells(1, 1).CurrentRegion.Rows.Count

        ‘Копируем фамилии и имена из диапазона в массив

        arr = .Range(.Cells(1, 1), .Cells(n, 2)).Value

    End With

‘Очищаем ComboBox2 от элементов предыдущего списка

ComboBox2.Clear

    For i = 2 To n

        ‘Условие используем для добавления в список имен, соответствующих выбранной фамилии

        If arr(i, 1) = ComboBox1.Value Then

            ‘Добавляем очередное имя в список ComboBox2

            ComboBox2.AddItem arr(i, 2)

        End If

    Next

    With ComboBox2

        ‘Если в списке один элемент, автоматически его выбираем

        If .ListCount = 1 Then .ListIndex = 0

    End With

End Sub

Имена в ComboBox2 могут повторяться, так как отбор уникальных значений не производится. Если имена в списке ComboBox2 должны быть уникальными, можно сначала добавить их в объект Collection с отбором уникальных значений, а потом из объекта Collection скопировать имена с помощью цикла For Each ... Next в ComboBox2:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

Private Sub ComboBox1_Change()

Dim arr() As Variant, n As Long, i As Long, myCollection As New Collection, myElement As Variant

    With Worksheets(«Лист5»)

        ‘Определяем количество строк в таблице

        n = .Cells(1, 1).CurrentRegion.Rows.Count

        ‘Копируем фамилии и имена из диапазона в массив

        arr = .Range(.Cells(1, 1), .Cells(n, 2)).Value

    End With

‘Очищаем ComboBox2 от элементов предыдущего списка

ComboBox2.Clear

    For i = 2 To n

        ‘Условие используем для добавления в список имен, соответствующих выбранной фамилии

        If arr(i, 1) = ComboBox1.Value Then

            ‘Добавляем очередное уникальное имя в Collection

            On Error Resume Next

                myCollection.Add CStr(arr(i, 2)), CStr(arr(i, 2))

            On Error GoTo 0

        End If

    Next

    With ComboBox2

        ‘Заполняем список элемента ComboBox2 именами из коллекции

        For Each myElement In myCollection

            .AddItem myElement

        Next myElement

        ‘Если в списке один элемент, автоматически его выбираем

        If .ListCount = 1 Then .ListIndex = 0

    End With

End Sub

Заполнение ComboBox3 отчествами по условию

Выбор одного из элементов в ComboBox2, как и автоматический выбор единственного элемента предыдущим кодом, вызывает событие ComboBox2_Change, которое будем использовать для автоматического заполнения элемента ComboBox3 отчествами, соответствующими выбранной фамилии в ComboBox1 и выбранному имени в ComboBox2:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

Private Sub ComboBox2_Change()

Dim arr() As Variant, n As Long, i As Long

    With Worksheets(«Лист5»)

        ‘Определяем количество строк в таблице

        n = .Cells(1, 1).CurrentRegion.Rows.Count

        ‘Копируем фамилии, имена и отчества из диапазона в массив

        arr = .Range(.Cells(1, 1), .Cells(n, 3)).Value

    End With

‘Очищаем ComboBox3 от элементов предыдущего списка

ComboBox3.Clear

    For i = 2 To n

        ‘Условие для добавления в список отчеств, соответствующих выбранным фамилии и имени

        If arr(i, 1) = ComboBox1.Value And arr(i, 2) = ComboBox2.Value Then

            ‘Добавляем очередное отчество в список ComboBox3

            ComboBox3.AddItem arr(i, 3)

        End If

    Next

    With ComboBox3

        ‘Если в списке один элемент, автоматически его выбираем

        If .ListCount = 1 Then .ListIndex = 0

    End With

End Sub

Отчества в ComboBox3 повторяться не могут, так как это означало бы, что в таблице есть два или более совершенно одинаковых ФИО.

Один из результатов работы кода VBA Excel по заполнению полей со списком ComboBox в зависимости от выбранного значения в другом элементе управления ComboBox на примере ФИО:

Выбор ФИО с помощью полей со списком ComboBox

Если фамилия в списке встречается один раз, и ей соответствует одно имя, а фамилии и имени — одно отчество, тогда при выборе этой фамилии в элементе управления ComboBox1, имя и отчество в ComboBox2 и ComboBox3 выберутся автоматически.


1 / 1 / 0

Регистрация: 08.09.2017

Сообщений: 391

1

05.10.2019, 07:27. Показов 4054. Ответов 3


Студворк — интернет-сервис помощи студентам

Доброго времени суток!
Подскажите, как реализовать следующую задачу:
Необходимо по очереди по нажатию кнопки на пользовательской форме перебирать значения, которые прописаны в Combobox. То есть, чтобы процедура, которая заложена в кнопке выполнялась со всеми значениями ComboBox в порядке очереди.
Заранее спасибо!



0



Остап Бонд

Заблокирован

05.10.2019, 09:06

2

Baykal555, я угадал проблему?

Visual Basic
1
2
3
4
5
6
Private Sub CommandButton1_Click()
Dim i&
For i = 0 To ComboBox1.ListCount - 1 'все значения ComboBox в порядке очереди
  MsgBox ComboBox1.List(i) 'процедура, которая заложена в кнопке
Next i
End Sub



0



Baykal555

1 / 1 / 0

Регистрация: 08.09.2017

Сообщений: 391

05.10.2019, 20:08

 [ТС]

3

Остап Бонд,

Я подставил, но что-то все равно приходится значения из Combobox выставлять и каждый раз нажимать на кнопку:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Private Sub CommandButton1_Click()
Dim i&
For i = 0 To ComboBox1.ListCount - 1 
 Dim s As Range
 Dim lastrow As Long
 Dim k As Integer
 lastrow = Cells(Rows.Count, 4).End(xlUp).Row
 For Each s In Sheets(1).Range("D1:D" & lastrow)
 k = k + 1
 If Cells(k, 5) = ComboBox1 Then Rows(k).Clear
 Next s
 
 
Next i
End Sub



0



Narimanych

2628 / 1634 / 744

Регистрация: 23.03.2015

Сообщений: 5,135

05.10.2019, 22:09

4

Baykal555,

прикрепите файл…

И вам легче и нас мучать не надо…

Добавлено через 16 минут
Вы невнимательно просмотрели совет от Остап Бонд,

у него :

Цитата
Сообщение от Остап Бонд
Посмотреть сообщение

ComboBox1.List(i)

у вас :

Цитата
Сообщение от Baykal555
Посмотреть сообщение

ComboBox1

Немного «прибрался » в вашем коде…

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Private Sub CommandButton1_Click()
 Dim i&
 Dim lastrow As Long
 Dim k As Integer
         lastrow = Cells(Rows.Count, 4).End(xlUp).Row
         For i = 0 To ComboBox1.ListCount - 1
             For j = 1 To lastrow
                  If Trim(Cells(j, 5).Value) = ComboBox1.List(i) Then Rows(j).Clear
             Next j
          Next i
End Sub



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

05.10.2019, 22:09

Помогаю со студенческими работами здесь

Перебор значений циклом в ОЛАП сводной таблице
Добрый день!

Пишу макрос связанный с ОЛАП кубом. необходимо для начала получить количество…

Перебор значений лотереи, контроль выпавших чисел
помогите пожалуйста решить задачу Перебор значений лотереи и когда выпадает 7 на экране…

Перебор значений в поле с добавлением в ComboBox
Нужно вытащить элемент из строки, в котором значение равно, допустим, 1 по выбранному полю, и…

Перебор комбинаций значений параметров с выводом и сохранением связанных с ними значений
Добрый день.

Такой вопрос:
Имеется 3 параметра, которые могут изменяться от 0,1 до 0,7, с…

Реализовать перебор ComboBox
Итак на Form есть много однотипных Combobox а именно 100.
Name у них
ComboBox1,…

перебор в 2ух combobox
Помогите пожалуйста, имеется combobox1 и combobox2 в которых итемы от 0 до 5, и после выбора любых…

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

4

 

Kentavrik7

Пользователь

Сообщений: 433
Регистрация: 13.04.2016

#1

22.11.2018 15:16:28

Добрый день имеются следующие значения в Combobox
ComboBox1

Код
    .List = Array("январь", "февраль", "2 мес.", "март", "3 мес.", "апрель", "4 мес.", "май", "5 мес.", "июнь", "6 мес.", "июль", "7 мес.", "август", "8 мес.", "сентябрь", "9 мес.", "октябрь", "10 мес.", "ноябрь", "11 мес.", "декабрь", "12 мес.")

Пользователь может выбрать один из месяцев например «МАРТ»
необходимо сделать цикл чтобы макрос обработал «март» потом «3 мес» потом «апрель». То есть выбранное значение плюс еще два следующих.
Я предполагал что если добавить в код  цикл в виде, произойдет чудо  и все заработает, чуда не было. Прошу опытный взгляд для решения тривиальной задачи

Код
 For p = 0 To 2                        CombBox1.ListIndex = ComboBox1.ListIndex + p      

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

Код
 otbor = FuncOtbor(kategorii(j), Workbooks(wkbName).Sheets(ComboBox1.Value).Cells(k, 33), Workbooks(wkbName).Sheets(ComboBox1.Value).Cells(k, 45))
                    If otbor Then
                       For p = 0 To 2
                       CombBox1.ListIndex = ComboBox1.ListIndex + p
                       Cells(AnRows, 2) = Workbooks(wkbName).Sheets(ComboBox1.Value).Cells(k, 1)
                        If AnRows = AnRowsKat + 1 Then
                            Call FillRow("B", AnRows, DiapazonVPR)
                            Call ColorTheme(AnRows)
                        End If
                        Range("A" & CStr(AnRows)).Interior.Pattern = xlLightUp ' штриховка первого столбца заливка
                        AnRows = AnRows + 1
                     Next
                    End If
                End If

то есть задача сводится к тому что необходимо изменить значения которое будет выдавать комбо бокс.
Если выбрали второе значение «Февраль», то в  CombBox1.ListIndex  будет хранится «1», мы должны повысить значение на «+1» при следующем проходе получим
CombBox1.ListIndex = 2
Вот тут я не пойму как  после того что мы получили вот это CombBox1.ListIndex = 2  получить с ComboBox1.Value = «март»

Изменено: Kentavrik722.11.2018 16:29:34

 

_Igor_61

Пользователь

Сообщений: 3007
Регистрация: 18.07.2016

Kentavrik7,приложите файл с образцом данных и с Вашим комбобоксом. Может, Ваша задача решится другим способом. Например, на первый взгляд, мне кажется, что список для комбобокса можно хранить на листе, тогда и заморочек типа «CombBox1.ListIndex» можно будет избежать  :)  

 

Dima S

Пользователь

Сообщений: 2063
Регистрация: 01.01.1970

Kentavrik7,  столько текста с описанием вашего каламбура, а так и непонятно что нужно на выходе.
Плюс название темы совсем ни о чем. Задача ведь не в цикле, насколько я понимаю.

 

Юрий М

Модератор

Сообщений: 60570
Регистрация: 14.09.2012

Контакты см. в профиле

#4

23.11.2018 07:16:10

Цитата
Kentavrik7 написал:
необходимо сделать цикл чтобы макрос обработал «март» потом «3 мес» потом «апрель». То есть выбранное значение плюс еще два следующих.

Что следует понимать под обработкой? И покажите Ваш файл-пример — не рисовать же нам форму с этим ComboBox.

 

БМВ

Модератор

Сообщений: 21376
Регистрация: 28.12.2016

Excel 2013, 2016

#5

23.11.2018 08:12:51

В целом метод не поддержу, так как он меняет значение комбо. У вас надо попроавить

Код
CombBox1.ListIndex = ComboBox1.ListIndex + sgn(p)

Ну или

Код
For p = CombBox1.ListIndex To CombBox1.ListIndex+ 2
CombBox1.ListIndex =  p

Но, как  уже сказал , значение  комбо останется последним и его или надо вернуть, предварительно запомнив выбор, или менять подход.

Изменено: БМВ23.11.2018 08:13:05

По вопросам из тем форума, личку не читаю.

 

Kentavrik7

Пользователь

Сообщений: 433
Регистрация: 13.04.2016

#6

23.11.2018 09:28:00

Цитата
_Igor_61 написал:
что список для комбобокса можно хранить на листе

нет на листе не получитсмя

Цитата
Dima S написал:
столько текста с описанием вашего каламбура, а так и непонятно что нужно на выходе.

Нужно чтобы при выборе значения с комбобокса можно было прогнать по всему коду сначала его, потом следующее значение потом следующее.
Можно организовать более проще конечно (я не знаю как это кодом написать)
Изменить массив на :
.List = Array(«1 квартал», «2 квартал», «3 квартал», «4 квартал»)

и при выборе в комбобоксе пользователем например «1 квартал», пройти циклом по коду, сначала «январь» затем «февраль» потом «март».
Вопрос по такому варианту следующий как организовать это?
Я как понимаю через CombBox1.ListIndex могу выдернуть число от 0 до 3 и через «if» пройти, но тоже вопрос как пройти по трем месяцам? или можно как то по другому?
БМВ, спасибо, если вот так как я выше описал может получится более лаконично все организовать

 

Nordheim

Пользователь

Сообщений: 3154
Регистрация: 18.04.2017

Прочитал несколько раз , так и не понял что нужно сделать. Приложите файл пример с кодом который есть, и вкратце что вы хотите иметь на выходе. Только не нужно очередной раз писать ComboBox.ListIndex (а то уже глаза мозолит).

«Все гениальное просто, а все простое гениально!!!»

 

БМВ

Модератор

Сообщений: 21376
Регистрация: 28.12.2016

Excel 2013, 2016

Kentavrik7,  я вам написал, как сделать чтоб  работало.

По вопросам из тем форума, личку не читаю.

 

Jack Famous

Пользователь

Сообщений: 10846
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

#9

23.11.2018 10:08:28

Цитата
Kentavrik7: Изменить массив на :.List = Array(«1 квартал», «2 квартал», «3 квартал», «4 квартал»)и при выборе в комбобоксе пользователем например «1 квартал», пройти циклом по коду, сначала «январь» затем «февраль» потом «март». Вопрос по такому варианту следующий как организовать это?

ответ по цитате, не вникая в суть (вдруг угадал):

смотрите, если массивы равны, то второго цикла не нужно, поскольку, зная индекс выбранного элемента, например arr_1(5), мы сможем вытянуть по нему (индексу) соответствующий элемент другого массива, например arr_2(5)

Изменено: Jack Famous23.11.2018 10:09:50

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

ZVI

Пользователь

Сообщений: 4328
Регистрация: 23.12.2012

#10

23.11.2018 10:11:15

Если на листе/форме размещен ComboBox1, то код в модуле этого же листа/формы:

Код
' Выполнить 1 раз - заполнить комбобокс
Sub Init()
  Me.ComboBox1.List = Array("январь", "февраль", "2 мес.", "март", "3 мес.", "апрель", "4 мес.", "май", "5 мес.", "июнь", "6 мес.", "июль", "7 мес.", "август", "8 мес.", "сентябрь", "9 мес.", "октябрь", "10 мес.", "ноябрь", "11 мес.", "декабрь", "12 мес.")
End Sub
  
' После выбора значения в комбобоксе этот код запишет в a() 3 последовательных значения
Sub Test()
  Dim a(1 To 3)
  With Me.ComboBox1
    If .ListIndex < 0 Then Exit Sub
    a(1) = .Value
    On Error Resume Next ' <-- на случай выбора "декабрь" или "12 мес."
    a(2) = .List(.ListIndex + 1)
    a(3) = .List(.ListIndex + 2)
  End With
  Debug.Print a(1), a(2), a(3)
End Sub

Изменено: ZVI23.11.2018 10:20:02

 

Юрий М

Модератор

Сообщений: 60570
Регистрация: 14.09.2012

Контакты см. в профиле

Kentavrik7, а если выбрали предпоследний, последний — что тогда?

 

Kentavrik7

Пользователь

Сообщений: 433
Регистрация: 13.04.2016

#12

23.11.2018 10:44:14

ZVI,спасибо большое буду пробовать)

Понравилась статья? Поделить с друзьями:
  • For word in words python
  • For word in string bash
  • For word in list python
  • For word games перевод
  • For word document example