InputBoxでIMEをオンにする


ユーザーから任意のデータを入力してもらうとき、InputBox関数を使うと便利です。たとえば次のコードは、ユーザーが入力した住所をセルA1に代入します。

Sub Sample()
    Dim buf As String
    buf = InputBox("住所を入力してください。")
    If buf <> "" Then Range("A1") = buf
End Sub

特に難しくない処理ですが、どうせ日本語で住所を入力するのでしたら、IMEをオンにしてあげた方がユーザーは便利です。InputBox関数自体にIMEを制御する機能はありませんが、次のようにするとIMEをオンにしてから入力のダイアログボックスを表示できます。

Sub Sample2()
    Dim buf As String
    SendKeys ("{kanji}")
    buf = InputBox("住所を入力してください。")
    If buf <> "" Then Range("A1") = buf
End Sub

SendKeysステートメントは、キーが押されたときの信号を擬似的に発生させるステートメントです。[A]や[B]といった通常のキーはもちろん、[Shift]や[Alt]を指定することもできます。ヘルプには載っていませんが、{kanji}はIMEをオン/オフするキーを表します。

しかし上のコードでは、すでにIMEがオンになっている状態では逆にオフにしてしまいます。もっと確実にIMEをオンにするのでしたら、APIを使ってIMEの状況を判定する必要があります。ちなみに、

Public Declare Function ImmGetContext Lib "imm32.dll" (ByVal hwnd As Long) As Long 
Public Declare Function ImmReleaseContext Lib "imm32.dll" (ByVal hwnd As Long, _
                                                       ByVal himc As Long) As Long 
Public Declare Function ImmSetOpenStatus Lib "imm32.dll" (ByVal himc As Long, _
                                                          ByVal b As Long) As Long 

あたりを使います。興味がある方はトライしてください。

あるいは発想を変えて、ExcelのVBAだけで済ますのでしたら次のような手もあります。

Sub Sample3()
    Dim buf As String
    Application.ScreenUpdating = False
    With Workbooks.Add
        With ActiveCell.Validation
            .Add Type:=xlValidateInputOnly
            .IMEMode = xlIMEModeOn
        End With
        buf = InputBox("住所を入力してください。")
        .Close SaveChanges:=False
    End With
    Application.ScreenUpdating = True
    If buf <> "" Then Range("A1") = buf
End Sub

マクロが実行されたら、まず新しいブックを開きます。その新しいブックのアクティブセルに「IMEをオンにする入力規則を設定します。アクティブセルに設定したのですから、これで現在の状況にかかわらずIMEがオンになります。その状態でInputBox関数を実行してユーザーからデータを受け取り、ダミーで作成した新しいブックを閉じます。もちろん、ダミーのブックは見られたくありませんから、ScreenUpdatingプロパティを使って画面の更新を抑止しておきます。