Страницы: 1
RSS
Функция смены раскладки клавиатуры. Работоспособность в 32, 64-разрядных Офисах
 
Всем - Здравствуйте!
На просторах Интернета нашел функцию для смены раскладки клавиатуры рус-англ. С успехом применил функцию при инициализации всех UserFofm (везде вставлял Call KBDToRUS). Однако, данная функция не работает на 64-рязрядных версиях Office (например, 2016 офис). Прошу помочь в корректировке кода для универсального использования на любой версии Office. Подобную тему уже разбирали дважды на форуме, но мой опыт программирования на VBA не помогает мне во всем разобраться самому)(.
Код
Declare Function LoadKeyboardLayout Lib "user32" Alias _
"LoadKeyboardLayoutA" (ByVal pwszKLID As String, ByVal flags As Long) As Long 
 
'' Переключение на английскую раскладку
Function KBDToENG()
Call LoadKeyboardLayout("00000409", &H1)
End Function 
 
'' Переключение на русскую раскладку
Function KBDToRUS()
Call LoadKeyboardLayout("00000419", &H1)
End Function
 
Замените строку
Код
Private Declare Function ActivateKeyboardLayout Lib "user32" (ByVal HKL As Long, ByVal flags As Long) As Long


на строки
[CODE]#If VBA7 Then
   Private Declare PtrSafe Function ActivateKeyboardLayout Lib "user32" (ByVal HKL As LongPtr, ByVal flags As LongPtr) As LongPtr
#Else
   Private Declare Function ActivateKeyboardLayout Lib "user32" (ByVal HKL As Long, ByVal flags As Long) As Long
#End If[/CODE
и код слегка подправьте, чтобы вместо строк передавались числа
https://excelvba.ru/code/KeyboardLayout
Изменено: Игорь - 25.03.2019 10:12:55
 
Спасибо! Сейчас попробую!
Цитата
и код слегка подправьте, чтобы вместо строк передавались числа
Можно объяснить , что с кодом поправить надо? Я ведь еще только учусь).

У меня при открытии любой UserForm в программе в код вставлено выполнение макроса на смену раскладки клавиатуры - Call KBDToRUS. Возможно ли мне откорректированный макрос увидеть, чтобы вставить его взамен моего кода? Спасибо.
Изменено: gena10111 - 24.03.2019 23:25:40 (Дополнение)
 
ЕСТЬ РЕШЕНИЕ:
Опробовал на версиях Office (2016 - 64 разрядная и 32 разрядная, 365 офис - 64 разрядная и 32 разрядная). Все работает без нареканий.
Код
Option Explicit

#If VBA7 Then
    #If Win64 Then
        Declare PtrSafe Function LoadKeyboardLayout Lib "user32" Alias "LoadKeyboardLayoutA" (ByVal pwszKLID As String, ByVal flags As LongPtr) As LongPtr
    #Else
        Declare Function LoadKeyboardLayout Lib "user32" Alias "LoadKeyboardLayoutA" (ByVal pwszKLID As String, ByVal flags As LongPtr) As LongPtr
    #End If
#Else
    #If Win64 Then
        Declare PtrSafe Function LoadKeyboardLayout Lib "user32" Alias "LoadKeyboardLayoutA" (ByVal pwszKLID As String, ByVal flags As LongLong) As LongLong
    #Else
        Declare Function LoadKeyboardLayout Lib "user32" Alias "LoadKeyboardLayoutA" (ByVal pwszKLID As String, ByVal flags As Long) As Long
    #End If
#End If

' Переключение на английскую раскладку
Function KBDToENG()
Call LoadKeyboardLayout("00000409", &H1)
End Function

' Переключение на русскую раскладку
Function KBDToRUS()
Call LoadKeyboardLayout("00000419", &H1)
End Function
Страницы: 1
Наверх