2009年4月29日水曜日

Excel値入力時に外国語ロケールのIME自動切換

外国語一覧単語帳を作ろうとしたが、

 日本語-英語-北京語-イタリア語

を入力するときにいちいち左Alt+Shiftキーを押下するのが面倒なので、
以下の仕様のVBAを作成。

■仕様

 1.区分(A列)選択時   :日本語IMEひらがな     に自動変更
 2.日本語(B列)選択時  :日本語IMEひらがな     に自動変更
 2.英語(C列)選択時   :日本語IMEオフ       に自動変更
 3.北京語(D列)選択時  :中国語(簡体字)IME    に自動変更
 4.イタリア語(E列)選択時:イタリア語(イタリア)IME に自動変更

■ソース

 対象シートに以下のソース記載
 ※Worksheet_SelectionChangeセクション以外はここからコピってきました。
  MOUG様、ありがとうございました。

 Option Explicit '宣言されていない変数などはエラーとなる

 'IMEロケールAPI宣言
 Private Declare Function GetKeyboardLayoutName Lib "user32" Alias "GetKeyboardLayoutNameA" (ByVal pwszKLID As String) As Long
 Private Declare Function LoadKeyboardLayout Lib "user32" Alias "LoadKeyboardLayoutA" (ByVal pwszKLID As String, ByVal flags As Long) As Long


 '各国語のLCIDを宣言 ※マイクロソフト社MSDNのLCID一覧サイト
 '※LCID:ロケール識別子(LoCaleIDentifiers)
 Private Const KLF_ACTIVATE As Long = &H1
 Private Const KEYBD_LAYOUT_JP As String = "00000411"
 Private Const KEYBD_LAYOUT_CH As String = "00000804"
 Private Const KEYBD_LAYOUT_IT As String = "00000410"

 '該当外国語のセルが選択された時に呼び出される各国語IME呼び出し
 Public Sub ChangeKeyBDLayout(KeyBDLayout As String)
  Dim KeyBDStatus As String
  On Error GoTo myErr
  KeyBDStatus = String(9, 0)
  Call GetKeyboardLayoutName(KeyBDStatus)

  If KeyBDStatus <> (KeyBDLayout & Chr(0)) Then
   Call LoadKeyboardLayout((KeyBDLayout & Chr(0)), KLF_ACTIVATE)
  End If
  Exit Sub

 myErr:
  MsgBox "実行時エラー:" & Err.Number & vbCrLf & Err.Description,vbCritical, "処理が失敗しました。"
 End Sub

 '各国語のセルが選択された時に各国語IMEを呼び出す
 Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  Dim ColVal As String
  ColVal = Mid(Target.Address, 2, 1)

  Select Case ColVal

  Case "A" 'A列のセルに移動した場合:日本語IMEを呼び出す
   Call ChangeKeyBDLayout(KEYBD_LAYOUT_JP)

  Case "B" 'B列のセルに移動した場合:日本語IMEを呼び出す
   Call ChangeKeyBDLayout(KEYBD_LAYOUT_JP)

  Case "C" 'C列のセルに移動した場合:日本語IMEを呼び出す
   Call ChangeKeyBDLayout(KEYBD_LAYOUT_JP)

  Case "D" '
列のセルに移動した場合:中国語IMEを呼び出す
   Call ChangeKeyBDLayout(KEYBD_LAYOUT_CH)

  Case "E" 'E列のセルに移動した場合:イタリア語IMEを呼び出す
   Call ChangeKeyBDLayout(KEYBD_LAYOUT_IT)

  End Select

 End Sub



0 件のコメント:

コメントを投稿