wrote :: 2003.10.08

トップページ > Excel > VBA > InputBoxでIMEをオンにする

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プロパティを使って画面の更新を抑止しておきます。


[目次]に戻る