【運営者のこぼれ話】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だけが書き込まれる。

ABC
123
123
123

これを回避するには、二次元配列にするしかないです。

しかし、最初から二次元配列にすると、Redim Preserveで一次元目の要素のサイズ調整できなくなるのが困ります。したがって、"あとから"二次元にするしかないのですよ。(涙)

このあたり、ノンプログラマー向け Excel VBA マクロ 解説シリーズの中で詳しく解説しますね。

少々ご猶予いただけませんか。

運営者・ポテ

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

この記事を書いた人

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

コメントを残す

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