Kato Ryo Official Site

抽象度とエネルギーを上げる

【Excel VBA】1行(or 1列)のRange型変数をVariant型変数に代入した場合

2017/01/15
 
この記事を書いている人 - WRITER -
Pocket

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
この記事を書いている人 - WRITER -

- Comments -

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Copyright© 抽象度とエネルギーを上げる , 2017 All Rights Reserved.