Range型変数をVariant型変数に代入した時の挙動についての覚え書。
- Range型で1行や1列のデータも、Variant型変数に代入すると2次元配列として扱われる。
- 1列のデータの場合、Variant型変数は、1次元の要素が複数で、2次元の要素が1つ、という配列となる
- 1行のデータの場合、Variant型変数は、1次元の要素が1つで、2次元の要素が複数、という配列となる
以下、サンプルコード。
Public Sub sample1() Dim i As Integer Dim r As Range Dim v As Variant Set r = Range("B2:B21") v = r For i = 1 To 20 Cells(i + 1, 4) = v(i, 1) Next i End Sub
セルB2~B21まで20個のデータがある。それを一旦、Range型変数 r に格納し、次に r をVariant型変数 v にコピーしてから、シートに出力している。
注意しなければならないのは、v(i) ではなく、 v(i, 1)としなければエラーになることだ。
これは冒頭書いたのように、Range型で1行や1列のデータも、Variant型変数に代入すると2次元配列として扱われる、からだ。(この辺て、ちょっとVBAやってる人には当たり前のことなのだろうか?自分は最近まで知らなかった。)
書いて動くかなと思って実行したところエラーになったので、変数 v をウォッチ式にぶち込んで挙動を見てみたところ、上記のことが分かった。参考までに、上記サンプルプログラム実行後のシートの例と、ウォッチ式でどのように表示されるかも示しておく。
↓B列のデータをD列にコピー

↓ウォッチ式を見ても、二次元配列になっている(当たり前だが)

ついでに、画像はないが、横に並んでいるデータ(行方向のデータ)の場合のサンプルプログラムを以下に示しておく。
Public Sub sample2() Dim i As Integer Dim r As Range Dim v As Variant 'B2セル~U2セル(データ数は20)に入っている 'データ(横に並んでいる)をRange型変数 r にセット Set r = Range("B2:U2") 'Range型変数 r からVariant型変数 v に代入 v = r 'v の内容を4行目(セルB4~U4)に出力する For i = 1 To 20 Cells(4, i + 1) = v(1, i) '←列データの場合と逆になっている。 Next i End Sub