Запрет ввода с клавиатуры во все выпадающие списки UserForm в Excel VBA

Чтобы запретить ввод с клавиатуры сразу во все выпадающие списки пользовательской формы в 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
				
			

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

Варианты применения

				
					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
				
			

Создать новый класс модуль (например, с названием 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
				
			

Если нужно разрешить ввод, и при этом проверять его на присутствие в выпадающем списке:

				
					Private Sub ComboBox1_Change()
    If ComboBox1.ListIndex = -1 Then 'Если введено значение не из списка
        ComboBox1.Text = ComboBox1.OldValue 'Восстанавливаем предыдущее значение
    End If
End Sub
				
			
Telegram
VK
Email
Прокрутить вверх