Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Выбор нескольких значений в выпадающем списке - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Выбор нескольких значений в выпадающем списке (Макросы/Sub)
Выбор нескольких значений в выпадающем списке
t330 Дата: Воскресенье, 26.05.2019, 17:25 | Сообщение № 1
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 147
Репутация: 0 ±
Замечаний: 20% ±

Excel 2016
Добрый день всем!

Подскажите пожалуйста , есть ли способ сделать так, чтобы в выпадающем списке в ячейке можно было бы выбирать несколько значений сразу с помощью галочек (как например в фильтрах в сводных таблицах) и потом эти выбранные значения отображать в соседней ячейке справа через запятую ,ну или записывать эти выбранные значения в "массив" или в "список" в VBA, для дальнейшей обработки ?

Как сделать так, чтобы можно было выбирать в выпадающем списке значения по-очереди и отображать их в соседних ячейках - знаю.
Код снизу делает это, но нужно, чтобы выбирать можно было галочками и не по-очереди , а одновременно, как на картинке


...

[vba]
Код

Private Sub Worksheet_Change(ByVal Target As Range)
'справа от выпадающего списка будут добавляться выбранные значения.
On Error Resume Next
If Not Intersect(Target, Range("b12:b18")) Is Nothing And Target.Cells.Count = 1 Then
    Application.EnableEvents = False
        If Len(Target.Offset(0, 1)) = 0 Then
        Target.Offset(0, 1) = Target
        Else
        Target.End(xlToRight).Offset(0, 1) = Target
        End If
    Target.ClearContents
    Application.EnableEvents = True
End If

End Sub

[/vba]
К сообщению приложен файл: test.xlsm (27.8 Kb)
 
Ответить
СообщениеДобрый день всем!

Подскажите пожалуйста , есть ли способ сделать так, чтобы в выпадающем списке в ячейке можно было бы выбирать несколько значений сразу с помощью галочек (как например в фильтрах в сводных таблицах) и потом эти выбранные значения отображать в соседней ячейке справа через запятую ,ну или записывать эти выбранные значения в "массив" или в "список" в VBA, для дальнейшей обработки ?

Как сделать так, чтобы можно было выбирать в выпадающем списке значения по-очереди и отображать их в соседних ячейках - знаю.
Код снизу делает это, но нужно, чтобы выбирать можно было галочками и не по-очереди , а одновременно, как на картинке


...

[vba]
Код

Private Sub Worksheet_Change(ByVal Target As Range)
'справа от выпадающего списка будут добавляться выбранные значения.
On Error Resume Next
If Not Intersect(Target, Range("b12:b18")) Is Nothing And Target.Cells.Count = 1 Then
    Application.EnableEvents = False
        If Len(Target.Offset(0, 1)) = 0 Then
        Target.Offset(0, 1) = Target
        Else
        Target.End(xlToRight).Offset(0, 1) = Target
        End If
    Target.ClearContents
    Application.EnableEvents = True
End If

End Sub

[/vba]

Автор - t330
Дата добавления - 26.05.2019 в 17:25
RAN Дата: Воскресенье, 26.05.2019, 17:43 | Сообщение № 2
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Низзя!


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеНиззя!

Автор - RAN
Дата добавления - 26.05.2019 в 17:43
t330 Дата: Воскресенье, 26.05.2019, 19:56 | Сообщение № 3
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 147
Репутация: 0 ±
Замечаний: 20% ±

Excel 2016
Низзя!


Получается , такой множественный выбор в списке можно настроить только через Userform?
 
Ответить
Сообщение
Низзя!


Получается , такой множественный выбор в списке можно настроить только через Userform?

Автор - t330
Дата добавления - 26.05.2019 в 19:56
_Igor_61 Дата: Воскресенье, 26.05.2019, 19:59 | Сообщение № 4
Группа: Проверенные
Ранг: Ветеран
Сообщений: 504
Репутация: 90 ±
Замечаний: 0% ±

Excel 2007
такой множественный выбор в списке можно настроить только через Userform?
И к тому же использовать не выпадающий список (т.е. ComboBox), а ListBox - намного удобней будет пользоваться.
 
Ответить
Сообщение
такой множественный выбор в списке можно настроить только через Userform?
И к тому же использовать не выпадающий список (т.е. ComboBox), а ListBox - намного удобней будет пользоваться.

Автор - _Igor_61
Дата добавления - 26.05.2019 в 19:59
RAN Дата: Воскресенье, 26.05.2019, 20:18 | Сообщение № 5
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Может и через оъекты листа можно. Лень проверять. Я про выпадающий список писал.


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеМожет и через оъекты листа можно. Лень проверять. Я про выпадающий список писал.

Автор - RAN
Дата добавления - 26.05.2019 в 20:18
_Igor_61 Дата: Воскресенье, 26.05.2019, 20:58 | Сообщение № 6
Группа: Проверенные
Ранг: Ветеран
Сообщений: 504
Репутация: 90 ±
Замечаний: 0% ±

Excel 2007
Можно, проверил :)
К сообщению приложен файл: 111.xlsm (24.8 Kb)
 
Ответить
СообщениеМожно, проверил :)

Автор - _Igor_61
Дата добавления - 26.05.2019 в 20:58
_Boroda_ Дата: Понедельник, 27.05.2019, 11:21 | Сообщение № 7
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16674
Репутация: 6479 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
Такая игрушка для обычного выпадающего списка. Галочки лень искать было, сделал + и -
Делал на скорую руку, вполне возможно, что какие-то моменты не учел. Но это не так важно, главное принцип
К сообщению приложен файл: 84768_.xlsm (18.0 Kb)


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеТакая игрушка для обычного выпадающего списка. Галочки лень искать было, сделал + и -
Делал на скорую руку, вполне возможно, что какие-то моменты не учел. Но это не так важно, главное принцип

Автор - _Boroda_
Дата добавления - 27.05.2019 в 11:21
_Igor_61 Дата: Понедельник, 27.05.2019, 16:37 | Сообщение № 8
Группа: Проверенные
Ранг: Ветеран
Сообщений: 504
Репутация: 90 ±
Замечаний: 0% ±

Excel 2007
_Boroda_, классно! hands
 
Ответить
Сообщение_Boroda_, классно! hands

Автор - _Igor_61
Дата добавления - 27.05.2019 в 16:37
t330 Дата: Вторник, 28.05.2019, 17:33 | Сообщение № 9
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 147
Репутация: 0 ±
Замечаний: 20% ±

Excel 2016
Такая игрушка для обычного выпадающего списка


Круто! Спасибо!
Не могли вы ответить на несколько вопросов:

1.Нигде не увидел инструкции объявления переменных DIm a_ , x_ , z_ хотя у меня стоит Option Explicit , но VBA не ругается при запуске этого кода... Почему так происходит?

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

3. Если нажимать F8 , то пошаговая отладка не работает и не понятно как в процессе выполнения кода меняются переменные a_ , x_, z_ , поэтому сложно понять как код работает.
Чем вы пользуетесь для отладки таких кодов?

Заранее спасибо, за ответы!

[vba]
Код

Private Sub Worksheet_Change(ByVal Target As Range) ' процедура запускаемая при изменении в диапазоне Target
    If Target.Address(0, 0) = "D1" Then  ' если смещение на 0 строк и 0 столбцов от выбранной пользователем ячейки равно D1
        a_ = Replace(Replace(Target, "+  ", ""), "-  ", "")  ' то в переменную a_ записываем строку, содержащуюся в ячейке D1 без знаков "+  " и "-  "
        If InStr(x_, a_) Then ' если в  переменной x_  (для чего эта переменная?) содержится строка a_ , то
            z_ = Replace(Replace(x_, a_ & ",", ""), a_, "")  ' очищаем переменную x_ от переменной a_ с запятой и без запятой и записываем это все в переменную z_ ... Зачем?
            If Right(z_, 1) = "," Then  ' если справа в переменной z_ осталась запятая
                z_ = Left(z_, Len(z_) - 1) ' , то удаляем ее , с помощью этого выражения
            End If
        Else ' если в  переменной x_  НЕ содержится строка a_ , то
            z_ = x_ & a_  ' к x_ добавляется a_ и записывается все это в переменную z_
            If Left(z_, 1) = "," Then ' если в конце z_ есть запятая , то
                z_ = Mid(z_, 2) ' в переменную   z_ записываем первые 2 символа слева (Зачем?)
            End If
        End If
        Application.EnableEvents = 0   ' запрещаем события
        Target = z_ ' пишем в ячейку d1 значение переменной z_
        Application.EnableEvents = 1 ' разрешаем события
        SendKeys "%{down}" ' передаем в процедуру нажатие клавиш ALT +стрелка вниз, чтобы перейти к следующему значению в списке
        x_ = Target & "," ' пишем в переменную x_ значение из ячейки d1 плюс запятая
    End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)  ' процедура запускающаяся при выделении ячейки D1
    If Target.Address(0, 0) = "D1" Then
        Application.EnableEvents = 0  ' запрещаем изменение событий. Зачем?
        Target = ""  ' обнуляем значение в ячейке D1
        Application.EnableEvents = 1 ' разрешаем изменение событий ...?
        SendKeys "%{down}" ' передаем в процедуру нажатие клавиш ALT плюс стрелка вниз,чтобы можно было выбрать другие значения из списка  Зачем?
        x_ = ""  ' обнуляем переменную x_
    End If
End Sub

[/vba]
 
Ответить
Сообщение
Такая игрушка для обычного выпадающего списка


Круто! Спасибо!
Не могли вы ответить на несколько вопросов:

1.Нигде не увидел инструкции объявления переменных DIm a_ , x_ , z_ хотя у меня стоит Option Explicit , но VBA не ругается при запуске этого кода... Почему так происходит?

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

3. Если нажимать F8 , то пошаговая отладка не работает и не понятно как в процессе выполнения кода меняются переменные a_ , x_, z_ , поэтому сложно понять как код работает.
Чем вы пользуетесь для отладки таких кодов?

Заранее спасибо, за ответы!

[vba]
Код

Private Sub Worksheet_Change(ByVal Target As Range) ' процедура запускаемая при изменении в диапазоне Target
    If Target.Address(0, 0) = "D1" Then  ' если смещение на 0 строк и 0 столбцов от выбранной пользователем ячейки равно D1
        a_ = Replace(Replace(Target, "+  ", ""), "-  ", "")  ' то в переменную a_ записываем строку, содержащуюся в ячейке D1 без знаков "+  " и "-  "
        If InStr(x_, a_) Then ' если в  переменной x_  (для чего эта переменная?) содержится строка a_ , то
            z_ = Replace(Replace(x_, a_ & ",", ""), a_, "")  ' очищаем переменную x_ от переменной a_ с запятой и без запятой и записываем это все в переменную z_ ... Зачем?
            If Right(z_, 1) = "," Then  ' если справа в переменной z_ осталась запятая
                z_ = Left(z_, Len(z_) - 1) ' , то удаляем ее , с помощью этого выражения
            End If
        Else ' если в  переменной x_  НЕ содержится строка a_ , то
            z_ = x_ & a_  ' к x_ добавляется a_ и записывается все это в переменную z_
            If Left(z_, 1) = "," Then ' если в конце z_ есть запятая , то
                z_ = Mid(z_, 2) ' в переменную   z_ записываем первые 2 символа слева (Зачем?)
            End If
        End If
        Application.EnableEvents = 0   ' запрещаем события
        Target = z_ ' пишем в ячейку d1 значение переменной z_
        Application.EnableEvents = 1 ' разрешаем события
        SendKeys "%{down}" ' передаем в процедуру нажатие клавиш ALT +стрелка вниз, чтобы перейти к следующему значению в списке
        x_ = Target & "," ' пишем в переменную x_ значение из ячейки d1 плюс запятая
    End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)  ' процедура запускающаяся при выделении ячейки D1
    If Target.Address(0, 0) = "D1" Then
        Application.EnableEvents = 0  ' запрещаем изменение событий. Зачем?
        Target = ""  ' обнуляем значение в ячейке D1
        Application.EnableEvents = 1 ' разрешаем изменение событий ...?
        SendKeys "%{down}" ' передаем в процедуру нажатие клавиш ALT плюс стрелка вниз,чтобы можно было выбрать другие значения из списка  Зачем?
        x_ = ""  ' обнуляем переменную x_
    End If
End Sub

[/vba]

Автор - t330
Дата добавления - 28.05.2019 в 17:33
_Boroda_ Дата: Вторник, 28.05.2019, 18:05 | Сообщение № 10
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16674
Репутация: 6479 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
1. Если Option Explicit явно не прописан в модуле с кодом, то его как бы и нет. Если Вы его вручную добавите, тогда да, нужно объявлять
2. [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) 'при изменении ячейки
    If Target.Address(0, 0) = "D1" Then 'если это Д1
        'Target - это ОДИН только что выбранный элемент списка
        a_ = Replace(Replace(Target, "+  ", ""), "-  ", "") 'меняем в Д1 "+  " и "-  " на пусто, полученное будет а_
        If InStr(x_, a_) Then 'Если в х_ присутствует значение а_
            z_ = Replace(Replace(x_, a_ & ",", ""), a_, "") 'убираем из х_ или а_ с запятой, или, если так не нашли, то просто а_
            If Right(z_, 1) = "," Then 'если справа оказыывается лишняя запятая
                z_ = Left(z_, Len(z_) - 1) 'убираем ее
            End If '
        Else 'Если в х_ отсутствует значение а_
            z_ = x_ & a_ 'прилепляем а_ справа к х_, обзываем все это z_
            If Left(z_, 1) = "," Then 'если слева лишняя запятая
                z_ = Mid(z_, 2) 'убираем ее
            End If '
        End If '
        Application.EnableEvents = 0 'откл реакцию на события
        Target = z_ 'суем полученное в Д1
        Application.EnableEvents = 1 'вкл реакцию на события
        SendKeys "%{down}" 'жмем Альт СтрелкаВниз
        x_ = Target & "," 'переменная (см. модуль 1) равна ячейке Д1 и запятая справа
    End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 'при выделении ячейки
    If Target.Address(0, 0) = "D1" Then 'если это Д1
        Application.EnableEvents = 0 'откл реакцию на события
        Target = "" 'очищаем Д1
        Application.EnableEvents = 1 'вкл реакцию на события
        SendKeys "%{down}" 'жмем Альт СтрелкаВниз
        x_ = "" 'переменная (см. модуль 1) равна пусто
    End If
End Sub
[/vba]
3. Дело в том, что SendKeys работает в активном приложении. Если Вы работаете с листа, то активен лист, а если Вы пробегаете макрос через VBA (F5 или F8), то активен VBA и SendKeys отрабатывает уже в нем
Я ничем не пользуюсь, пишу, запускаю, проверяю результат
4.
x_  (для чего эта переменная?)
Для того, чтобы то, что в ячейке Д1, можно было считать при SelectionChange, а работать со считанным в Change
5. Без z_ конечно можно, но код получится длиннее и медленнее. Да и у меня привычка, если что-то в коде вычисляется более одного раза - сделать это вычисление раньше и засунуть в переменную
К сообщению приложен файл: 84768_2.xlsm (18.3 Kb)


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
Сообщение1. Если Option Explicit явно не прописан в модуле с кодом, то его как бы и нет. Если Вы его вручную добавите, тогда да, нужно объявлять
2. [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) 'при изменении ячейки
    If Target.Address(0, 0) = "D1" Then 'если это Д1
        'Target - это ОДИН только что выбранный элемент списка
        a_ = Replace(Replace(Target, "+  ", ""), "-  ", "") 'меняем в Д1 "+  " и "-  " на пусто, полученное будет а_
        If InStr(x_, a_) Then 'Если в х_ присутствует значение а_
            z_ = Replace(Replace(x_, a_ & ",", ""), a_, "") 'убираем из х_ или а_ с запятой, или, если так не нашли, то просто а_
            If Right(z_, 1) = "," Then 'если справа оказыывается лишняя запятая
                z_ = Left(z_, Len(z_) - 1) 'убираем ее
            End If '
        Else 'Если в х_ отсутствует значение а_
            z_ = x_ & a_ 'прилепляем а_ справа к х_, обзываем все это z_
            If Left(z_, 1) = "," Then 'если слева лишняя запятая
                z_ = Mid(z_, 2) 'убираем ее
            End If '
        End If '
        Application.EnableEvents = 0 'откл реакцию на события
        Target = z_ 'суем полученное в Д1
        Application.EnableEvents = 1 'вкл реакцию на события
        SendKeys "%{down}" 'жмем Альт СтрелкаВниз
        x_ = Target & "," 'переменная (см. модуль 1) равна ячейке Д1 и запятая справа
    End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 'при выделении ячейки
    If Target.Address(0, 0) = "D1" Then 'если это Д1
        Application.EnableEvents = 0 'откл реакцию на события
        Target = "" 'очищаем Д1
        Application.EnableEvents = 1 'вкл реакцию на события
        SendKeys "%{down}" 'жмем Альт СтрелкаВниз
        x_ = "" 'переменная (см. модуль 1) равна пусто
    End If
End Sub
[/vba]
3. Дело в том, что SendKeys работает в активном приложении. Если Вы работаете с листа, то активен лист, а если Вы пробегаете макрос через VBA (F5 или F8), то активен VBA и SendKeys отрабатывает уже в нем
Я ничем не пользуюсь, пишу, запускаю, проверяю результат
4.
x_  (для чего эта переменная?)
Для того, чтобы то, что в ячейке Д1, можно было считать при SelectionChange, а работать со считанным в Change
5. Без z_ конечно можно, но код получится длиннее и медленнее. Да и у меня привычка, если что-то в коде вычисляется более одного раза - сделать это вычисление раньше и засунуть в переменную

Автор - _Boroda_
Дата добавления - 28.05.2019 в 18:05
t330 Дата: Вторник, 28.05.2019, 22:57 | Сообщение № 11
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 147
Репутация: 0 ±
Замечаний: 20% ±

Excel 2016
К сообщению приложен файл: 84768_2.xlsm(18.3 Kb)


Огромное спасибо за ответы!
А как Вы сделали список в ячейке D1 , чтобы там были значения с плюсами и минусами, которые при выборе меняются друг на друга?
 
Ответить
Сообщение
К сообщению приложен файл: 84768_2.xlsm(18.3 Kb)


Огромное спасибо за ответы!
А как Вы сделали список в ячейке D1 , чтобы там были значения с плюсами и минусами, которые при выборе меняются друг на друга?

Автор - t330
Дата добавления - 28.05.2019 в 22:57
_Boroda_ Дата: Вторник, 28.05.2019, 23:52 | Сообщение № 12
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16674
Репутация: 6479 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
Намекну. Список по какому диапазону сделан? А на листе видите Вы какой?


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

Автор - _Boroda_
Дата добавления - 28.05.2019 в 23:52
t330 Дата: Среда, 29.05.2019, 01:51 | Сообщение № 13
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 147
Репутация: 0 ±
Замечаний: 20% ±

Excel 2016
Намекну. Список по какому диапазону сделан? А на листе видите Вы какой?


Понял:) ХитрО!
 
Ответить
Сообщение
Намекну. Список по какому диапазону сделан? А на листе видите Вы какой?


Понял:) ХитрО!

Автор - t330
Дата добавления - 29.05.2019 в 01:51
AnK1LL Дата: Понедельник, 13.01.2020, 11:56 | Сообщение № 14
Группа: Пользователи
Ранг: Прохожий
Сообщений: 1
Репутация: 0 ±
Замечаний: 0% ±

Excel 2016
_Boroda_, Здравствуйте. Очень классный список получился... А возможно на одном листе сделать таких списков несколько? Простыми методами у меня не получилось реализовать.
 
Ответить
Сообщение_Boroda_, Здравствуйте. Очень классный список получился... А возможно на одном листе сделать таких списков несколько? Простыми методами у меня не получилось реализовать.

Автор - AnK1LL
Дата добавления - 13.01.2020 в 11:56
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Выбор нескольких значений в выпадающем списке (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!