【運営者のこぼれ話】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 マクロ 解説シリーズの中で詳しく解説しますね。

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

運営者・ポテ

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

この記事を書いた人

運営者・ポテソフトデザイン工房|現場の自動化パートナー
■人生を追求する凡人 ■日本一安全で、気の向くままに自分の時間を過ごせる、こだわりのキャンプ場を作るのが夢 ■ソフトデザイン工房代表(個人事業者) - 業務設計&業務支援アプリケーション作成サービスを展開 ■人生は時間そのもの。ひとりでも多くの人が「より良い人生にするために時間を使って欲しい」と願い、仕事のスキルの向上、余暇の充実、資産形成を研究。

コメントを残す

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