Здравствуйте. Вопрос простой, собственно в теме он и указан. Хочу сделать форму, где действия будут осуществляться через кнопки клавиатуры. Часть действий заключается в воде сиволов. Т.к. при использование TextBox у меня не получается получать код нажатых клавишь, я заменил поля для текста на Lebel. С кнопка стрелок, PageUp, PageDown и Del создание нужных мне действий не составит труда, а вот с цыфрами Num от 0 до 9, нужно что бы KeyCode преобразовыволся обратно в значение нажатой клавиши. Пытался найти в инете, но в большинстве результатов поиска вообще не рассказывалось про это, в других нерабочие методы.
Вот код, где я хочу это реализовать [vba]
Код
Private Sub UserForm_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) Dim z As Long '------------------------- 'Цифры Клава NumPad '7 8 9 55 56 57 103 104 105 '4 5 6 52 53 54 100 101 102 '1 2 3 49 50 51 97 98 99 '0 48 96 '------------------------- 'Направления 'Лево 37 Home 36 'Верх 38 End 35 'Право 39 PageUp 33 'Низ 40 PageDown 34 '------------------------- 'Действия 'Enter 13 'Esc 27 'Delete 46 'Backspace 8 'Num + 107 'Num - 109 '------------------------- z = KeyCode 'Цифры If z > 95 And z < 106 Then Debug.Print Chr(z) 'Chr выдает другой символ End If End Sub
[/vba]
Здравствуйте. Вопрос простой, собственно в теме он и указан. Хочу сделать форму, где действия будут осуществляться через кнопки клавиатуры. Часть действий заключается в воде сиволов. Т.к. при использование TextBox у меня не получается получать код нажатых клавишь, я заменил поля для текста на Lebel. С кнопка стрелок, PageUp, PageDown и Del создание нужных мне действий не составит труда, а вот с цыфрами Num от 0 до 9, нужно что бы KeyCode преобразовыволся обратно в значение нажатой клавиши. Пытался найти в инете, но в большинстве результатов поиска вообще не рассказывалось про это, в других нерабочие методы.
Вот код, где я хочу это реализовать [vba]
Код
Private Sub UserForm_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) Dim z As Long '------------------------- 'Цифры Клава NumPad '7 8 9 55 56 57 103 104 105 '4 5 6 52 53 54 100 101 102 '1 2 3 49 50 51 97 98 99 '0 48 96 '------------------------- 'Направления 'Лево 37 Home 36 'Верх 38 End 35 'Право 39 PageUp 33 'Низ 40 PageDown 34 '------------------------- 'Действия 'Enter 13 'Esc 27 'Delete 46 'Backspace 8 'Num + 107 'Num - 109 '------------------------- z = KeyCode 'Цифры If z > 95 And z < 106 Then Debug.Print Chr(z) 'Chr выдает другой символ End If End Sub
jun, нет, не то. Меня интересует, нет ли какой другой функции из разряда Chr, которая превращала бы код NuPad клавиш в значение этих клавиш. Нажимаю Num 1, код KeyCode=97, а Chr(97) выдает "a" и т.д.. А мне надо обратно "Num 1" получить.
jun, нет, не то. Меня интересует, нет ли какой другой функции из разряда Chr, которая превращала бы код NuPad клавиш в значение этих клавиш. Нажимаю Num 1, код KeyCode=97, а Chr(97) выдает "a" и т.д.. А мне надо обратно "Num 1" получить.ZetMenChavo
Решил пойти обходным путём, просто вычитать из кода клавиш нумпада 48, что бы код соответсвовал коду чисел. [vba]
Код
Private Sub UserForm_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) '------------------------- 'Цифры Клава NumPad '7 8 9 55 56 57 103 104 105 '4 5 6 52 53 54 100 101 102 '1 2 3 49 50 51 97 98 99 '0 48 96 '------------------------- z = KeyCode '========================= 'Цифры If (z > 47 And z < 58) Or (z > 95 And z < 106) Then If z > 95 Then z = z - 48 t = t & Chr(z) If t = 0 Then t = "" End If End Sub
[/vba] В прикрепленном файле упрощенная версия формы, которую я хотел получить.
Хоть и нашел выход, но в плане изучения VBA, всё равно хотелось бы узнать, есть ли прямой способ получить из, к примеру, кода 97 нумпадовскую цифру 1 или такой функции в VBA нет?
Решил пойти обходным путём, просто вычитать из кода клавиш нумпада 48, что бы код соответсвовал коду чисел. [vba]
Код
Private Sub UserForm_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) '------------------------- 'Цифры Клава NumPad '7 8 9 55 56 57 103 104 105 '4 5 6 52 53 54 100 101 102 '1 2 3 49 50 51 97 98 99 '0 48 96 '------------------------- z = KeyCode '========================= 'Цифры If (z > 47 And z < 58) Or (z > 95 And z < 106) Then If z > 95 Then z = z - 48 t = t & Chr(z) If t = 0 Then t = "" End If End Sub
[/vba] В прикрепленном файле упрощенная версия формы, которую я хотел получить.
Хоть и нашел выход, но в плане изучения VBA, всё равно хотелось бы узнать, есть ли прямой способ получить из, к примеру, кода 97 нумпадовскую цифру 1 или такой функции в VBA нет?ZetMenChavo
jun, не, это тоже самое что и раньше. Саздайте форму с этим макросом, Ctrl+G чтоб открыть окно immediate, и в запущенной форме понажимайте кнопки нумпада. В immediate будет видно что Chr выдает другие символы, чем те что были нажаты.
[vba]
Код
Private Sub UserForm_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) Debug.Print KeyCode Debug.Print Chr(KeyCode) Debug.Print Chr$(KeyCode) Debug.Print ChrB(KeyCode) Debug.Print ChrB$(KeyCode) Debug.Print ChrW(KeyCode) Debug.Print ChrW$(KeyCode) End Sub
[/vba]
jun, не, это тоже самое что и раньше. Саздайте форму с этим макросом, Ctrl+G чтоб открыть окно immediate, и в запущенной форме понажимайте кнопки нумпада. В immediate будет видно что Chr выдает другие символы, чем те что были нажаты.
[vba]
Код
Private Sub UserForm_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) Debug.Print KeyCode Debug.Print Chr(KeyCode) Debug.Print Chr$(KeyCode) Debug.Print ChrB(KeyCode) Debug.Print ChrB$(KeyCode) Debug.Print ChrW(KeyCode) Debug.Print ChrW$(KeyCode) End Sub
jun, AscW то ли не работает, то ли я не понял как её использовать, но я смог разобраться как добиться желаемого. Надо вместо KeyDown использовать KeyPress, и соответсвенно вместо KeyCode - KeyAscii, тогда Chr правильно начинает выдавать символ, который был нажат на клавиатуре. Правда только русская раскладка этому макросу не нравиться, выдает ошибку. И стрелки с 6ю кнопками над ними, не видит.
[vba]
Код
Private Sub UserForm_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) Debug.Print KeyAscii Debug.Print Chr(KeyAscii) Debug.Print Chr$(KeyAscii) Debug.Print ChrW(KeyAscii) Debug.Print ChrW$(KeyAscii) End Sub
[/vba]
jun, AscW то ли не работает, то ли я не понял как её использовать, но я смог разобраться как добиться желаемого. Надо вместо KeyDown использовать KeyPress, и соответсвенно вместо KeyCode - KeyAscii, тогда Chr правильно начинает выдавать символ, который был нажат на клавиатуре. Правда только русская раскладка этому макросу не нравиться, выдает ошибку. И стрелки с 6ю кнопками над ними, не видит.
[vba]
Код
Private Sub UserForm_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) Debug.Print KeyAscii Debug.Print Chr(KeyAscii) Debug.Print Chr$(KeyAscii) Debug.Print ChrW(KeyAscii) Debug.Print ChrW$(KeyAscii) End Sub
jun, это всё равно то же самое даёт. Как и писал выше, если и делать макрос через KeyDown, то единственный способ вернуть значение нажатой цифры можно только так [vba]
Код
Private Sub UserForm_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) '------------------------- 'Цифры 0 1 2 3 4 5 6 7 8 9 'Клава код 48 49 50 51 52 53 54 55 56 57 'NumPad код 96 97 98 99 100 101 102 103 104 105 '------------------------- Dim z As Long z = KeyCode If z > 95 Then z = z - 48 MsgBox "Нажата цифра " & Chr(z) End Sub
[/vba]
jun, это всё равно то же самое даёт. Как и писал выше, если и делать макрос через KeyDown, то единственный способ вернуть значение нажатой цифры можно только так [vba]
Код
Private Sub UserForm_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) '------------------------- 'Цифры 0 1 2 3 4 5 6 7 8 9 'Клава код 48 49 50 51 52 53 54 55 56 57 'NumPad код 96 97 98 99 100 101 102 103 104 105 '------------------------- Dim z As Long z = KeyCode If z > 95 Then z = z - 48 MsgBox "Нажата цифра " & Chr(z) End Sub