配列を理解するための検証シリーズです。
VBAを書くうえで、配列信者で多用しています。
だけど、イマイチ理解できていないことがあるので思いつくまま検証する、というシリーズ。
■配列にセル範囲縦一列をがばっと入れた時の挙動
このような縦一列の値があります。
こちらをがばっと配列に入れて、別のところへ転記しよと思います。
以下のコードを書きました。
Sub test()
’配列縦一列を入れる
Dim arr As Variant ’①
arr = Range(“A2:A11”).Value ’②
Stop ’③
’3列目に転記する
Dim i As Long
For i = LBound(arr) To UBound(arr) ’④
Cells(i + 1, 3).Value = arr(i, 1) ’⑤
Next i
End Sub
①配列arrを宣言します。
セル範囲をがばっと入れるので、Variant型にしています。
この場合、配列ですが、変数名の後のカッコはつけません。
②セル範囲A2~A11の値を配列arrに突っ込みます
③ここでいったんマクロの実行をストップしています。
エディタのメニューバー「表示」→「ローカルウインドウ」を表示して配列arrの中身を確認します。
縦一列の内容を配列に入れましたが一次元配列ではなく二次元配列になっているのがわかります。
一番目の要素がカウントアップしており、二番目の要素は「1」で固定ですね。
④3列目に順番に配列の中身を出力します。
LBound(arr)で配列の最小値「1」からUBound(arr)で配列の最大値「10」までループします。
⑤3列目の2行目から配列の中身を出力します。
配列は二次元配列なので arr(i,1) とします。arr(i)ではエラーになるので注意が必要です。
がばっと入れたのでがばっと出してみようと思います。
コードを書き替えました。
Sub test()
’配列縦一列を入れる
Dim arr As Variant
arr = Range(“A2:A11”).Value ’①
’縦に出力
Range(“C2:C11”).Value = arr ’②
’横に出力
Range(“E1:N1”).Value = arr ’③
End Sub
①は上と同じです
②は出力先をC列2行目から11行目に指定し縦に出力します
③は出力先を1行目のE列からN列に指定し、横に出力しようとしています。
結果はこのようになりました。
結果が分かりやすいように元データをA~Jにしました。
③の横に出力は残念な結果となりました。
WorksheetFunction.Transposeを使うと配列の縦横を入れ替えできます。
③の部分を書き換えました。
‘横に出力
Range(“E1:N1”).Value = WorksheetFunction.Transpose(arr)
うまくいきました。
縦横入れ替えしたらどうなったのかをみたいのでいったんarr2に入れてみることにして、③を書き換えます。
‘横に出力
Dim arr2 As Variant
arr2 = WorksheetFunction.Transpose(arr)
Stop
Range(“E1:N1”).Value = arr2
縦横入れ替えしてarr2に入れて、Stopのところでローカルウインドウから配列arr2の中身を見てみます。
おやっ。今度は一次元配列になってますね。
ふ~ん。(説明できないが、そうなるらしい)
■配列にセル範囲横一列をがばっと入れた時の挙動
横一列でも実験。
Sub test2()
’配列横一列を入れる
Dim arr As Variant ’①
arr = Range(“A1”).CurrentRegion.Value ’②
Dim i As Long
For i = LBound(arr, 2) To UBound(arr, 2) ’③
Cells(3, i).Value = arr(1, i) ’④
Next i
Range(“A6:F6”).Value = arr ’⑤
Range(“I1:I6”).Value = arr ’⑥
End Sub
①Dim arr As Variant
配列を宣言
②arr = Range(“A1”).CurrentRegion.Value
arrに配列を入れる。今回はセルA1から一続きのセル範囲を配列に入れる、という書き方をしています。
ここでローカルウインドウで配列の中身を見てみます。
一次元目は「1」で固定、二次元目がカウントアップとなっていますね。
③For i = LBound(arr, 2) To UBound(arr, 2)
配列を最初から最後までループします。
注意するところはUBound(arr,2)と「二次元目の最後までね!」と次元を省略せず指定します。指定しないと一次元目が「1」で固定なので1回のループで終わります。。。
④Cells(3, i).Value = arr(1, i)
3行目に出力します。
二次元目がカウントアップなので、縦の時と反対にarr(1,i)と最後の次元に変数 i を設定します。
⑤Range(“A6:F6”).Value = arr
6行目A~F列に配列の中身を横に出力
⑥Range(“I1:I6”).Value = arr
I列縦方向に配列の中身を出力
結果。やはり縦方向に出す⑥が残念な結果に!
⑥をTransposeで書き換えましょう
Range(“I1:I6”).Value = WorksheetFunction.Transpose(arr)
おいっす!OK!
最後までお読みいただきありがとうございました!
こちらもどうぞ!
コメント