Home » エクセルマクロ・Excel VBAの使い方 » VBA関数 » InputBox関数でキャンセルされたときの処理-StrPtr関数

InputBox関数でキャンセルされたときの処理-StrPtr関数

対象:Excel2003, Excel2007, Excel2010, Excel2013

InputBox関数でキャンセルされたときの処理-StrPtr関数

「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関数

InputBox関数の戻り値StrPtr関数の引数に指定すると、
 キャンセルの場合「0」(ゼロ)
 何も入力しないで[OK]がクリックされたときには何らかの数値
返されます。

このことを利用すると、キャンセルかどうかの判定ができます。

数値が入力されるまでインプットボックスを表示するサンプルマクロ

既にご紹介している数値が入力されるまでインプットボックスを表示し続けるマクロで、[キャンセル]ボタンがクリックされたときに処理を終了したい場合、以下のようなマクロにしてやるといいでしょう。

Sub InputBox関数で必ず数値を入力してもらう_キャンセル処理あり()
 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

 MsgBox CDbl(ans)
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関数

「VBA関数」の記事一覧

検索


Copyright © インストラクターのネタ帳 All Rights Reserved.

.