InputBox関数により表示されたダイアログに対してキャンセルがクリックされたとき、戻り値は空文字列となります。一方で何も入力せずOKされた場合も空文字列になりますので、戻り値だけではどちらなのか区別がつきません。
しかし、キャンセルされたときに戻り値をStrPtrという関数で評価すると0が返りますので、これによりキャンセルされたかどうかを判定することができます(ただしダイアログの右上の×が選択された場合も0が返ります。キャンセルと×を以下の方法では区別することはできません)。
実際にやってみます。
下記のコードを実行することにより画像のようなダイアログが表示されます。
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)の値を表示させます。
画像は、キャンセルされた場合のMsgboxの表示です。
タイトルに表示されているStrPtr(ans)の値が0になっているのがわかります。
なお、冒頭にも記したようにダイアログの右上の×が選択された場合も同じ結果になるためこの方法でキャンセルと×を区別することはできませんので注意してください。
適当な日付を入力してOKしたときの表示です。
空文字列を入力してOKしたときの表示です。
StrPtr(ans)の値が0ではないことがわかります。
日付とみなされない文字列を入力してOKしたときの表示です。
なお、StrPtr関数は変数のメモリアドレスを返す関数とされていますが、隠し関数となっておりマイクロソフトのサポートページなどには現れないようです。