VBAの型チェック構造

EXCELで仕事をする上で外せないダメ言語、その名も『Visual Basic for Application』。略してVBAのお話。VBAを使う上で、C++なんかを使っていた人にとって欠かせない要素が型だと思う。その型について少し。

  1. VBAでの型表現
    • VBAでは型階層をそのまま表現します。例えば、クラス A,B,C の上位下位関係が、「A > B > C」だとする。このとき、「クラスA」の変数xを作り、それに「クラスC」のインスタンスを代入すると、変数xの型表現は「A/B/C」となります。また、変数の型と、インスタンスの型が一致する場合、つまりクラスCの変数xにクラスCのインスタンスを代入すると、変数xの型表現は「C/C」のように繰り返して表現されるようです。
  1. チェックのシステム
    • 型チェックは、型階層を考慮していない様子。つまり、上記の型表現で単純に文字列比較している感じです。よって、上記、上位クラスで宣言し下位クラスのインスタンスを入れた変数x1 (型表現: A/B/C)と、下位クラスで宣言し下位クラスのインスタンスを入れた変数x2 (型表現: C/C) では、型が「一致しません」。なにが言いたいかというと、Variant型に入れた場合と、クラスC型に入れた場合、インスタンスが同じでも、型が一致しないということです。
  1. アップキャストの仕組み
    • アップキャストは「上位クラスで宣言された変数に代入する」これだけでできます。
  1. ダウンキャストの仕組み
    • ダウンキャストも、インスタンスに合う型で宣言された変数に代入すればできます。
  1. キャストのタイミング
    • キャストは「変数への明示的な代入でしか行われない」です。つまり、以下のような時に限ります。
Sub test()
  Dim u as Variant
  Dim d as C
  dim i as new C   'instance

  Set u = i        'up cast
  Set d = u        'down cast
 
  call f(u)        'ここでは自動ダウンキャストされずにエラー
End sub

Function f(x as C) as Integer
  Dim i as Long
  f = i            'ここでは自動ダウンキャストされずにエラー
End Function


とまあ、型表現と型チェックタイミングが腐ってるので注意。MicrosoftVBAを上位互換を保ったまま別のものに置き換えないのはなんでや!!