「vba inputboxキャンセルした時の行動」
といった検索で、このサイト・インストラクターのネタ帳へのアクセスがあるのに気づきました。
VBA(Visual Basic for Applications)のInputBox関数で、[キャンセル]ボタンが押されたときの処理方法を探している方による検索です。
InputBoxのキャンセルは長さ0の文字列では判定できない
InputBox関数は、インプットボックスに入力された文字列を返す関数で、[キャンセル]ボタンがクリックされたときの仕様としてヘルプには、
[キャンセル] ボタンをクリックすると、InputBox 関数は長さ 0 の文字列 ("") を返します。という記述があります。
ですから、InputBox関数の戻り値が長さ0の文字列かどうかで[キャンセル]ボタンが押されたかどうかを判別しようというのは、多くの方が最初に考えることです。
が、、この方法ではダメです。
インプットボックスに何も入力しないで[OK]ボタンがクリックされたときにも、長さ0の文字列が返されてしまうのです。ですから長さ0の文字列が返ってきたからといって、キャンセルされたとは言い切れないのです。
InputBox関数でキャンセルされたかどうかを判別するにはStrPtr関数を利用しましょう。
StrPtr関数とは
StrPtr(String Pointer)関数は、引数に指定された文字列のアドレスを返す、VBAの隠し関数です
オブジェクトブラウザで[非表示のメンバーを表示]してやると下図のように見えてきます。
InputBox関数の戻り値をStrPtr関数の引数に指定すると、
キャンセルの場合「0」(ゼロ)が
何も入力しないで[OK]がクリックされたときには何らかの数値が
返されます。
このことを利用すると、キャンセルかどうかの判定ができます。
数値が入力されるまでインプットボックスを表示するサンプルマクロ
既にご紹介している数値が入力されるまでインプットボックスを表示し続けるマクロで、[キャンセル]ボタンがクリックされたときに処理を終了したい場合、以下のようなマクロにしてやるといいでしょう。
Dim ans As String ' InputBoxの戻り
Dim flg As Boolean ' 数値かどうかの判定フラグ
flg = False
Do
ans = InputBox("数値を入力してください。")
If StrPtr(ans) = 0 Then Exit Sub ' キャンセル時に終了
If IsNumeric(ans) Then flg = True
Loop Until flg = True
End Sub
上記のマクロを実行すると、「数値を入力してください。」と表示されたインプットボックスが表示され、数値が入力されるまでインプットボックスを表示し続け、[キャンセル]されたときにはマクロを終了します。数値が入力された場合は入力された数値をメッセージボックスに表示します。
サンプルマクロの解説
数値かどうかの判定用フラグをFalseに設定してから、
flg = False
Do ~ Loop文に入って、インプットボックスを表示します。
Do
ans = InputBox("数値を入力してください。")
StrPtr関数でInputBoxの戻り値を確認して「0」ならばキャンセルですので、Subプロシージャを抜けます。
If StrPtr(ans) = 0 Then Exit Sub
InputBoxの戻り値が数値ならば判定フラグをTrueにします。
If IsNumeric(ans) Then flg = True
数値判定フラグがTrueになるまでループを回し続けるという条件にしているので、数値が入力されなければフラグはFalseのままなのでループが回り続け、インプットボックスが何度も表示されます。
Loop Until flg = True
ループを抜けたあと(数値と判定できる文字列が入力されたあと)に、入力された数値をメッセージボックスに表示しています。
MsgBox CDbl(ans)
Home » エクセルマクロ・Excel VBAの使い方 » VBA関数 » InputBox関数でキャンセルされたときの処理-StrPtr関数