Чтобы запретить ввод с клавиатуры сразу во все выпадающие списки пользовательской формы в Excel VBA, можно использовать свойство Style = fmStyleDropDownList
, для этого:
- Alt-F11 — открываем свой VBAProject с пользовательской формой
- открываем код формы: двойной клик левой кл. на чистом поле формы, или через меню Window — выбираем [имя вашей UsreForm] (Code)

- ищем фрагмент с Private Sub UserForm_Initialize() и вставляем на его место следующий код:
Private Sub UserForm_Initialize()
Dim ctrl As Control
' Перебираем все элементы управления на форме
For Each ctrl In Me.Controls
' Если это ComboBox
If TypeName(ctrl) = "ComboBox" Then
' Запрещаем ввод с клавиатуры
ctrl.Style = fmStyleDropDownList
End If
Next ctrl
End Sub
Это полностью отключает возможность ввода текста, оставляя только выбор из списка. Поиск по первым буквам продолжает работать.
Варианты применения
1. Обработка события KeyPress для каждого ComboBox
Private Sub ComboBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
KeyAscii = 0 ' Запрещаем ввод
End Sub
Private Sub ComboBox2_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
KeyAscii = 0
End Sub
' ... и так для каждого ComboBox
2. Создание класса-обработчика для всех ComboBox
Создать новый класс модуль (например, с названием ComboBoxHandler
)
Добавить в него следующий код:
Public WithEvents Combo As MSForms.ComboBox
Private Sub Combo_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
KeyAscii = 0 ' Запрещаем ввод
End Sub
В коде UserForm добавить:
Dim colComboHandlers As Collection
Private Sub UserForm_Initialize()
Dim ctrl As Control
Dim handler As ComboBoxHandler
Set colComboHandlers = New Collection
' Перебираем все элементы управления на форме
For Each ctrl In Me.Controls
' Если это ComboBox
If TypeName(ctrl) = "ComboBox" Then
' Создаем обработчик
Set handler = New ComboBoxHandler
Set handler.Combo = ctrl
colComboHandlers.Add handler
End If
Next ctrl
End Sub
3. Восстановление выбранного значения при изменении
Если нужно разрешить ввод, и при этом проверять его на присутствие в выпадающем списке:
Private Sub ComboBox1_Change()
If ComboBox1.ListIndex = -1 Then 'Если введено значение не из списка
ComboBox1.Text = ComboBox1.OldValue 'Восстанавливаем предыдущее значение
End If
End Sub
Telegram
VK
Email
Post Views:
44