当サイトではアフィリエイトプログラムを利用して商品を紹介しています。

【VBA】Variant型

VariantはVBあるいはVBA独自のかなり変わったデータ型です。
「とりあえずこの型で変数を宣言しておけば、文字でも数値でも、配列でも、どんな型のデータを入れちゃってもかまわないよ」
という、大変便利なようでいて、
「本当にそんなことして大丈夫?」
と使うことをためらってしまう謎のデータ型です。入門書などには
「初心者はとりあえず Variant で宣言しておけば大丈夫!」
てなことが書かれていたりしますが、「ほんまかいな?」とますます疑り深くなってしまいます。

詳しい解説によると
Variant型変数は代入するときにそのデータ型がチェックされて、それに合うデータを自動的に選択してくれます。でも通常のデータ型に比べて必要なメモリ領域が大きくなるので処理速度が遅くなりますよ」
と書いてあります。その程度の注意書きであれば、
「変数を宣言する面倒くささに比べたら、処理速度が少し遅くなるぐらい別にいいじゃん。これから全て変数は Variant にしようっと」
なんて極端なことを考えるユーザーさんもいるかもしれません。
 
というわけで、簡単なマクロを作って、Variant型を試してみることにしました。

'[VBA] Variant型テストプロシージャ

Sub VariantTest()

  Dim x, y
  x = "2"
  y = 3
  Debug.Print x + y

  x = "2"
  y = "3"
  Debug.Print x + y

  x = "2"
  y = "3"
  Debug.Print x * y

End Sub

'5
'23
'6

「Dim x,y」のあとに「as データ型」が省略されていると Variant 型を宣言したことになります。Debug.Print はイミディエイトウィンドウに処理過程を表示します。”” で囲っている変数は文字列として代入しています。VariantTest マクロを実行すると「5, 23, 6」が表示されました。つまり、

"2" + 3 = 5, "2" + "3" = 23, "2"*"3" = 6

のように処理したことになります。最初の数式では
「あれ? 文字と数値で足し算されてるよ。きっと間違えたんだね。文字で入ってきたほうも数値として処理して、ちゃんと足し算してあげるね」
というように実に気の利いた処理をしてくれています。2 番目の数式では
「x, y が両方とも文字型で入ってきたね。きっと文字を連結したいんだろうな。ほいっと」
というように文字を並べて返してきました。最後の数式では
「…文字同士の掛け算とか本当は有り得ないんだけど、まあ、仕方ないや。両方数値と考えて掛け算しといてあげる」
とこれまた気の利いた処理をしてくれます。

うーむ。実に柔軟な処理です。でもいいのかな。本当にいいのかな。そこは厳しく
「文字と数字では足せません! エラーです!」
と指摘したほうがユーザーさんのためになるかもしれませんよ。実際のところ、より複雑なプログラムでは、こうした異なる型同士で演算してしまうことでバグが発生する例もあるらしく、やはり使い方には慎重になるべきかもしれません。なのでむしろ Variant は上級者向きのデータ型なのではと考えたりもします。うまく Variant 型を使いこなすことができれば、
「ユーザーさん、文字でも数字でも何でも入力してくださって結構ですよ。適切な返答をいたします」
というマクロを作ることも可能だからです。もちろん、Variant だからって何でも許してくれるというわけでなく、次のようなマクロを作ってみると…

'[VBA] アルファベットと数値の掛け算?

Sub Variant_Error()
  Dim x, y
  x = "2"
  y = "a"
  Debug.Print x * y
End Sub

「アルファベットと数字をを掛け算してほしいな」という意図のプログラムですが、さすがに「調子にのるな! エラー!」と返されてしまいました。

エクセルや数学に関するコメントをお寄せください