【運営者のこぼれ話】VBAで一次元配列をシートの縦方向へ書き戻すと、先頭の要素がだけが繰り返し書き込まれる(涙)
アフィリエイト広告を利用しています。


いつもありがとうございます。
結論から言うと、そりゃそうなんですよね。
一次元配列をワークシートの縦方向へ書き戻すと、先頭の要素がだけが繰り返し書き込まれます。
例を示しますね。
Sub WriteBackTest()
' 変数宣言
Dim wb As Workbook
Dim ws As Worksheet
Dim arr(1 To 3) As Variant
' 配列に値を格納
arr(1) = 1
arr(2) = 2
arr(3) = 3
' ワークブックを取得
Set wb = ThisWorkbook
Set ws = wb.Worksheets(1)
' ワークシートに書き戻し
'' 横方向に書き戻し
ws.Range(ws.Cells(1, 1), ws.Cells(1, 3)).Value = arr
'' 縦方向に書き戻し
ws.Range(ws.Cells(3, 1), ws.Cells(5, 1)).Value = arr
End Sub
このコードを実行すると、こうなります。

横方向に書き戻すと正常に書き戻せる。一方で、縦方向に書き戻すと、先頭要素の"1"だけが繰り返し書き込まれる。
このA列の3~5行目がその現象ですね。
稚拙な表現かもしれませんが、一次元配列は、要素が"横方向"に格納されているからですね。そのため、各セルに配列の先頭の要素だけが書き込まれちゃいます。
下表のイメージです。書き込むセルの範囲をA列(ws.Range(ws.Cells(3, 1), ws.Cells(5, 1)).Value
)に指定しているので、配列の先頭要素の1だけが書き込まれる。
A | B | C |
---|---|---|
1 | 2 | 3 |
1 | 2 | 3 |
1 | 2 | 3 |
これを回避するには、二次元配列にするしかないです。
しかし、最初から二次元配列にすると、Redim Preserve
で一次元目の要素のサイズ調整できなくなるのが困ります。したがって、"あとから"二次元にするしかないのですよ。(涙)
このあたり、ノンプログラマー向け Excel VBA マクロ 解説シリーズの中で詳しく解説しますね。
少々ご猶予いただけませんか。

ご覧いただきありがとうございました。