概要

IMEStatus関数は、VBAでIME(日本語入力システム)の状態を取得するためのカスタム関数です。標準のVBAにはIMEStatus関数が存在しないため、Windows APIを利用してIMEの状態を確認する方法を実装することが一般的です。この機能は、日本語入力のオン・オフ状態を確認し、フォームやセルの入力制御に活用できます。

カスタムIMEStatus関数の作成

VBAでIMEの状態を取得するためには、Windows APIのGetKeyboardLayout関数とImmGetConversionStatus関数を利用してIMEの状態を取得します。以下のコードでは、IMEの状態を取得するカスタム関数を実装しています。

IMEStatus関数の実装

#If VBA7 Then
    ' 64ビット環境用のAPI宣言
    Private Declare PtrSafe Function GetKeyboardLayout Lib "user32" (ByVal idThread As Long) As LongPtr
    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 LongPtr, lpfdwSentence As LongPtr) As Long
#Else
    ' 32ビット環境用のAPI宣言
    Private Declare Function GetKeyboardLayout Lib "user32" (ByVal idThread As Long) As Long
    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
#End If

Function IMEStatus(hwnd As Long) As String
    Dim hIMC As LongPtr
    Dim conversion As Long
    Dim sentence As Long

    ' IMEのコンテキストを取得
    hIMC = ImmGetContext(hwnd)

    ' IMEの状態を取得
    If ImmGetConversionStatus(hIMC, VarPtr(conversion), VarPtr(sentence)) Then
        If conversion And &H1 Then
            IMEStatus = "IMEがオンです"
        Else
            IMEStatus = "IMEがオフです"
        End If
    Else
        IMEStatus = "IMEの状態が取得できませんでした"
    End If
End Function

このカスタム関数では、GetKeyboardLayout関数でキーボードレイアウトを取得し、ImmGetContext関数でIMEコンテキストを取得します。さらに、ImmGetConversionStatus関数を使用してIMEの変換モードを確認し、オン・オフの状態を返します。

IMEStatus関数の使用例

次のコードでは、IMEStatus関数を使用して、指定したウィンドウハンドル(フォームやExcelシート)に関連するIMEの状態を取得し、メッセージボックスで表示します。

Sub CheckIMEStatus()
    Dim hwnd As Long
    Dim status As String

    ' フォームまたはシートのハンドルを取得(ここでは仮に0を使用)
    hwnd = 0

    ' IMEの状態を取得
    status = IMEStatus(hwnd)

    ' 結果を表示
    MsgBox status
End Sub

この例では、IMEStatus関数を呼び出して、IMEの状態を確認しています。hwndには、IME状態を確認したいウィンドウのハンドルを指定します。

エラーハンドリングの追加

IMEの状態取得に失敗した場合のエラーハンドリングを追加することで、ユーザーに適切なフィードバックを提供できます。

Function IMEStatus(hwnd As Long) As String
    On Error GoTo ErrorHandler

    Dim hIMC As LongPtr
    Dim conversion As Long
    Dim sentence As Long

    ' IMEのコンテキストを取得
    hIMC = ImmGetContext(hwnd)

    ' IMEの状態を取得
    If ImmGetConversionStatus(hIMC, VarPtr(conversion), VarPtr(sentence)) Then
        If conversion And &H1 Then
            IMEStatus = "IMEがオンです"
        Else
            IMEStatus = "IMEがオフです"
        End If
    Else
        IMEStatus = "IMEの状態が取得できませんでした"
    End If

    Exit Function

ErrorHandler:
    IMEStatus = "エラーが発生しました。入力システムに問題がある可能性があります。"
End Function

このバージョンでは、エラー発生時にエラーメッセージを返し、ユーザーに通知します。

まとめ

IMEStatus関数は、VBAでIMEのオン・オフ状態を取得するために非常に有用です。標準のVBAには存在しないため、Windows APIを活用したカスタム関数として実装する必要があります。この関数は、入力フォームの制御や日本語入力の適切な管理に役立ちます。エラーハンドリングを適切に追加することで、より安全に使用することが可能です。