Ввод текста на русском языке в Excel

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

sergo_ukr
Сообщения: 12
Зарегистрирован: 26 сен 2007, 11:05
Откуда: Красноярский край г.Лесосибирск
Контактная информация:

Подскажите, как при открытии какой-нибудь формы ввода увтоматически установить язык ввода "русский"?
Дело в том, что при выполнении кода в русском MS Office при вводе цифры например 123.15, вместо 125,13 (точка вместо запятой) выполняемый код вылетает в отладку.
SendKeys "+^" не подходит, т.к. заранее неизвестно, какой язык в системе будет по умолчанию (у меня например английский, а у юзеров чаще русский). Да и переключение может осуществляться разной комбинацией клавиш.
sergo_ukr
SAS888
Сообщения: 156
Зарегистрирован: 16 янв 2008, 08:28

sergo_ukr,
Можно воспользоваться WinApi- функцией. Например:
Объявление Win API функции:

Код: Выделить всё

Private Declare Function LoadKeyboardLayout Lib "user32" Alias "LoadKeyboardLayoutA" _
(ByVal pwszKLID As String, ByVal flags As Long) As Long
Private Const KLF_ACTIVATE = 1
Функция VBA Excel:

Код: Выделить всё

Public Sub SetLanguage(ByVal s As String)
Select Case UCase(Left(s, 1))
Case "R"
LoadKeyboardLayout "00000419", KLF_ACTIVATE
Case "E"
LoadKeyboardLayout "00000409", KLF_ACTIVATE
Case Else
End Select
End Sub
Запуск процедуры:

Код: Выделить всё

SetLanguage ("R")
Где, соответственно "R" - русский, "E" - английский. Не зависимо, какая раскладка установлена на текущий момент.
sergo_ukr
Сообщения: 12
Зарегистрирован: 26 сен 2007, 11:05
Откуда: Красноярский край г.Лесосибирск
Контактная информация:

Пробовал, не работает, ругается, что в объявлении API-функции не хватает окончания End Function. Пробовал подставлять его - все равно ругается.
sergo_ukr
SAS888
Сообщения: 156
Зарегистрирован: 16 янв 2008, 08:28

В Excel 2003 попробовал копированием перенести в новый модуль то, что выложил - проблем нет.
Проверьте, что задано именно "Declare Function", а не просто "Function".
Pavel55
Сообщения: 418
Зарегистрирован: 20 окт 2006, 11:40
Откуда: Moscow

Проще точку заменить на запятую

Код: Выделить всё

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    If KeyAscii = Asc(".") Then KeyAscii = Asc(",")
End Sub
Teslenko_EA
Сообщения: 526
Зарегистрирован: 04 фев 2007, 18:37
Откуда: Сургут
Контактная информация:

Здравствуйте sergo_ukr.
"язык в системе" нисколько не влияет на символ разделитель целой и дробной частей, который задается в национальных настройках.
В развитие предложения Pavel55, код обеспечивающий правильность числового ввода в поле формы:

Код: Выделить всё

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Dim s$
s = TextBox1.Text
If IsNumeric(Chr(KeyAscii)) Then
ElseIf KeyAscii = 46 Or KeyAscii = 44 Then
    KeyAscii = 44 '44, 46 - запятая или точка, согласно национальным настройкам системы
    If InStr(s, Chr(KeyAscii)) > 1 Then KeyAscii = 0 'запрет повторения разделителя
    If Len(s) = 0 Then KeyAscii = 0 'запрет лидирующего разделителя
Else
    KeyAscii = 0
End If
End Sub
Евгений.
SAS888
Сообщения: 156
Зарегистрирован: 16 янв 2008, 08:28

Посмотри еще здесь: http://forum.ru-board.com/topic.cgi?for ... art=900#14
sergo_ukr
Сообщения: 12
Зарегистрирован: 26 сен 2007, 11:05
Откуда: Красноярский край г.Лесосибирск
Контактная информация:

Благодарю, вечером поэкспериментирую. Может есть еще какие варианты? Больше шансов, что один из них подойдет.
sergo_ukr
sergo_ukr
Сообщения: 12
Зарегистрирован: 26 сен 2007, 11:05
Откуда: Красноярский край г.Лесосибирск
Контактная информация:

Последний вариант (по ссылке) сработал, предыдущий не проверял, но все равно большое спасибо, в принципе меня устроит последний вариант.
sergo_ukr
algraf2000
Сообщения: 1
Зарегистрирован: 14 май 2010, 15:18

Объясните пожалуйста для чайникофф
Я попытался вставить все три варианта в модуль между SUB и END SUB
В результате получил:
1.Compile error:
Only comments may appear after End Sub, End Function, or End Property
2.Compile error: Expected End Sub
3.Compile error:
Sub or Function not defined

Что я делаю не так? Может перед и после нужно еще что-то написать?
Ответить