スポンサーリンク

【Excel/VBA】配列~セル範囲の縦一列をがばっと入れる。または横一列をがばっと入れる

excelVBA vba
スポンサーリンク
※当サイトは広告を含みます

配列を理解するための検証シリーズです。

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列縦方向に配列の中身を出力

結果。やはり縦方向に出す⑥が残念な結果に!

f:id:mwke:20210429154822p:plain

⑥をTransposeで書き換えましょう

Range(“I1:I6”).Value = WorksheetFunction.Transpose(arr)

おいっす!OK!

f:id:mwke:20210429155009p:plain

最後までお読みいただきありがとうございました!

こちらもどうぞ!

 【Excel/VBA】配列をがばっと入れる②~セル範囲

スポンサーリンク
スポンサーリンク
vba
スポンサーリンク
mwkをフォローする
エクセルがともだち

コメント

タイトルとURLをコピーしました