Excel VBAの「IMEStatus 関数」について解説します。
IMEStatus 関数とは
Excel VBA の IMEStatus 関数は、現在のIME (日本語入力システム) の状態 (モード) を示す整数型 (Integer) の値を返します。
ただし、東アジア(日本、韓国、中国)のバージョンでのみ利用可能な関数です。
IMEStatus 関数の構文や実際の使い方について具体的に解説していきたいと思います。
IMEStatus 関数(Visual Basic for Applications リファレンス)
構文(引数と戻り値)
Excel VBAの関数を使いこなすには、関数の構文を正しく理解しておくことが重要です。
構文
IMEStatus
引数
IMEStatus 関数に引数はありません。
戻り値
現在のIMEのモードを示す整数値 (Integer) が返ります。
日本語ロケールの戻り値一覧は次表のとおりです。
| 定数 | 値 | 説明 |
|---|---|---|
| vbIMEModeNoControl | 0 | IME コントロールなし (IME が未インストール) |
| vbIMEModeOn | 1 | IME オン |
| vbIMEModeOff | 2 | IME オフ |
| vbIMEModeDisable | 3 | IME 無効 |
| vbIMEModeHiragana | 4 | 全角ひらがなモード |
| vbIMEModeKatakana | 5 | 全角カタカナモード |
| vbIMEModeKatakanaHalf | 6 | 半角カタカナモード |
| vbIMEModeAlphaFull | 7 | 全角英数字モード |
| vbIMEModeAlpha | 8 | 半角英数字モード |
※ロケールとは、国や地域の文化に基づいた表示形式(日付、時間、数値、通貨など)を定義する設定単位です。
解説(使用例)
ここからは、サンプルを使って使用例や注意点などについて解説します。
IMEStatus 関数の使い方
IMEモードを取得表示する例
次の例は、現在のIMEモード取得して結果を文字列でMsgBoxに表示します。
'■IMEStatus関数サンプル(IMEモードを取得表示)
Sub IMEStatus_Sample()
Dim str As String
Select Case IMEStatus
Case 0 'vbIMEModeNoControl
MsgBox "IMEは制御できません"
Case 1 'vbIMEModeOn
str = "IMEはオンの状態です"
Case 2 'vbIMEModeOff
str = "IMEはオフ(無変換)の状態です"
Case 3 'vbIMEModeDisable
str = "IMEは無効の状態です"
Case 4 'vbIMEModeHiragana
str = "IMEは全角ひらがなモードです"
Case 5 'vbIMEModeKatakana
str = "IMEは全角カタカナモードです"
Case 6 'vbIMEModeKatakanaHalf
str = "IMEは半角カタカナモードです"
Case 7 'vbIMEModeAlphaFull
str = "IMEは全角英数モードです"
Case 8 'vbIMEModeAlpha
str = "IMEは半角英数モードです"
End Select
MsgBox str
End Sub0 ~ 8 までのIMEモードを判定する設定になっています。
しかし、実際にこのサンプルを試すと「半角英数モード」の状態なのに「IMEはオフ(無変換)の状態です」と表示されます。
なぜ「半角英数モード」が「IMEオフ」と判定されるのか
以下は、ChatGPT にこの状況について訊いてみたところ返ってきた内容の抜粋です。
「vbIMEModeOff」と同じように「vbIMEModeOn」が返るケースも再現できませんでした。
「vbIMEModeOn」が返ることはあるのか?
これも ChatGPT に「追加で vbIMEModeOn が返るケースもよくわかりません」と訊いてみた結果返ってきた内容の抜粋が次のとおりです。
API でモードを正確に判定する方法(参考)
IMEStatus 関数では判定に限界があることがわかりました。より詳細にIMEの変換モードを判定したい場合は、Windows APIの「ImmGetConversionStatus」を使います。
以下、ChatGPT が提示したサンプルコードを貼っておきます。
API宣言
#If VBA7 Then
Private Declare PtrSafe Function ImmGetContext Lib "imm32.dll" (ByVal hWnd As LongPtr) As LongPtr
Private Declare PtrSafe Function ImmGetConversionStatus Lib "imm32.dll" (ByVal hIMC As LongPtr, lpfdwConversion As Long, lpfdwSentence As Long) As Long
Private Declare PtrSafe Function ImmReleaseContext Lib "imm32.dll" (ByVal hWnd As LongPtr, ByVal hIMC As LongPtr) As Long
#Else
Private Declare Function ImmGetContext Lib "imm32.dll" (ByVal hWnd As Long) As Long
Private Declare Function ImmGetConversionStatus Lib "imm32.dll" (ByVal hIMC As Long, lpfdwConversion As Long, lpfdwSentence As Long) As Long
Private Declare Function ImmReleaseContext Lib "imm32.dll" (ByVal hWnd As Long, ByVal hIMC As Long) As Long
#End IfIMEモードを取得する関数
Function GetIMEConversionMode() As Long
Dim hIMC As LongPtr
Dim convMode As Long
Dim sentence As Long
hIMC = ImmGetContext(Application.hwnd)
If hIMC <> 0 Then
ImmGetConversionStatus hIMC, convMode, sentence
ImmReleaseContext Application.hwnd, hIMC
GetIMEConversionMode = convMode
Else
GetIMEConversionMode = -1
End If
End Function判定サンプル
Sub CheckIMEConversionStatus()
Dim mode As Long
mode = GetIMEConversionMode()
Select Case mode
Case 0
MsgBox "直接入力(英数)"
Case 1
MsgBox "ひらがなモード"
Case 2
MsgBox "全角カタカナモード"
Case 8
MsgBox "半角カタカナモード"
Case 16
MsgBox "全角英数モード"
Case 32
MsgBox "半角英数モード"
Case Else
MsgBox "その他のモード(値=" & mode & ")"
End Select
End Subこの方法を使えば、「半角英数」や「全角英数」なども正確に判定できます。
まとめ
VBAの関数一覧はこちらからご参照ください。
VBAサンプルファイルダウンロードページのご案内
このページで使用したサンプルファイルの登録はありません(^^;
ページ内のコードをコピーしてご利用ください。
ダウンロードページへのリンクは下のカードクリックでジャンプできます。
よろしければご利用ください!





VBA の IMEStatus 関数は、現在の IME の状態を取得するだけです。モードを変更することはできません。
切り替えたい場合は次のような方法を利用します。
TextBox1フォーカス時に「ひらがなモード」に切り替わります
ただし SendKeys は不安定なため、業務用途なら API が堅実
以上、この解説が少しでもみなさまのお役に立てたなら幸いです(^^;幸いです(^^;