$が付くVBA関数

VBA関数の中にはLeft$関数のように$が付くものがあります。

先に答えを書いてしまいますが、$がない関数を使ってください

$ありを使うとNull判定処理が必要になるのが主な理由です。$ありの関数は「文字列を返す」という意味です。これは過去のBASIC時代の考え方でマークに意味を持たせていたことに由来します。$は文字列、%は整数、&は長整数などです。このマークの考え方がVBAにも残っていることが$ありの関数に繋がっています。

VBAでは変数にマークを付けることが出来ます。

String型には$、Integer型に%、Long型に&、Single型に!、Double型に#、Currency型に@を付けて、「Dim str$」とか「Dim cnt&」などと記述する「型宣言文字」があり、マークから型を推論できるようになっています。

型宣言でAs Stringなどと書かなくても$を付けるとString型と認識されます。実際に各マークを付けたVBAのコードもちゃんと動作します。

実行結果

しかし今ではこんな書き方をすることはまず無いでしょう。

私は見たことありません。

ここで書いたのが初めてです。


$がある関数とない関数の違い

$がある関数とない関数の違いは定義を見ると分かります。

文字列操作系の$が付く関数を定義も含めて挙げてみます。

17個あります。

$がついていない関数は以下になります。

$がついていない関数は戻り値が定義されていません。これは書き忘れではなく未定義になります。未定義ということはVariant型を返すということです。

つまり、$が付く関数はString型で返し、$が付かない関数はVariant型で返すという違いになります。また、$が付く関数は引数にNullを渡すと「実行時エラー94(Nullの使い方が不正です。)」が発生しますが、$が付かない関数はエラーになりません。


その他、$が付く関数やプロパティ

他にも以下の関数やプロパティがあります。考え方は上と同様です。



$ありと$なしの処理速度の違い

$あり関数と$なし関数では処理速度がどれぐらいあるのかを調べてみると、多少、$あり関数の方が速いようです。

以下のコードを$ありとなしでそれぞれ10回ずつ実行したのですが、$ありの平均が約58ミリ秒、$なしの平均が約70ミリ秒でした。ループ回数を30000000回でやっても$ありが約1.6秒、$なしが約2.1秒と同様の傾向で、$あり関数の方が速いようです。

ただ、何千万回という相当数のループ回数を回しても体感上の差が出ないため、業務で使うようなVBAの場合はほとんど差はありません。メモリ効率はいいかもしれませんが、最近のPCではまず関係ありません。

$あり関数はNull判定の考慮が必要になることを考えると、PCの性能が上がっている現状ではこれからも$あり関数を使う必要性がまずないと思われます。

なお、以下の処理の計測には「VBAでミリ秒やマイクロ秒の計測を行う」で紹介しているミリ秒計測の関数を使っています。