空腹おやじのログと備忘録

VBA(主にExcel)でいろいろな実験的な事とか、Linuxのコマンドとか設定とかについて忘れないように、あれこれと・・・

VBAの$付きの文字列関数

VBAの文字列関数には$付きの物がありますが、ネットで見るコードではほとんど見かけません。Microsoftのサイトで関数を検索しても、出てくるのは$なしばかり。

何が違うのと言われれば、

VBA の文字列関数の中には 2 種類のバリエーションを持つものがあります。1 つは文字列を返し、もう 1 つは文字列型 (String) のバリアント値を返します。文字列を返す関数名にはドル記号 ($) が含まれます。たとえば、Chr$、Format$、LCase$、Left$、LTrim$、Mid$、Right$、RTrim$、Space$、Trim$、UCase$ などがあります。文字列型のバリアント値を返す関数にはドル記号は含まれません。これらの関数名は、Chr、Format、Lcase、Left、Ltrim、Mid、Right、Rtrim、Space、Trim、Ucase などになります。前者の関数はすばやく結果を返しますが、Null 値を使用して呼び出すとエラーが発生します。文字列型のバリアント値を返す関数では、Null 値を問題なく使用できます。

文字列の一部を返す | Microsoft Docs

2つの違いをざっくり言うと、

  • 復帰値の型が異なる
  • パフォーマンスが異なる(通常なら無視できるレベル)
  • 文字列を取り出す元の文字列式で扱えるデータの型が異なる

です。

項目 $付き $なし
復帰値 文字列型 (String) 文字列型 (String) のバリアント値
Null値対応 使用不可 使用可

Nullをパラメータとして渡した場合の違いはこんな感じ。
$なしは、エラーの発生もなく、Null(文字列ではない)を返している。
   文字列ではないというのは、
   ? typename(Left(Null,2))
  と実行すれば
   Null
  と返ってくることで確認できる。
$ありでは、実行時エラー '94'が発生している。
f:id:Z1000S:20180930140219j:plain


$ありなしでのパフォーマンスの比較は、以下のサイトで行われていたが
基本的には記述通り、$あり > $なし となっている。
代入先の変数の型で状況が変わるのは、なるほどといった感じ。

■T'sWare Access Labo #32 〜$付き関数のメリットとは?〜



別に、$付きでも$なしでも、どっちを使ってもいいんですよ。最終的に、正しい結果が得られるのであれば・・・


ちなみに私は、$付き派です。

「だから、どうした?」とか「どうして?」と聞かれても困りますが・・・