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