InputBoxのキャンセルを検出する

 InputBox関数により表示されたダイアログに対してキャンセルがクリックされたとき、戻り値は空文字列となります。一方で何も入力せずOKされた場合も空文字列になりますので、戻り値だけではどちらなのか区別がつきません。
 しかし、キャンセルされたときに戻り値をStrPtrという関数で評価すると0が返りますので、これによりキャンセルされたかどうかを判定することができます(ただしダイアログの右上の×が選択された場合も0が返ります。キャンセルと×を以下の方法では区別することはできません)。

f:id:accs2014:20190205110538p:plain:right:w450

 実際にやってみます。
 下記のコードを実行することにより画像のようなダイアログが表示されます。

Sub Func_InputBox()

    Dim ans As String

    ans = InputBox("日付を入力してください(例:2019/1/23)")

    If StrPtr(ans) = 0 Then
        MsgBox "キャンセルされました", , StrPtr(ans)
    ElseIf IsDate(ans) Then
        MsgBox "その日は" & Format(ans, "aaaa") & "です", , StrPtr(ans)
    ElseIf ans = "" Then
        MsgBox "空文字列が入力されました", , StrPtr(ans)
    Else
        MsgBox "日付でない値が入力されました", , StrPtr(ans)
    End If

End Sub

 InputBoxの戻り値を変数ansに代入したうえで、StrPtr(ans)の値とansの値によって応答(MsgBox)の内容を分岐させています。
 なおいずれの場合もMsgboxのタイトルとしてStrPtr(ans)の値を表示させます。
 

f:id:accs2014:20190205105811p:plain:right:w200

 画像は、キャンセルされた場合のMsgboxの表示です。
 タイトルに表示されているStrPtr(ans)の値が0になっているのがわかります。
 なお、冒頭にも記したようにダイアログの右上の×が選択された場合も同じ結果になるためこの方法でキャンセルと×を区別することはできませんので注意してください。

f:id:accs2014:20190205105809p:plain:right:w200

 適当な日付を入力してOKしたときの表示です。

f:id:accs2014:20190205105806p:plain:right:w250

 空文字列を入力してOKしたときの表示です。
 StrPtr(ans)の値が0ではないことがわかります。

f:id:accs2014:20190205105803p:plain:right:w250

 日付とみなされない文字列を入力してOKしたときの表示です。

 なお、StrPtr関数は変数のメモリアドレスを返す関数とされていますが、隠し関数となっておりマイクロソフトのサポートページなどには現れないようです。