VB(A) の中でも、不思議な仕様なのが InputBox 関数だ。

この関数は、一行入力のテキストボックスを持つダイアログボックスを表示し、 利用者に適当なテキストの入力を促す。 見た目が質素なので、その用途は微妙だが、 フォームをいちいち作るのが面倒な時に使うこともある。

ダイアログボックスには、OK だけでなくキャンセルボタンもあるので、 利用者はキャンセルを選んで、処理を中止することもできる。 ということは、この関数は入力されたテキストだけでなく、 キャンセルされたかどうかの情報も返さなければならない。

さて、この関数の戻り値は、String 型である。 他の引数には値を呼び出し側に返すものはなく、 エラーを使ってキャンセルを表す感じでもない。 つまり、戻り値のみで対応しないといけないのだ。

どうなっているのか。

マニュアルを読んでみると、以下のようにある。

[OK] ボタンをクリックするか、または Enter キーを押すと、InputBox 関数はテキスト ボックスの内容を返します。 [キャンセル] ボタンをクリックすると、InputBox 関数は長さ 0 の文字列 ("") を返します。

この説明を信用した場合、大きな欠陥があることが分かる。 利用者がテキストを 1 文字も入力しなかった場合、 「OK」を押したか、「キャンセル」を押したか、戻り値では判断がつかないのだ。

実は、このマニュアルの表記にはミスがあり、 InputBox 関数では、その戻り値だけで、 空文字列の入力とキャンセルを区別する方法があるのである。

そのポイントは、VBA の String 型の特徴にある。