【運営者のこぼれ話】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 マクロ 解説シリーズの中で詳しく解説しますね。
少々ご猶予いただけませんか。

ご覧いただきありがとうございました。
この記事を書いた人
- ■人生を追求する凡人■日本一安全で、気の向くままに自分の時間を過ごせる、こだわりのキャンプ場を作るのが夢■光学・機械系エンジニア(歴20年、内マネジメント10年、特許数件権利化)/副業フリーランスエンジニア■読書・文学愛好■人生は時間そのもの。ひとりでも多くの人が「より良い人生にするために時間を使って欲しい」と願い、仕事のスキルの向上、余暇の充実、資産形成を研究。■VBAアプリ開発サービス提供中(業務委託 / VBA使用経験20年)■Python愛好(歴5年)■VBAエキスパート「Excel VBA スタンダード」(上級者向け資格)/ Python 3 エンジニア認定基礎(経済産業省「ITスキル標準(ITSS)」に掲載)