ユーザーから任意のデータを入力してもらうとき、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プロパティを使って画面の更新を抑止しておきます。