Combobox vba excel в условии

Заполнение списка 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 выберутся автоматически.


Actually, your code is correct, but your condition will be called only when your workbook will be opened (WorkBook_open()) …

This code:

If Me.ComboBox1.Value = "Paris" Then
     Range("A1").Value = 5
End If

should be in an other procedure.

Ex: If you want A1 to change when you select an item you can do:

Private Sub Workbook_open()

    With Sheet1.ComboBox1
        .AddItem "Paris"
        .AddItem "New York"
        .AddItem "London"
    End With

End Sub

Private Sub ComboBox1_Change()
    If Me.ComboBox1.Value = "Paris" Then
        Range("A1").Value = 5
    End If
End Sub

Actually ComboBox1_Change is called every time ComboBox1 value changes (pretty obvious)

NOTE: This code is tested and works for me, but there are other ways to do, like adding a commandButton and checking the condition only when this button is clicked.

Создание списка в Combobox с условием

Паштет

Дата: Суббота, 07.07.2018, 01:34 |
Сообщение № 1

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 155


Репутация:

7

±

Замечаний:
0% ±


Excel 2010

Доброго времени суток!

Необходимо создать список для combobox (Заготовительный склад: прием, № акта по ИБ «akt2») из столбца с листа Журнал ИБ столбец А, только тех значений, которых нет на листе Журнал ЗС столбце B.

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

К сообщению приложен файл:

IB.xlsm
(77.0 Kb)

 

Ответить

K-SerJC

Дата: Суббота, 07.07.2018, 07:08 |
Сообщение № 2

Группа: Проверенные

Ранг: Обитатель

Сообщений: 487


Репутация:

86

±

Замечаний:
0% ±


Excel 2013

пожалуйста!

К сообщению приложен файл:

2736494.xlsm
(76.5 Kb)


Благими намерениями выстелена дорога в АД.

 

Ответить

Паштет

Дата: Суббота, 07.07.2018, 10:12 |
Сообщение № 3

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 155


Репутация:

7

±

Замечаний:
0% ±


Excel 2010

Благодарю!

А если нужно оставить только те значения в Combobox (Заготовительный склад: выдача: № «akt4») с листа «Журнал ЗС» столбец «А», которые имеют пустые ячейки в столбце «L»? К сожалению, пока так и не могу понять для себя обработку combobox. Файл тот же.

 

Ответить

Паштет

Дата: Воскресенье, 08.07.2018, 20:18 |
Сообщение № 4

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 155


Репутация:

7

±

Замечаний:
0% ±


Excel 2010

K-SerJC, ошибка вылезла. Номера он оставляет правильные, а вот значения подтягивает не те. К примеру, в вашем файле остался акт с номером 1313, а значения он подставляет от 1293, т.е. как я понимаю первого по списку.

 

Ответить

K-SerJC

Дата: Вторник, 10.07.2018, 08:34 |
Сообщение № 5

Группа: Проверенные

Ранг: Обитатель

Сообщений: 487


Репутация:

86

±

Замечаний:
0% ±


Excel 2013

K-SerJC, ошибка вылезла. Номера он оставляет правильные, а вот значения подтягивает не те. К примеру, в вашем файле остался акт с номером 1313, а значения он подставляет от 1293, т.е. как я понимаю первого по списку.

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

надо немного переделать


Благими намерениями выстелена дорога в АД.

 

Ответить

K-SerJC

Дата: Вторник, 10.07.2018, 08:59 |
Сообщение № 6

Группа: Проверенные

Ранг: Обитатель

Сообщений: 487


Репутация:

86

±

Замечаний:
0% ±


Excel 2013

так?

К сообщению приложен файл:

1301894.xlsm
(70.7 Kb)


Благими намерениями выстелена дорога в АД.

 

Ответить

Паштет

Дата: Вторник, 10.07.2018, 21:30 |
Сообщение № 7

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 155


Репутация:

7

±

Замечаний:
0% ±


Excel 2010

Да, так. Спасибо.
Только при попытке вставить код в полную версию файла, где только добавляются дополнительные листы и больше данных в таблицах, стала вылезать ошибка:

Цитата

run-time error 424 object required

Причем, если отменить действие строки:
[vba]

Код

cmbFilter.AddItem Sheets(«Журнал ИБ»).Cells(i, 1)

[/vba]
То форма без проблем запускалась. В итоге все скопировал в ваш файл и все стало работать как надо. Просто фантастика! :)

А с постом 3 данной темы не поможете?

 

Ответить

K-SerJC

Дата: Среда, 11.07.2018, 08:54 |
Сообщение № 8

Группа: Проверенные

Ранг: Обитатель

Сообщений: 487


Репутация:

86

±

Замечаний:
0% ±


Excel 2013

Только при попытке вставить код в полную версию файла,

это от того что я на форму добавил элемент управления
cmbFilter типа combobox

можете форму smk скопировать в свой файл и тоже будет работать.

по посту №3
вот этот код:
[vba]

Код

i = 5
     Do While Sheets(«Журнал ИБ»).Cells(i, 1) <> 0
     akt2.AddItem Sheets(«Журнал ИБ»).Cells(i, 1)
        If Not НетЖурналЗС(Sheets(«Журнал ИБ»).Cells(i, 1).Value) Then
        cmbFilter.AddItem Sheets(«Журнал ИБ»).Cells(i, 1)
              End If
               i = i + 1
    Loop

[/vba]
заполняет список всеми значениями с листа Журнал ИБ
использует функцию НетЖурналЗС, которая проверяет есть ли этот номер в другом журнале и заполняет список cmbFilter
на форме вы кликаете по списку cmbFilter
а он выбранное значение передает в список акт2.

можно добавить нужный вам фильтр как еще одну функцию, или эту же расширить


Благими намерениями выстелена дорога в АД.

 

Ответить

Паштет

Дата: Среда, 11.07.2018, 09:56 |
Сообщение № 9

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 155


Репутация:

7

±

Замечаний:
0% ±


Excel 2010

Цитата

это от того что я на форму добавил элемент управления
cmbFilter типа combobox

Понял, что чего-то не хватает, но не ожидал, что это будет в самой форме.

Сделал по аналогии по условию поста 3, добавив еще один Combobox и прописав код выше. Но не пошло
[vba]

Код

Function НетЖурналаЗС2(item As Variant) As Boolean
i = 5
     Do While Sheets(«Журнал ЗС»).Cells(i, 12).Value = 0

                i = i + 1
    Loop
End Function
Private Sub cmbFilter2_Change()
akt4.Text = cmbFilter2.Text
End Sub
Private Sub UserForm_Initialize()
i = 5
     Do While Sheets(«Журнал ЗС»).Cells(i, 1) <> 0
     akt4.AddItem Sheets(«Журнал ЗС»).Cells(i, 1)
        If Not НетЖурналЗС(Sheets(«Журнал ЗС»).Cells(i, 1).Value) Then
        cmbFilter.AddItem Sheets(«Журнал ЗС»).Cells(i, 1)
              End If
               i = i + 1
    Loop
End Sub

[/vba]

 

Ответить

K-SerJC

Дата: Среда, 11.07.2018, 10:27 |
Сообщение № 10

Группа: Проверенные

Ранг: Обитатель

Сообщений: 487


Репутация:

86

±

Замечаний:
0% ±


Excel 2013

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


Благими намерениями выстелена дорога в АД.

 

Ответить

StoTisteg

Дата: Среда, 11.07.2018, 10:50 |
Сообщение № 11

Группа: Авторы

Ранг: Старожил

Сообщений: 1161


Репутация:

103

±

Замечаний:
0% ±


Excel 2010


Интуитивно понятный код — это когда интуитивно понятно, что это код.

 

Ответить

Паштет

Дата: Четверг, 12.07.2018, 19:26 |
Сообщение № 12

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 155


Репутация:

7

±

Замечаний:
0% ±


Excel 2010

Какую можете предложить альтернативу?

Цитата

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

Поле на странице формы Заготовительный склад: выдача -> № (самый верхний combobox на странице формы, называется akt4). Должен быть список с листа Журнал ЗС из значений столбца А, только тех, у которых в столбце L того же листа нет значений (ячейка пуста).

 

Ответить

_Boroda_

Дата: Четверг, 12.07.2018, 19:47 |
Сообщение № 13

Группа: Модераторы

Ранг: Местный житель

Сообщений: 16618


Репутация:

6465

±

Замечаний:
0% ±


2003; 2007; 2010; 2013 RUS

В Private Sub UserForm_Initialize() начиная со строки 119
[vba]

Код

    Do While Sheets(«Журнал ЗС»).Cells(i, 1) <> 0
        If Sheets(«Журнал ЗС»).Cells(i, 12) = «» Then
            akt4.AddItem Sheets(«Журнал ЗС»).Cells(i, 1)
        End If
        i = i + 1
    Loop

[/vba]
Во вложении Ваш файл из поста №1 с указанной выше поправкой
лучше так
[vba]

Код

    With Sheets(«Журнал ЗС»)
        Do While .Cells(i, 1) <> 0
            If .Cells(i, 12) = «» Then
                akt4.AddItem .Cells(i, 1)
            End If
            i = i + 1
        Loop
    End With

[/vba]

К сообщению приложен файл:

IB_1.xlsm
(70.1 Kb)


Скажи мне, кудесник, любимец ба’гов…
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995

 

Ответить

Паштет

Дата: Четверг, 12.07.2018, 21:05 |
Сообщение № 14

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 155


Репутация:

7

±

Замечаний:
0% ±


Excel 2010

Список получается то что надо, но значения, который он подтягивал теперь поплыли

 

Ответить

Паштет

Дата: Пятница, 13.07.2018, 16:18 |
Сообщение № 15

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 155


Репутация:

7

±

Замечаний:
0% ±


Excel 2010

По выбору значения в combobox в соседних textbox подставляются значения с листа (аля ВПР). Теперь они не верно сопоставляются. Кусок кода private sub akt4_change.

 

Ответить

Паштет

Дата: Воскресенье, 15.07.2018, 21:39 |
Сообщение № 16

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 155


Репутация:

7

±

Замечаний:
0% ±


Excel 2010

Справился сам, сделав по аналогии, что предлагал K-SerJC в моем первом случае. Вышло следующее:
[vba]

Код

Private Sub cmbFilter2_Change()
akt4.Text = cmbFilter2.Text
End Sub
Private Sub UserForm_Initialize()
i = 5
    Do While Sheets(«Журнал ЗС»).Cells(i, 1) <> 0
       akt4.AddItem Sheets(«Журнал ЗС»).Cells(i, 1)
        If Sheets(«Журнал ЗС»).Cells(i, 12) = «» Then
        cmbFilter2.AddItem Sheets(«Журнал ЗС»).Cells(i, 1)
        End If
        i = i + 1
    Loop
end sub
Private Sub Akt4_Change()

Dim iRow As Long
    iRow = 5 + akt4.ListIndex
    With Sheets(«Журнал ЗС»)
        Akt5 = Sheets(«Журнал ЗС»).Cells(iRow, «b»)
        nomen4 = Sheets(«Журнал ЗС»).Cells(iRow, «D»)      
        name4 = Sheets(«Журнал ЗС»).Cells(iRow, «E»)
        tip4 = Sheets(«Журнал ЗС»).Cells(iRow, «F»)         
        ntd4 = Sheets(«Журнал ЗС»).Cells(iRow, «G»)         
        Data5 = Format(Sheets(«Журнал зс»).Cells(iRow, 3), «dd.mm.yyyy»)
    End With
End Sub

[/vba]

Спасибо всем, кто откликнулся!

 

Ответить

_Boroda_

Дата: Понедельник, 16.07.2018, 10:01 |
Сообщение № 17

Группа: Модераторы

Ранг: Местный житель

Сообщений: 16618


Репутация:

6465

±

Замечаний:
0% ±


2003; 2007; 2010; 2013 RUS

Не заметил сразу Вашего вопроса.
Может, просто вот так написать?
[vba]

Код

iRow = Sheets(«Журнал ЗС»).Columns(«A:A»).Find(What:=akt4.Value).Row

[/vba]
Финд можно с бОльшим количеством аргументов на всякий случай написать, типа
[vba]

Код

.Find(What:=»1306″, After:=ActiveCell, LookIn:=xlFormulas, _
        LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False, SearchFormat:=False)

[/vba]

К сообщению приложен файл:

IB_2.xlsm
(69.8 Kb)


Скажи мне, кудесник, любимец ба’гов…
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995

 

Ответить

Паштет

Дата: Понедельник, 16.07.2018, 18:52 |
Сообщение № 18

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 155


Репутация:

7

±

Замечаний:
0% ±


Excel 2010

_Boroda_, думаю Вы правы. Так и сделаю. Спасибо.

 

Ответить

Паштет

Дата: Понедельник, 16.07.2018, 20:26 |
Сообщение № 19

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 155


Репутация:

7

±

Замечаний:
0% ±


Excel 2010

Кстати не пройдет, если у акта будет номер 1. Нужно, чтобы Find только с пятой строки делал выборку.
Попробовал так видоизменить строчку, но вылетаю с ошибкой
[vba]

Код

iRow = Sheets(«Журнал ЗС»).Range(Cells(4, 1), Cells(Cells(Rows.Count, 1).End(xlUp).Row, 1)).Find(What:=akt4.Value).Row

[/vba]

 

Ответить

_Boroda_

Дата: Понедельник, 16.07.2018, 21:30 |
Сообщение № 20

Группа: Модераторы

Ранг: Местный житель

Сообщений: 16618


Репутация:

6465

±

Замечаний:
0% ±


2003; 2007; 2010; 2013 RUS

Правильно. На Range имя листа пишете, а на Cells нет — и по умолчанию идет на текущий лист
Напишите просто
[vba]

Код

Sheets(«Журнал ЗС»).Range(Cells(4, 1).resize(999)

[/vba]


Скажи мне, кудесник, любимец ба’гов…
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995

 

Ответить

 

ac1-caesar

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

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

#1

22.01.2015 11:20:36

Уважаемые форумчане!

Подскажите пожалуйста путь решения вопроса.

Код
Dim A_check As String

'выбор условия по содержанию комбобокса
If Me.AchecksComboBox = "A10-CHECK" Then
    A_check = ".Cells(r, 47) <> 91" & "And .Cells(r, 47) <> 183" _
        & "And .Cells(r, 47) <> 274" & "And .Cells(r, 47) <> 365"
End If 

If Me.AchecksComboBox = "A11-CHECK" Then
    A_check = ".Cells(r, 47) <> 91" & "And .Cells(r, 47) <> 183" 
End If 
 
If Me.AchecksComboBox = "A12-CHECK" Then
    A_check = ".Cells(r, 47) <> 91" & "And .Cells(r, 47) <> 183" _ 
   & "And .Cells(r, 47) <> 365"

End If 

With Thisworkbook.sheets("Sheet1") 
   For '.... цикл
      If (m - m1) * (m - m2) <= 0 And A_check Then 'условие выполнения действия
         '...... действие
        End If   
   Next 
End With

Действие выполняется по условию в If (m — m1) * (m — m2) <= 0 And A_check
Условие выбирается по значению комбобокса.
Я хотел присвоить переменной A_check строковое содержание условия. Однако так не работает.
Подскажите правильное направление решения.

Изменено: ac1-caesar22.01.2015 11:21:40

 

ber$erk

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

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

#2

22.01.2015 11:43:00

Может что-то типа такого?

Код
Dim A_check As String
 

With Thisworkbook.sheets("Sheet1")
   For '.... цикл
   If (m - m1) * (m - m2) <= 0 then
      if Me.AchecksComboBox = "A10-CHECK" Then
         if .Cells(r, 47) <> 91 And .Cells(r, 47) <> 183 And .Cells(r, 47) <> 274 And .Cells(r, 47) <> 365 then
         ...
         endif
      elseif Me.AchecksComboBox = "A11-CHECK" Then
         ...
      '...... действие
     End If  
   Next
End With

Изменено: ber$erk22.01.2015 11:43:43

Учимся сами и помогаем другим…

 

Если бы было одно или два таких условия, то так и сделал бы. Но таких условий больше десятка.
Никак по другому?

 

ber$erk

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

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

а условие только на неравенство?
может тогда просто формировать коллекцию из ненужных значений, а в цикле уже смотреть чтобы это число не было в этой коллекции?

Учимся сами и помогаем другим…

 

ac1-caesar

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

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

#5

22.01.2015 13:29:10

Цитата
ber$erk пишет: а условие только на неравенство?

нет, может быть и равенство.
И в предложенном Вами вариантом придется в каждом ElseIf вставлять действие. Это в десятки раз увеличит код, как то не правильно это наверное…

 

ber$erk

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

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

#6

22.01.2015 13:52:12

если есть равенство, то использовать 2 коллекции.

Цитата
ac1-caesar пишет: в предложенном Вами вариантом придется в каждом ElseIf вставлять действие.

про какой именно вариант Вы говорите? я уже второй предложил.

Учимся сами и помогаем другим…

 

ac1-caesar

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

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

#7

22.01.2015 13:55:16

Этот:

Код
Dim A_check As String
  
 
With Thisworkbook.sheets("Sheet1")
   For '....цикл
   If (m - m1) * (m - m2) <= 0 then
      if Me.AchecksComboBox = "A10-CHECK" Then
         if .Cells(r, 47) <> 91 And .Cells(r, 47) <> 183 And .Cells(r, 47) <> 274 And .Cells(r, 47) <> 365 then
         ...
         endif
      elseif Me.AchecksComboBox = "A11-CHECK" Then
         ...
      '...... действие
     End If  
   Next
End With 

Изменено: ac1-caesar23.01.2015 03:03:05

 

ber$erk

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

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

Первый вариант предлагаю забыть. Второй более оптимален, ИМХО.

Учимся сами и помогаем другим…

 

Примером можете показать?

 

ber$erk

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

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

Может все таки Вы свой файлик приложите?

Учимся сами и помогаем другим…

 

The_Prist

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

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

Профессиональная разработка приложений для MS Office

#11

22.01.2015 14:24:42

Если всегда используется .Cells(r, 47), то можно через Evaluate:

Код
dim s, bTrue as boolean
s = .Cells(r, 47).Value
Select Case Me.AchecksComboBox 
Case "A10-CHECK" 
    A_check = s & " <> 91 And " & s & " <> 183 And " & s & " <> 274" & "And " & s & " <> 365" 
Case "A11-CHECK" 
    A_check = s & " <> 91 And " & s & " <> 183" 
End Select 
bTrue = Evaluate(A_check)

Или как уже предложили, коллекциями/словарями/массивами:

Код
    Dim avCond
    Dim s, bTrue As Boolean

    Select Case Me.AchecksComboBox
    Case "A10-CHECK"
        avCond = Array(91, 183, 274, 365)
    Case "A11-CHECK"
        avCond = Array(91, 183)
    End Select
    s = .Cells(r, 47).Value
    bTrue = True
    For li = LBound(avCond) To UBound(avCond)
        If s <> avCond(li) Then
            bTrue = False
            Exit For
        End If
    Next li

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

RAN

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

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

#12

22.01.2015 14:30:10

Мне тоже файла жалко

Код
Private Sub ComboBox1_Change()
Dim i&
If Len(ComboBox1) Then
For i = 1 To 3
MsgBox "Условие1 = ???, но условие2 = " & A_check(i)
Next
End If
End Sub

Function A_check(i&) As Boolean
Select Case Me.ComboBox1.Value
Case "a1"
A_check = Cells(i, 2) = 1 And Cells(i, 3) = 2
Case "a2"
A_check = Cells(i, 2) = 3 And Cells(i, 3) = 4
End Select
End Function

Private Sub UserForm_Initialize()
Me.ComboBox1.List = Array("a1", "a2")
End Sub
 

The_Prist, RAN, спасибо, буду пробовать.

 

ac1-caesar

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

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

#14

22.01.2015 15:57:36

Код
 Dim avCond
    Dim s, bTrue As Boolean
 
    Select Case Me.AchecksComboBox
    Case "A10-CHECK"
        avCond = Array(91, 183, 274, 365)
    Case "A11-CHECK"
        avCond = Array(91, 183)
    End Select
    s = .Cells(r, 47).Value
    bTrue = True
    For li = LBound(avCond) To UBound(avCond)
        If s <> avCond(li) Then
            bTrue = False
            Exit For
        End If
    Next li
 

The_Prist, подскажите пожалуйста, какую роль здесь играет переменная bTrue ?

На сколько я понял, действие нужно вставлять после строчки If s <> avCond(li) Then?

 

The_Prist

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

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

Профессиональная разработка приложений для MS Office

#15

22.01.2015 16:10:36

М-да…Пошаговая отладка Вам неведома? :-)
bTrue — это как раз та переменная, которая после цикла

For li = LBound(avCond) To UBound(avCond)

скажет Вам — выполняются ли Ваши условия или нет.
Если bTrue = True — значит условия выполняются.
Если bTrue = False — не выполняется какое-либо условие.

Следовательно именно после цикла надо проверять эту переменную и тогда уже смотреть что делать.

Код
For li = LBound(avCond) To UBound(avCond)
     If s <> avCond(li) Then
      bTrue = False
      Exit For
     End If
    Next li 
If bTrue = True Then 
'действие 
End if

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

ac1-caesar

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

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

#16

22.01.2015 16:29:58

The_Prist, в моем случае наверное не If bTrue = True Then, а If bTrue = False Then ? Так как в случае неравенства должно происходить действие.

Код
If bTrue = False Then
'действие
End if
 
 

The_Prist

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

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

Профессиональная разработка приложений для MS Office

#17

22.01.2015 17:09:46

Ну тут Вам виднее. Я показал лишь пример более краткой реализации. Использовать можно по-разному.

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

Below we will look at a program in Excel VBA which creates a Userform that contains dependent combo boxes. The Userform we are going to create looks as follows:

The user selects Animals from a drop-down list. As a result, the user can select an animal from a second drop-down list.

Dependent Combo Boxes in Excel VBA

The user selects Sports from a drop-down list. As a result, the user can select a sport from a second drop-down list.

Dependent Combo Boxes in Excel VBA

To create this Userform, execute the following steps.

1. Open the Visual Basic Editor. If the Project Explorer is not visible, click View, Project Explorer.

2. Click Insert, Userform. If the Toolbox does not appear automatically, click View, Toolbox. Your screen should be set up as below.

Userform Screen Setup in Excel VBA

3. Add the combo boxes (first at the left, the second at the right) and command button. Once this has been completed, the result should be consistent with the picture of the Userform shown earlier. For example, create a combo box control by clicking on ComboBox from the Toolbox. Next, you can drag a combo box on the Userform.

4. You can change the names and the captions of the controls. Names are used in the Excel VBA code. Captions are those that appear on your screen. It is good practice to change the names of the controls, but it is not necessary here because we only have a few controls in this example. To change the caption of the Userform and command button, click View, Properties Window and click on each control.

5. To show the Userform, place a command button on your worksheet and add the following code line:

Private Sub CommandButton1_Click()

UserForm1.Show

End Sub

We are now going to create the Sub UserForm_Initialize. When you use the Show method for the Userform, this sub will automatically be executed.

6. Open the Visual Basic Editor.

7. In the Project Explorer, right click on UserForm1 and then click View Code.

8. Choose Userform from the left drop-down list. Choose Initialize from the right drop-down list.

9. Add the following code lines:

Private Sub UserForm_Initialize()

With ComboBox1
    .AddItem «Animals»
    .AddItem «Sports»
    .AddItem «Food»
End With

End Sub

Explanation: These code lines fill the first combo box.

We have now created the first part of the Userform. Although it looks neat already, nothing will happen yet when we select an item from the first combo box.

10. In the Project Explorer, double click on UserForm1.

11. Double click on the first combo box.

12. Add the following code lines:

Private Sub ComboBox1_Change()

Dim index As Integer
index = ComboBox1.ListIndex

ComboBox2.Clear

Select Case index
    Case Is = 0
        With ComboBox2
            .AddItem «Dog»
            .AddItem «Cat»
            .AddItem «Horse»
        End With
    Case Is = 1
        With ComboBox2
            .AddItem «Tennis»
            .AddItem «Swimming»
            .AddItem «Basketball»
        End With
    Case Is = 2
        With ComboBox2
            .AddItem «Pancakes»
            .AddItem «Pizza»
            .AddItem «Chinese»
        End With
End Select

End Sub

Explanation: Excel VBA uses the value of the variable index to test each subsequent Case statement to see with which items the second combo box should be filled. Go through our Select Case program to learn more about the Select Case structure.

13. Double click on the Import button.

14. Add the following code line:

Private Sub CommandButton1_Click()

Range(«A1»).Value = ComboBox2.Value

End Sub

Result:

Dependent Combo Boxes in Excel VBA

Понравилась статья? Поделить с друзьями:
  • Combobox listbox excel vba
  • Combobox index vba excel
  • Combobox in excel 2007
  • Combine function in word
  • Combobox excel что это