Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Получение символа из значения KeyCode - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Получение символа из значения KeyCode
ZetMenChavo Дата: Среда, 08.06.2022, 20:54 | Сообщение № 1
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 165
Репутация: 7 ±
Замечаний: 0% ±

Excel 2010
Здравствуйте. Вопрос простой, собственно в теме он и указан.
Хочу сделать форму, где действия будут осуществляться через кнопки клавиатуры. Часть действий заключается в воде сиволов.
Т.к. при использование 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]


Сообщение отредактировал ZetMenChavo - Четверг, 09.06.2022, 19:01
 
Ответить
СообщениеЗдравствуйте. Вопрос простой, собственно в теме он и указан.
Хочу сделать форму, где действия будут осуществляться через кнопки клавиатуры. Часть действий заключается в воде сиволов.
Т.к. при использование 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]

Автор - ZetMenChavo
Дата добавления - 08.06.2022 в 20:54
jun Дата: Пятница, 10.06.2022, 12:31 | Сообщение № 2
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 145
Репутация: 43 ±
Замечаний: 0% ±

ZetMenChavo, приветствую!
Не совсем понятна задача, попробуйте:
добавьте на форму один textbox и в код формы добавьте:
[vba]
Код
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
        MsgBox "Нажата клавиша - " & ChrW(KeyCode) & vbLf & "код символа - " & KeyCode
        TextBox1.Text = ""
End Sub
[/vba]
 
Ответить
СообщениеZetMenChavo, приветствую!
Не совсем понятна задача, попробуйте:
добавьте на форму один textbox и в код формы добавьте:
[vba]
Код
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
        MsgBox "Нажата клавиша - " & ChrW(KeyCode) & vbLf & "код символа - " & KeyCode
        TextBox1.Text = ""
End Sub
[/vba]

Автор - jun
Дата добавления - 10.06.2022 в 12:31
ZetMenChavo Дата: Пятница, 10.06.2022, 15:19 | Сообщение № 3
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 165
Репутация: 7 ±
Замечаний: 0% ±

Excel 2010
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
Дата добавления - 10.06.2022 в 15:19
ZetMenChavo Дата: Пятница, 10.06.2022, 15:53 | Сообщение № 4
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 165
Репутация: 7 ±
Замечаний: 0% ±

Excel 2010
Решил пойти обходным путём, просто вычитать из кода клавиш нумпада 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 нет?
К сообщению приложен файл: 3061610.xlsm (18.3 Kb)
 
Ответить
СообщениеРешил пойти обходным путём, просто вычитать из кода клавиш нумпада 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
Дата добавления - 10.06.2022 в 15:53
jun Дата: Пятница, 10.06.2022, 15:59 | Сообщение № 5
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 145
Репутация: 43 ±
Замечаний: 0% ±

Меня интересует, нет ли какой другой функции из разряда Chr, которая превращала бы код NuPad клавиш в значение этих клавиш

https://docs.microsoft.com/ru-ru....net-6.0
не подходит? Или я что-то не понимаю :(
 
Ответить
Сообщение
Меня интересует, нет ли какой другой функции из разряда Chr, которая превращала бы код NuPad клавиш в значение этих клавиш

https://docs.microsoft.com/ru-ru....net-6.0
не подходит? Или я что-то не понимаю :(

Автор - jun
Дата добавления - 10.06.2022 в 15:59
ZetMenChavo Дата: Пятница, 10.06.2022, 17:19 | Сообщение № 6
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 165
Репутация: 7 ±
Замечаний: 0% ±

Excel 2010
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
[/vba]

Автор - ZetMenChavo
Дата добавления - 10.06.2022 в 17:19
jun Дата: Пятница, 10.06.2022, 17:32 | Сообщение № 7
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 145
Репутация: 43 ±
Замечаний: 0% ±

Может:
[vba]
Код
AscW
[/vba]
сможет помочь?
 
Ответить
СообщениеМожет:
[vba]
Код
AscW
[/vba]
сможет помочь?

Автор - jun
Дата добавления - 10.06.2022 в 17:32
ZetMenChavo Дата: Пятница, 10.06.2022, 17:43 | Сообщение № 8
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 165
Репутация: 7 ±
Замечаний: 0% ±

Excel 2010
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]


Сообщение отредактировал ZetMenChavo - Пятница, 10.06.2022, 17:44
 
Ответить
Сообщение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]

Автор - ZetMenChavo
Дата добавления - 10.06.2022 в 17:43
jun Дата: Пятница, 10.06.2022, 17:50 | Сообщение № 9
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 145
Репутация: 43 ±
Замечаний: 0% ±

ZetMenChavo, можно, например так:
[vba]
Код
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
        If ChrW(KeyCode) Like "[abcdefg]" Then
            MsgBox "Нажата клавиша - " & Chr(KeyCode) & vbLf & "код символа - " & AscW(Chr(KeyCode))
        Else

            MsgBox "Нажата клавиша - " & ChrW(KeyCode) & vbLf & "код символа - " & KeyCode
        End If
End Sub
[/vba]
 
Ответить
СообщениеZetMenChavo, можно, например так:
[vba]
Код
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
        If ChrW(KeyCode) Like "[abcdefg]" Then
            MsgBox "Нажата клавиша - " & Chr(KeyCode) & vbLf & "код символа - " & AscW(Chr(KeyCode))
        Else

            MsgBox "Нажата клавиша - " & ChrW(KeyCode) & vbLf & "код символа - " & KeyCode
        End If
End Sub
[/vba]

Автор - jun
Дата добавления - 10.06.2022 в 17:50
ZetMenChavo Дата: Пятница, 10.06.2022, 18:06 | Сообщение № 10
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 165
Репутация: 7 ±
Замечаний: 0% ±

Excel 2010
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]


Сообщение отредактировал ZetMenChavo - Пятница, 10.06.2022, 18:07
 
Ответить
Сообщение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]

Автор - ZetMenChavo
Дата добавления - 10.06.2022 в 18:06
jun Дата: Пятница, 10.06.2022, 18:10 | Сообщение № 11
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 145
Репутация: 43 ±
Замечаний: 0% ±

ZetMenChavo, вы правы.
Заработался сегодня я. %)
 
Ответить
СообщениеZetMenChavo, вы правы.
Заработался сегодня я. %)

Автор - jun
Дата добавления - 10.06.2022 в 18:10
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!