Смена раскладки клавиатуры в VBA Excel с РУС на ENG и наоборот с помощью функций Windows API. Автоматическое изменение раскладки в пределах одной таблицы.
Смена раскладки клавиатуры
Поочередная смена раскладки
Для организации поочередной смены раскладки клавиатуры с РУС на ENG и наоборот, имитирующей нажатие сочетания клавиш (Win + Space, Alt + Shift, Ctrl + Shift — в зависимости от ваших настроек), можно использовать функцию Windows API ActivateKeyboardLayout
, объявленную в разделе Declarations стандартного модуля:
1 |
Declare PtrSafe Function ActivateKeyboardLayout Lib "user32" (ByVal HKL As LongPtr, ByVal flags As LongPtr) As LongPtr |
Код VBA Excel для поочередного изменения раскладки клавиатуры:
1 2 3 |
Sub ToEngOrRus() Call ActivateKeyboardLayout(0, 0) End Sub |
Заданная смена раскладки
Для смены раскладки клавиатуры из кода VBA Excel с указанием устанавливаемого языка используется функция Windows API LoadKeyboardLayout
, объявленная в разделе Declarations стандартного модуля:
1 |
Declare PtrSafe Function LoadKeyboardLayout Lib "user32" Alias "LoadKeyboardLayoutA" (ByVal pwszKLID As String, ByVal flags As LongPtr) As LongPtr |
Код VBA Excel для изменения раскладки клавиатуры с указанием устанавливаемого языка:
1 2 3 4 5 6 7 8 9 |
'Переключение на английскую раскладку Sub ToEng() Call LoadKeyboardLayout("00000409", &H1) End Sub 'Переключение на русскую раскладку Sub ToRus() Call LoadKeyboardLayout("00000419", &H1) End Sub |
"00000409"
— код английской раскладки;
"00000419"
— код русской раскладки.
Определение текущей раскладки
Получить значение текущей раскладки можно с помощью функции Windows API GetKeyboardLayoutName
, объявленной в разделе Declarations стандартного модуля:
1 |
Declare PtrSafe Function GetKeyboardLayoutName Lib "user32" Alias "GetKeyboardLayoutNameA" (ByVal pwszKLID As String) As LongPtr |
Код определения текущей раскладки для вариантов РУС и ENG:
1 2 3 4 5 6 7 8 9 10 11 |
Sub KeyboardLayoutName() Dim klName As String * 8 GetKeyboardLayoutName klName If klName = "00000409" Then MsgBox "Текущая раскладка - Английская!" ElseIf klName = "00000419" Then MsgBox "Текущая раскладка - Русская!" Else MsgBox "Текущая раскладка - не Русская и не Английская!" End If End Sub |
Переменная klName объявлена как строка фиксированной длины. Запуск процедуры с обычной переменной может вызывать ошибку, закрывающую приложение. Так происходит в моей версии Excel 2016.
Смена раскладки в таблице
Автоматическое изменение раскладки в пределах одной таблицы при переходе между ячейками.
Для автоматической смены раскладки при переходе между ячейками разных диапазонов одного рабочего листа будем использовать функцию Windows API LoadKeyboardLayout
, объявленную в разделе Declarations стандартного модуля:
1 |
Declare PtrSafe Function LoadKeyboardLayout Lib "user32" Alias "LoadKeyboardLayoutA" (ByVal pwszKLID As String, ByVal flags As LongPtr) As LongPtr |
Допустим, что в 5 и 7 столбцах нашей таблицы находятся данные на английском языке или, попросту, требующие ввод латиницей. Чтобы не переключать каждый раз раскладку клавиатуры вручную, разместим в модуле нужного листа следующий код VBA Excel:
1 2 3 4 5 6 7 8 |
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Select Case Target.Column Case 5, 7 Call Module3.LoadKeyboardLayout("00000409", &H1) Case Else: Call Module3.LoadKeyboardLayout("00000419", &H1) End Select End Sub |
Теперь при переходе к ячейкам 5 и 7 столбцов раскладка клавиатуры автоматически меняется на ENG, а при уходе с них — на РУС.
Module3 — это стандартный модуль, в котором размещена функция Windows API LoadKeyboardLayout
.