Private Sub UserForm_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
это событие,и его надо поместить в код формы :)Private Sub object_KeyDown( ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As fmShiftState)
Почему в вашем примере "ByVal Shift As Integer" работает, а "ByVal Shift As fmShiftState" из справки нет?П.С. Очередное пояснение для "суперпрограммистов", каких же, как я сам : код клавиш в формате ASCII нашел в объектном браузере в разделе "KeyCodeConstants", при наведении, например, на "vbKey0", пишется что "vbKey0 = 48".Так если нашли константы, так и используйте их, а не число:)
Так если нашли константы, так и используйте их, а не число:)
Например как сделать так, чтобы при нажатии "Esc" закрывалась открытая ранее форма.Если я правильно понял, то в VBA такое программировать не нужно. Если свойство Cancel кнопки, которая закрывает форму, установить в True (по умолчанию False), то при нажатии клавиши "Esc" форма закрывается, где бы фокус не находился...
Т.е. помимо свойства Cancel надо на обработку события нажатия кнопки написать код закрытия формы.Совершенно верно..) Я ведь и написал, что это свойство устанавливается для той кнопки, которая закрывает форму. Я думаю, что на форме практически всегда есть кнопка для ее закрытия...
Я ведь и написал, что это свойство устанавливается для той кнопки, которая закрывает форму.Да это я по аналогии с .NET. Там можно вообще дополнительного кода не писать, для того, чтобы по нажатии на Esc форма закрывалась. По инерции и в VBA так же попробовал, а про обработку события не подумал сначала.
2. Как использовать событие инвентора: KeyboardEvents.OnKeyPress Event?Для обработки событий в АИ в VBA используются модули классов. Если кратко, в папке Class Modules создается модуль Class1:
Private WithEvents oInteraction As InteractionEvents
Private WithEvents myKey As KeyboardEvents
Private Sub Class_Initialize()
Set oInteraction = ThisApplication.CommandManager.CreateInteractionEvents
Set myKey = oInteraction.KeyboardEvents
oInteraction.Start
End Sub
Private Sub Class_Terminate()
If Not oInteraction Is Nothing Then
oInteraction.Stop
Set myKey = Nothing
End If
End Sub
Private Sub myKey_OnKeyDown(ByVal Key As Long, ByVal ShiftKeys As ShiftStateEnum)
If Key > 31 Then MsgBox Chr(Key)
If Key = 27 Then
If Not oInteraction Is Nothing Then
oInteraction.Stop
Set myKey = Nothing
Set oInteraction = Nothing
Class_Terminate
End If
End If
End Sub
В память он грузится процедурой в обычном модуле:Dim myKeyEvent As Class1
Sub KeyEvent()
If Not myKeyEvent Is Nothing Then
Set myKeyEvent = Nothing
Set myKeyEvent = New Class1
Else
Set myKeyEvent = New Class1
End If
End Sub
На форуме cad.ru я не раз об этом писал, поищи по словам Класс модуль...