概要
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を活用したカスタム関数として実装する必要があります。この関数は、入力フォームの制御や日本語入力の適切な管理に役立ちます。エラーハンドリングを適切に追加することで、より安全に使用することが可能です。