本ページには広告が含まれています。

VBA IMEStatus関数 IMEの状態を示す値を取得する

VBA IMEStatus関数 IMEの状態を示す整数値を取得する

Excel VBAの「IMEStatus 関数」について解説します。

スポンサーリンク

IMEStatus 関数とは

Excel VBA の IMEStatus 関数は、現在のIME (日本語入力システム) の状態 (モード) を示す整数型 (Integer) の値を返します。

ただし、東アジア(日本、韓国、中国)のバージョンでのみ利用可能な関数です。

IMEStatus 関数の構文や実際の使い方について具体的に解説していきたいと思います。

IMEStatus 関数(Visual Basic for Applications リファレンス)

スポンサーリンク

構文(引数と戻り値)

Excel VBAの関数を使いこなすには、関数の構文を正しく理解しておくことが重要です。

構文

IMEStatus

引数

IMEStatus 関数に引数はありません

戻り値

現在のIMEのモードを示す整数値 (Integer) が返ります。

日本語ロケールの戻り値一覧は次表のとおりです。

定数説明
vbIMEModeNoControl0IME コントロールなし
(IME が未インストール)
vbIMEModeOn1IME オン
vbIMEModeOff2IME オフ
vbIMEModeDisable3IME 無効
vbIMEModeHiragana4全角ひらがなモード
vbIMEModeKatakana5全角カタカナモード
vbIMEModeKatakanaHalf6半角カタカナモード
vbIMEModeAlphaFull7全角英数字モード
vbIMEModeAlpha8半角英数字モード

※ロケールとは、国や地域の文化に基づいた表示形式(日付、時間、数値、通貨など)を定義する設定単位です。

解説(使用例)

ここからは、サンプルを使って使用例や注意点などについて解説します。

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 Sub

0 ~ 8 までのIMEモードを判定する設定になっています。

しかし、実際にこのサンプルを試すと「半角英数モード」の状態なのに「IMEはオフ(無変換)の状態です」と表示されます。

なぜ「半角英数モード」が「IMEオフ」と判定されるのか

以下は、ChatGPT にこの状況について訊いてみたところ返ってきた内容の抜粋です。

IMEStatus はあくまで IME(日本語入力システム)の「状態」 を返す関数です。

  • IME が 有効で日本語入力モード中
          → vbIMEModeHiragana, vbIMEModeKatakana など
  • IME が 無効または英数入力状態(オフ) → vbIMEModeOff

つまり、「半角英数モード」は IME自体が無効(=オフ)扱い のため、
vbIMEModeAlpha は返らず、vbIMEModeOff が返ってしまうという挙動になります。

vbIMEModeOff」と同じように「vbIMEModeOn」が返るケースも再現できませんでした。

「vbIMEModeOn」が返ることはあるのか?

これも ChatGPT に「追加で vbIMEModeOn が返るケースもよくわかりません」と訊いてみた結果返ってきた内容の抜粋が次のとおりです。

① ExcelがIMEのモードをまだ確定できていない場合

たとえば、次のようなときに起こります。

  • IMEがオンにされた直後(まだ文字入力していない)
  • Excelがアクティブになったばかりで、IMEの状態を反映できていない
  • 使用しているIME(例:Google日本語入力、ATOK)が内部的にモード管理を独自実装している

この場合、Excel VBA 側からは「IMEがオンなのは分かるが、具体的なモードがまだ不明」となり、そのため vbIMEModeOn が返ります。

② 特定のIME実装依存のケース

Microsoft IME 以外のIME(例:ATOK、Google日本語入力)では、
IMEStatus が返すモード値が 正しく反映されない ことがあるようです。

特にATOKでは「ひらがな」でも vbIMEModeOn が返ることがあり、
これはVBAが古いWindows IME APIに依存しているための仕様のようです。

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 If

IMEモードを取得する関数

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 の IMEStatus 関数は、現在の IME の状態を取得するだけです。モードを変更することはできません。

切り替えたい場合は次のような方法を利用します。

  1. ユーザーフォームの ImeMode プロパティを使う
    • 例: TextBox1.ImeMode = fmIMEModeHiragana
      TextBox1フォーカス時に「ひらがなモード」に切り替わります
  2. Windows API 「ImmGetConversionStatus」を使って強制的に変更する
    • 例:— 前出の例を参照 —
  3. SendKeys で IMEオン/オフ を切り替える
    • 例:Application.SendKeys (“{IMEON}”) ‘ IMEオン
    • 例:Application.SendKeys (“{IMEOFF}”) ‘ IMEオフ
      ただし SendKeys は不安定なため、業務用途なら API が堅実

以上、この解説が少しでもみなさまのお役に立てたなら幸いです(^^;幸いです(^^;

VBAの関数一覧はこちらからご参照ください。

スポンサーリンク
スポンサーリンク

VBAサンプルファイルダウンロードページのご案内

このページで使用したサンプルファイルの登録はありません(^^;
ページ内のコードをコピーしてご利用ください。

ダウンロードページへのリンクは下のカードクリックでジャンプできます。
よろしければご利用ください!