Элемент управления пользовательской формы ComboBox для выбора и ввода информации в VBA Excel. Свойства поля с раскрывающимся списком, заполнение, извлечение данных, примеры кода.
UserForm.ComboBox – это элемент управления пользовательской формы, предназначенный для передачи в код VBA информации, выбранной пользователем из раскрывающегося списка или введенной с клавиатуры.
ComboBox представляет из себя комбинацию двух элементов управления: текстового поля (TextBox) и списка (ListBox), поэтому его еще называют «комбинированным списком» или «полем со списком». Также ComboBox сочетает в себе свойства этих двух элементов управления.
Изначально комбинированный список прорисовывается на форме в виде текстового поля с кнопкой для отображения раскрывающегося списка. Далее по тексту будем использовать слово «поле» в значении текстового поля в составе элемента управления ComboBox, а словосочетание «раскрывающийся список» – в значении списка в составе элемента управления ComboBox.
Поле со списком используется в тех случаях, когда необходимо добавить в форму информацию, которая заранее известна, а ее отдельные позиции можно сгруппировать в список, а также для ручного ввода с клавиатуры или вставки из буфера обмена, если необходимое значение в списке отсутствует.
Элемент управления ComboBox незаменим при больших списках. При списках из нескольких позиций его можно заменить на ListBox, который отображает позиции для выбора сразу после загрузки формы, не требуя дополнительных действий от пользователя.
Свойства поля со списком
Свойство | Описание |
---|---|
AutoSize | Автоподбор размера комбинированного поля. True – размер автоматически подстраивается под длину выбранной или введенной строки. False – размер элемента управления определяется свойствами Width и Height. |
AutoTab | Включение автоматической табуляции – передачи фокуса следующему элементу управления при достижении максимального числа символов при значениях свойства MaxLenght > 0. True – автоматическая табуляция включена, False – выключена. |
ColumnCount | Указывает количество столбцов в раскрывающемся списке. Значение по умолчанию = 1. |
ColumnHeads | Добавляет строку заголовков в раскрывающийся список. True – заголовки столбцов включены, False – заголовки столбцов выключены. Значение по умолчанию = False. |
ColumnWidths | Ширина столбцов в раскрывающемся списке. Значения для нескольких столбцов указываются в одну строку через точку с запятой (;). |
ControlSource | Ссылка на ячейку для ее привязки к элементу управления ComboBox. |
ControlTipText | Текст всплывающей подсказки при наведении курсора на элемент управления. |
Enabled | Доступ пользователя к полю и раскрывающемуся списку. True – доступ разрешен, False – доступ запрещен*. Значение по умолчанию = True. |
Font | Шрифт, начертание и размер текста в поле. |
Height | Высота элемента управления ComboBox. |
Left | Расстояние от левого края внутренней границы пользовательской формы до левого края комбинированного списка. |
List | Позволяет заполнить ComboBox данными из одномерного или двухмерного массива, а также обращаться к отдельным элементам раскрывающегося списка по индексам для записи и чтения. |
ListIndex | Номер выбранной пользователем строки в раскрывающемся списке. Нумерация начинается с нуля. Если ничего не выбрано, ListIndex = -1. |
ListRows | Количество видимых строк в раскрытом списке. Если общее количество строк больше ListRows, появляется полоса прокрутки. Значение по умолчанию = 8. |
Locked | Запрет на отображение раскрывающегося списка, ввод и редактирование данных в поле. True – ввод и редактирование запрещены**, False – ввод и редактирование разрешены. Значение по умолчанию = False. |
MatchRequired | Задает проверку вводимых в поле строк с элементами списка. True – проверка включена (допускается ввод только строк, совпадающих с элементами списка), False – проверка выключена (допускается ввод любых строк). Значение по умолчанию = False. |
MaxLenght | Максимальная длина строки в поле. Значение по умолчанию = 0, что означает – ограничений нет. |
RowSource | Источник строк для раскрывающегося списка (адрес диапазона на рабочем листе Excel). |
TabIndex | Целое число, определяющее позицию элемента управления в очереди на получение фокуса при табуляции. Отсчет начинается с 0. |
Text | Текстовое содержимое (значение) поля (=Value). |
TextAlign | Выравнивание текста в поле: 1 (fmTextAlignLeft) – по левому краю, 2 (fmTextAlignCenter) – по центру, 3 (fmTextAlignRight) – по правому краю. |
Top | Расстояние от верхнего края внутренней границы пользовательской формы до верхнего края комбинированного списка. |
Value | Текстовое содержимое (значение) поля (=Text). |
Visible | Видимость поля со списком. True – ComboBox отображается на пользовательской форме, False – ComboBox скрыт. |
Width | Ширина элемента управления. |
* При Enabled в значении False пользователь не может раскрывать список, а также вводить или редактировать данные в поле.
** Для элемента управления ComboBox действие свойства Locked в значении True аналогично действию свойства Enabled в значении False.
В таблице перечислены только основные, часто используемые свойства поля со списком. Еще больше доступных свойств отображено в окне Properties элемента управления ComboBox, а все методы, события и свойства – в окне Object Browser.
Вызывается Object Browser нажатием клавиши «F2». Слева выберите объект ComboBox, а справа смотрите его методы, события и свойства.
Свойства BackColor, BackStyle, BorderColor, BorderStyle отвечают за внешнее оформление комбинированного списка и его границ. Попробуйте выбирать доступные значения этих свойств в окне Properties, наблюдая за изменениями внешнего вида элемента управления ComboBox на проекте пользовательской формы.
Способы заполнения ComboBox
Используйте метод AddItem для загрузки элементов в поле со списком по одному:
With UserForm1.ComboBox1 .AddItem «Элемент 1» .AddItem «Элемент 2» .AddItem «Элемент 3» End With |
Используйте свойство List, чтобы скопировать одномерный массив значений в элемент управления ComboBox:
UserForm1.ComboBox1.List = Array(«Строка 1», _ «Строка 2», «Строка 3», «Строка 4», «Строка 5») |
Вместо функции Array можно использовать переменные одномерных и двухмерных массивов. При загрузке значений из двухмерного массива, требуется предварительно указать количество столбцов в комбинированном списке.
Используйте свойство RowSource, чтобы загрузить в ComboBox значения из диапазона ячеек рабочего листа:
UserForm1.ComboBox1.RowSource = «Лист5!B1:B15» |
При загрузке данных из диапазона, содержащего более одного столбца, требуется предварительно указать количество столбцов в комбинированном списке:
With UserForm1.ComboBox1 ‘Указываем количество столбцов .ColumnCount = 5 .RowSource = «‘Таблица с данными’!A1:E20» End With |
В качестве имени листа используется имя ярлыка. Если имя листа содержит пробелы, оно заключается в одинарные кавычки.
Подробнее о заполнении элемента управления ComboBox вы можете ознакомиться в отдельной статье с наглядными примерами. И еще более подробно – в статье о заполнении ListBox, так как ListBox заполняется теми же способами, что и ComboBox.
Привязка поля со списком к ячейке
Чтобы привязать комбинированный список к ячейке на рабочем листе Excel, необходимо свойству ControlSource присвоить адрес ячейки. Это можно сделать непосредственно в окне Properties элемента управления ComboBox или в коде VBA:
UserForm1.ComboBox1.ControlSource = "Лист1!B2"
Имя листа для составного адреса ячейки берется из названия ярлыка. Если имя листа содержит пробелы, оно заключается в одинарные кавычки. При указании адреса без имени листа, ComboBox привязывается к ячейке на активном листе.
В результате привязки образуется взаимосвязь между свойством Value комбинированного списка и значением ячейки. Все изменения в поле ComboBox дублируются в привязанной ячейке и наоборот, изменения в ячейке приводят к изменению текста в поле.
Чтобы протестировать результаты привязки ячейки к полю со списком ComboBox1, разместите на пользовательской форме UserForm1 еще какой-нибудь элемент управления и запустите следующий код VBA Excel:
Sub Test() With UserForm1.ComboBox1 ‘Заполняем список ComboBox1 данными .List = Array(«Красный», «Оранжевый», «Желтый», _ «Зеленый», «Голубой», «Синий», «Фиолетовый») ‘Привязываем ComboBox1 к ячейке «A1» .ControlSource = «A1» ‘Открываем форму в немодальном окне End With UserForm1.Show 0 End Sub |
В результате работы кода пользовательская форма откроется в немодальном окне со значением в поле, скопированном из ячейки «A1» активного листа. Немодальное окно формы позволит редактировать ячейку «A1», не закрывая форму.
Меняйте значение ячейки «A1», нажимайте клавишу «Tab» или «Enter», поле комбинированного списка примет значение ячейки. Меняйте значение поля ComboBox1 с помощью клавиатуры или выбирайте из раскрывающегося списка, нажимайте клавишу «Tab» или «Enter», ячейка «A1» примет значение поля со списком.
Дополнительный элемент управления на форме нужен для передачи ему фокуса нажатием клавиши «Tab» или «Enter», чтобы завершить ввод значения в поле ComboBox1. Иначе новое значение поля будет передано в ячейку «A1» только при закрытии формы.
Значение ComboBox по умолчанию
В раскрывающийся список элемента управления ComboBox1 загружены названия семи основных цветов:
Private Sub UserForm_Initialize() With Me.ComboBox1 .List = Array(«Красный», «Оранжевый», «Желтый», _ «Зеленый», «Голубой», «Синий», «Фиолетовый») ‘Сюда добавляем код вставки значения по умолчанию End With End Sub |
Есть несколько вариантов сделать так, чтобы при открытии пользовательской формы в поле ComboBox1 было отображено значение по умолчанию. Код следует вставлять перед строкой «End With».
‘Вариант 1 (произвольная строка) .Value = «Моя строка по умолчанию» ‘или .Value = «Синий» ‘Вариант 2 (произвольная строка) .ControlSource = «A1» Range(«A1») = «Моя строка по умолчанию» ‘или .ControlSource = «A1» Range(«A1») = «Желтый» ‘Вариант 3 (строка из списка) .ListIndex = 0 ‘Красный ‘или .ListIndex = 3 ‘Зеленый |
Кроме значения по умолчанию, в свойства комбинированного списка можно добавить текст всплывающей подсказки, который будет отображаться при наведении на ComboBox курсора:
UserForm1.ComboBox1.ControlTipText = "Выберите значение из списка"
Извлечение информации из ComboBox
Первоначально элемент управления ComboBox открывается с пустым полем или значением по умолчанию. Свойства Value и Text в этом случае возвращают пустую строку или текст по умолчанию.
Если пользователь выбрал новое значение из раскрывающегося списка или ввел его с клавиатуры, оно перезапишет значения свойств Value и Text. Из этих свойств мы с помощью кода VBA Excel извлекаем информацию, выбранную или введенную пользователем:
Dim myTxt As String myTxt = UserForm1.ComboBox1.Value ‘или myTxt = UserForm1.ComboBox1.Text |
Вторую строку кода можно записать myTxt = UserForm1.ComboBox1
, так как Value является свойством поля со списком по умолчанию.
Если вас интересует, как извлечь значение из многостолбцового раскрывающегося списка, смотрите об этом в статье с описанием элемента управления ListBox. Извлечение данных из комбинированного поля аналогично извлечению данных из ListBox. Знакомясь со статьей, следует учесть, что у ComboBox отсутствует многострочный выбор.
Иногда перед загрузкой в ComboBox требуется отобрать уникальные элементы из имеющегося списка. Смотрите, как это сделать с помощью объектов Collection и Dictionary.
jurij271 Пользователь Сообщений: 17 |
Здравствуйте. После долгих безуспешных попыток по поиску информации для решения имеющейся проблемы решил обратиться на форум. Буду очень признателен за помощь в написании данного макроса, либо за информацию с решениями похожих задач. Изменено: jurij271 — 11.08.2014 00:27:06 |
ikki Пользователь Сообщений: 9709 |
#2 26.07.2014 11:49:06
и в чём именно Вам требуется «помощь»? я в Вашем файле даже заготовки макроса не нашёл. фрилансер Excel, VBA — контакты в профиле |
||
jurij271 Пользователь Сообщений: 17 |
#4 26.07.2014 23:07:53 Евгений, спасибо за информацию. Возможно это то, что мне нужно. Буду разбираться. ikki, спасибо за внимание к поставленной мной задаче. Извиняюсь за отсутствие конкретных проблемных вопросов — попробую их конкретизировать. Решение первой части задачи сначала пытался делать стандартным способом (создавая именованный диапазон из несмежных ячеек). Но при попытке сделать выпадающий список через проверку данных выдаётся сообщение об ошибке. Эту проблему я частично решил через промежуточный лист, на котором формируется нужный список из данных с Листа1, располагаемых в соседних ячейках. Но в данном случае в выпадающем списке появляются пусты строки, если не все ячейки с исходными данными с Листа1 заполнены. (этот способ — в файле Пример1)
Прикрепленные файлы
|
||
ikki Пользователь Сообщений: 9709 |
один доп.столбец, один доп.диапазон, два имени Прикрепленные файлы
фрилансер Excel, VBA — контакты в профиле |
jurij271 Пользователь Сообщений: 17 |
ikki, большое Вам спасибо за помощь. Буду «пристраивать» Ваше решение к моему проекту. Можно ли ещё Вас побеспокоить своими вопросами, если возникнут некоторые «подводные камни» в процессе «пристройки»? |
jurij271 Пользователь Сообщений: 17 |
ikki, «пристроил» Ваше решение к своему проекту. Поскольку в качестве образца прикладывал примерный файл, то в процессе пристройки пришлось немного изменить условие (в зависимости от содержимого ячеек). Всё работает. http://www.planetaexcel.ru/techniques/1/38/ и Николай Павлов предложил для её решения следующий макрос: Изменено: jurij271 — 31.07.2014 10:34:28 |
ikki Пользователь Сообщений: 9709 |
посмотрите вариант. фрилансер Excel, VBA — контакты в профиле |
jurij271 Пользователь Сообщений: 17 |
Уважаемый, ikki, большое Вам спасибо за решение имевшейся проблемы. |
ikki Пользователь Сообщений: 9709 |
#10 07.08.2014 15:03:41
Вы знаете, как это делать через макрос? Изменено: ikki — 11.08.2014 00:26:37 фрилансер Excel, VBA — контакты в профиле |
||
jurij271 Пользователь Сообщений: 17 |
Нет. В силу ничтожно малого опыта работы с VBA реализовать выпадающие списки через макрос я не могу. Предполагаю, что это возможно, хотя я (опять же, по причине малого опыта) могу ошибаться — ведь даже у Вас эта задача вызывает затруднение. Но в любом случае уже предложенное Вами решение можно использовать в аналогичных задачах. |
ikki Пользователь Сообщений: 9709 |
#12 07.08.2014 23:39:13
я тоже. т.к. списки короткие — можно пробовать иначе. фрилансер Excel, VBA — контакты в профиле |
||
jurij271 Пользователь Сообщений: 17 |
#13 08.08.2014 00:00:38
Что ж, будем надеяться, что у Вас появится желание реализовать имеющиеся идеи |
||
Юрий М Модератор Сообщений: 60570 Контакты см. в профиле |
#14 08.08.2014 01:39:38
Может массив не тот? )) |
||
Максим Зеленский Пользователь Сообщений: 4646 Microsoft MVP |
#15 08.08.2014 08:01:18 недавно кто-то такое решение показывал
где massiv — это собственно одномерный массив нужных строк. Изменено: Максим Зеленский — 08.08.2014 08:01:39 F1 творит чудеса |
||
Юрий М Модератор Сообщений: 60570 Контакты см. в профиле |
#16 08.08.2014 08:11:03 Я делаю так:
Arr — одномерный массив |
||
jurij271 Пользователь Сообщений: 17 |
#17 10.08.2014 23:43:30 Уважаемые старожилы форума Максим Зеленский иЮрий М, спасибо за подсказку с выпадающим списком. Попробовал адаптировать к своему проекту — получилось. Выпадающий список предметов работает. В этой части есть следующая проблема — выпадающий список не обновляется. Первым запуском макрос нормально отрабатывается, а при следующем обращении к нему выдаётся ошибка. Причина — уже имеющийся выпадающий список в ячейке. (если его удалить, макрос опять срабатывает). Пробовал перед формирующимся выпадающим списком выполнять его удаление (макросом, записанным через макрорекордер). В этом случае выпадающий список даже не формируется. Восстанавливается работоспособность удалением списка «вручную». При формировании второго выпадающего списка (зависимого) решил реализовать идею предложенную ikki, (с функцией пользователя, поскольку количество массивов для зависимых списков будут расти в геометрической прогрессии по мере роста уровней вложенности списков). Конечно, «реализовать идею» это громко сказано, так как составлял эту функцию впервые. Понимаю, что в функции есть ошибка. Нужна корректировка профессионала … Прикрепленные файлы
|
You’re VBA Combo Box Cheat Sheet
In this post I am going to share everything I know about using VBA with an Excel Form Control Combo Box (aka drop down). Most of the code is very self-explanatory so I will not write much of a description. However, some of the syntax can be a little tricky so pay close attention to how the code is structured. Please feel free to post comments if I missed an area or you have any questions! Enjoy
Creating & Sizing/Positioning A Combo Box
Sub ComboBox_Create()
‘PURPOSE: Create a form control combo box and position/size it
Dim Cell As Range
Dim sht As Worksheet
Set sht = ThisWorkbook.Worksheets(«Sheet1»)
‘Create
sht.DropDowns.Add(0, 0, 100, 15).Name = «Combo Box 1»
‘Create & Dimension to a Specific Cell
Set Cell = Range(«B5»)
With Cell
sht.DropDowns.Add(.Left, .Top, .Width, .Height).Name = «Combo Box 2»
End With
‘Create & Dimension to a Specific Cell Range
Set Cell = Range(«B8:D8»)
With Cell
sht.DropDowns.Add(.Left, .Top, .Width, .Height).Name = «Combo Box 3»
End With
End Sub
Deleting A Combo Box
Sub ComboBox_Delete()
‘PURPOSE: Delete a form control combo box
Dim sht As Worksheet
Set sht = ThisWorkbook.Worksheets(«Sheet1»)
sht.Shapes(«Combo Box 1»).Delete
End Sub
Adding Values To A Combo Box
Sub ComboBox_InputRange()
‘PURPOSE: Add values to your drop down list
Dim Cell As Range
Dim sht As Worksheet
Dim myArray As Variant
Dim myDropDown As Shape
Set sht = ThisWorkbook.Worksheets(«Sheet1»)
Set myDropDown = sht.Shapes(«Combo Box 1»)
myArray = Array(«Q1», «Q2», «Q3», «Q4»)
‘Based on data in a range (not linked)
MyDropDown.ControlFormat.List = sht.Range(«A1:A4»).Value
‘Linked to data in a range (automatically changes based on current cell values)
myDropDown.ControlFormat.ListFillRange = «A1:A4»
‘Based on Array values (written out)
MyDropDown.ControlFormat.List = _
Array(«Q1», «Q2», «Q3», «Q4»)
‘Based on Array values (variable)
myDropDown.OLEFormat.Object.List = myArray
‘Add one by one
With myDropDown.ControlFormat
.AddItem «Q1»
.AddItem «Q2»
.AddItem «Q3»
.AddItem «Q4»
End With
End Sub
Overriding Values In The Drop Down List
Sub ComboBox_ReplaceValue()
‘PURPOSE: Replace value of the third item in the drop down list
Worksheets(«Sheet1»).Shapes(«Combo Box 1»).ControlFormat.List(3) = «FY»
End Sub
Removing Values From The Drop Down List
Sub ComboBox_RemoveValues()
‘PURPOSE: Remove a value(s) from the drop down list
Dim Cell As Range
Dim sht As Worksheet
Set sht = ThisWorkbook.Worksheets(«Sheet1»)
‘Remove A Single Item
sht.Shapes(«Combo Box 1»).ControlFormat.RemoveItem 2
‘Remove All Items
sht.Shapes(«Combo Box 1»).ControlFormat.RemoveAllItems
End Sub
Determine Current Selected Value From The Drop Down List
Sub ComboBox_GetSelection()
‘PURPOSE: Determine current selected value in ComboBox
Dim sht As Worksheet
Dim myDropDown As Shape
Set sht = ThisWorkbook.Worksheets(«Sheet1»)
Set myDropDown = sht.Shapes(«Combo Box 1»)
With myDropDown.ControlFormat
MsgBox «Item Number: » & .Value & vbNewLine & «Item Name: » & .List(.Value)
End With
End Sub
Select A Value From The Drop Down List
Sub ComboBox_SelectValue()
‘PURPOSE: Automatically select a value from the drop down list
Dim Cell As Range
Dim sht As Worksheet
Dim Found As Boolean
Dim SetTo As String
Dim x As Long
Set sht = ThisWorkbook.Worksheets(«Sheet1»)
‘Select First List Item
sht.Shapes(«Combo Box 1»).ControlFormat.ListIndex = 3
‘Select Item based on list Name/Value
SetTo = «Q2»
With sht.Shapes(«Combo Box 1»).ControlFormat
For x = 1 To .ListCount
If .List(x) = SetTo Then
Found = True
Exit For
Next x
If Found = True Then .ListIndex = x
End With
End Sub
Link User’s Selection To A Cell (Outputs Numerical List Position)
Sub ComboBox_CellLink()
‘PURPOSE: Output the selection’s list position to a specific cell
Dim sht As Worksheet
Set sht = ThisWorkbook.Worksheets(«Sheet1»)
sht.Shapes(«Combo Box 1»).ControlFormat.LinkedCell = «$A$1»
End Sub
Adjust Drop Down Lines For A Combo Box
Sub ComboBox_DropDownLines()
‘PURPOSE: Set how many drop down lines are visible per scroll
Dim sht As Worksheet
Set sht = ThisWorkbook.Worksheets(«Sheet1»)
sht.Shapes(«Combo Box 1»).ControlFormat.DropDownLines = 12
End Sub
Toggle On/Off 3D Shading
Sub ComboBox_3DShading()
‘PURPOSE: Turn 3D shading on or off
Dim sht As Worksheet
Set sht = ThisWorkbook.Worksheets(«Sheet1»)
‘Turn 3D Shading On
sht.Shapes(«Combo Box 1»).OLEFormat.Object.Display3DShading = True
‘Turn 3D Shading Off
sht.Shapes(«Combo Box 1»).OLEFormat.Object.Display3DShading = False
End Sub
Assigning A Macro To A Combo Box
Sub ComboBox_AssignMacro()
‘PURPOSE: Assign a macro to be triggered when drop down is changed
Dim sht As Worksheet
Set sht = ThisWorkbook.Worksheets(«Sheet1»)
sht.Shapes(«Combo Box 1»).OnAction = «Macro1»
End Sub
Any Others?
If I’ve missed any VBA functionalities please leave a comment in the comments section below so I can continue to grow this list of combo box code! I look forward to hearing your thoughts.
About The Author
Hey there! I’m Chris and I run TheSpreadsheetGuru website in my spare time. By day, I’m actually a finance professional who relies on Microsoft Excel quite heavily in the corporate world. I love taking the things I learn in the “real world” and sharing them with everyone here on this site so that you too can become a spreadsheet guru at your company.
Through my years in the corporate world, I’ve been able to pick up on opportunities to make working with Excel better and have built a variety of Excel add-ins, from inserting tickmark symbols to automating copy/pasting from Excel to PowerPoint. If you’d like to keep up to date with the latest Excel news and directly get emailed the most meaningful Excel tips I’ve learned over the years, you can sign up for my free newsletters. I hope I was able to provide you with some value today and I hope to see you back here soon!
— Chris
Founder, TheSpreadsheetGuru.com
Добрый день гуру excel!!!
Я не так часто пишу что-то в макросах, однако сейчас встала такая вот задача и я столкнулся с проблемой. Поиски решений в интернете не дали результата. Хотя несколько близких тем я нашел.
Здесь вот чувак бился над похожей задачей, но как он ее разрешил я все же разобрать не смог. https://stackoverflow.com/questio….-variab
Я опишу задачу в двух словах. У меня есть книга, в ней есть два листа. Лист — «Карточка Клиента» с программным именем Client_Card и Лист — «Данные» c программным именем staff_list.
На Листе1 есть табличка, в нескольких ее ячейках я хочу вывести выпадающие списки.
На листе2 храниться данные для выпадающего списка.
Я хочу использовать объект Range, который бы позволил мне меняться в случаи увеличения значений в списке
Я кстати пробовал вставить списки используя диапазон… но это тоже не сработало. Видимо нужно конкретно в ячейку вставлять.
[vba]
Код
With Client_Card.Range(Client_Card.Cells(14, 3), Client_Card.Cells(27, 3)).Validation
[/vba]
Я создал в книге с примером код. Как раз тот который работать не хочет.
Я пробовал просто вставлять в
[vba]
Код
…. Formula1:=staff_list.Range(staff_list.Cells(2, 1), staff_list.Cells(9, 1)).Value ‘но так оно не работает.
[/vba]
[vba]
Код
With Client_Card.Cells(14, 3).Validation
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:=staff_list.Range(staff_list.Cells(2, 1), staff_list.Cells(9, 1)).Value
End With
[/vba]
Пробовал через переменную… но так тоже не работает
[vba]
Код
Private Sub CommandButton1_Click()
Dim bbbb As String
bbbb = staff_list.Range(staff_list.Cells(2, 1), staff_list.Cells(9, 1)).Value ‘
With Cells(14, 3).Validation
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:=»=bbbb»
End With
End Sub
[/vba]
Я подозреваю что список этот, в переменной необходимо подать через запятую… то есть видимо его надо прогнать через массив, где каждому значению подставить запятую и сформировать конечную переменную со всеми значениями через запятую.
Но я пока не стал так делать, в надежде что есть более простой способ, а я просто туплю…
В обще я хочу формировать данный выпадающие список на листе «Карточка клиента», при запуске книги. Но это потом, сейчас хотелось бы его заставить код работать
based on examples above and examples found on other sites, I created a generic procedure and some examples.
'Simple helper procedure to create a dropdown in a cell based on a list of values in a range
'ValueSheetName : the name of the sheet containing the value range
'ValueRangeString : the range on the sheet with name ValueSheetName containing the values for the dropdown
'CreateOnSheetName : the name of the sheet where the dropdown needs to be created
'CreateInRangeString : the range where the dropdown needs to be created
'FieldName As String : a name of the dropdown, will be used in the inputMessage and ErrorMessage
'See example below ExampleCreateDropDown
Public Sub CreateDropDown(ValueSheetName As String, ValueRangeString As String, CreateOnSheetName As String, CreateInRangeString As String, FieldName As String)
Dim ValueSheet As Worksheet
Set ValueSheet = Worksheets(ValueSheetName) 'The sheet containing the values
Dim ValueRange As Range: Set ValueRange = ValueSheet.Range(ValueRangeString) 'The range containing the values
Dim CreateOnSheet As Worksheet
Set CreateOnSheet = Worksheets(CreateOnSheetName) 'The sheet containing the values
Dim CreateInRange As Range: Set CreateInRange = CreateOnSheet.Range(CreateInRangeString)
Dim InputTitle As String: InputTitle = "Please Select a Value"
Dim InputMessage As String: InputMessage = "for " & FieldName
Dim ErrorTitle As String: ErrorTitle = "Please Select a Value"
Dim ErrorMessage As String: ErrorMessage = "for " & FieldName
Dim ShowInput As Boolean: ShowInput = True 'Show input message on hover
Dim ShowError As Boolean: ShowError = True 'Show error message on error
Dim ValidationType As XlDVType: ValidationType = xlValidateList
Dim ValidationAlertStyle As XlDVAlertStyle: ValidationAlertStyle = xlValidAlertStop 'Stop on invalid value
Dim ValidationOperator As XlFormatConditionOperator: ValidationOperator = xlEqual 'Value must be equal to one of the Values from the ValidationFormula1
Dim ValidationFormula1 As Variant: ValidationFormula1 = "=" & ValueSheetName & "!" & ValueRange.Address 'Formula referencing the values from the ValueRange
Dim ValidationFormula2 As Variant: ValidationFormula2 = ""
Call CreateDropDownWithValidationInCell(CreateInRange, InputTitle, InputMessage, ErrorTitle, ErrorMessage, ShowInput, ShowError, ValidationType, ValidationAlertStyle, ValidationOperator, ValidationFormula1, ValidationFormula2)
End Sub
'An example using the ExampleCreateDropDown
Private Sub ExampleCreateDropDown()
Call CreateDropDown(ValueSheetName:="Test", ValueRangeString:="C1:C5", CreateOnSheetName:="Test", CreateInRangeString:="B1", FieldName:="test2")
End Sub
'The full option function if you need more configurable options
'To create a dropdown in a cell based on a list of values in a range
'Validation: https://msdn.microsoft.com/en-us/library/office/ff840078.aspx
'ValidationTypes: XlDVType https://msdn.microsoft.com/en-us/library/office/ff840715.aspx
'ValidationAlertStyle: XlDVAlertStyle https://msdn.microsoft.com/en-us/library/office/ff841223.aspx
'XlFormatConditionOperator https://msdn.microsoft.com/en-us/library/office/ff840923.aspx
'See example below ExampleCreateDropDownWithValidationInCell
Public Sub CreateDropDownWithValidationInCell(CreateInRange As Range, _
Optional InputTitle As String = "", _
Optional InputMessage As String = "", _
Optional ErrorTitle As String = "", _
Optional ErrorMessage As String = "", _
Optional ShowInput As Boolean = True, _
Optional ShowError As Boolean = True, _
Optional ValidationType As XlDVType = xlValidateList, _
Optional ValidationAlertStyle As XlDVAlertStyle = xlValidAlertStop, _
Optional ValidationOperator As XlFormatConditionOperator = xlEqual, _
Optional ValidationFormula1 As Variant = "", _
Optional ValidationFormula2 As Variant = "")
With CreateInRange.Validation
.Delete
.Add Type:=ValidationType, AlertStyle:=ValidationAlertStyle, Operator:=ValidationOperator, Formula1:=ValidationFormula1, Formula2:=ValidationFormula2
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = InputTitle
.ErrorTitle = ErrorTitle
.InputMessage = InputMessage
.ErrorMessage = ErrorMessage
.ShowInput = ShowInput
.ShowError = ShowError
End With
End Sub
'An example using the CreateDropDownWithValidationInCell
Private Sub ExampleCreateDropDownWithValidationInCell()
Dim ValueSheetName As String: ValueSheetName = "Hidden" 'The sheet containing the values
Dim ValueRangeString As String: ValueRangeString = "C7:C9" 'The range containing the values
Dim CreateOnSheetName As String: CreateOnSheetName = "Test" 'The sheet containing the dropdown
Dim CreateInRangeString As String: CreateInRangeString = "A1" 'The range containing the dropdown
Dim ValueSheet As Worksheet
Set ValueSheet = Worksheets(ValueSheetName)
Dim ValueRange As Range: Set ValueRange = ValueSheet.Range(ValueRangeString)
Dim CreateOnSheet As Worksheet
Set CreateOnSheet = Worksheets(CreateOnSheetName)
Dim CreateInRange As Range: Set CreateInRange = CreateOnSheet.Range(CreateInRangeString)
Dim FieldName As String: FieldName = "Testing Dropdown"
Dim InputTitle As String: InputTitle = "Please Select a value"
Dim InputMessage As String: InputMessage = "for " & FieldName
Dim ErrorTitle As String: ErrorTitle = "Please Select a value"
Dim ErrorMessage As String: ErrorMessage = "for " & FieldName
Dim ShowInput As Boolean: ShowInput = True
Dim ShowError As Boolean: ShowError = True
Dim ValidationType As XlDVType: ValidationType = xlValidateList
Dim ValidationAlertStyle As XlDVAlertStyle: ValidationAlertStyle = xlValidAlertStop
Dim ValidationOperator As XlFormatConditionOperator: ValidationOperator = xlEqual
Dim ValidationFormula1 As Variant: ValidationFormula1 = "=" & ValueSheetName & "!" & ValueRange.Address
Dim ValidationFormula2 As Variant: ValidationFormula2 = ""
Call CreateDropDownWithValidationInCell(CreateInRange, InputTitle, InputMessage, ErrorTitle, ErrorMessage, ShowInput, ShowError, ValidationType, ValidationAlertStyle, ValidationOperator, ValidationFormula1, ValidationFormula2)
End Sub