複数のセルに値をセットするときは配列を使うと処理が速い

Excelでマクロを使って複数のセルに値をセットする場合、通常は次のようにすると思います。
次のサンプルはA1セルからJ10セルまでの範囲に行番号と列番号の積をセットします。九九の表のような感じです。

Sub test1()
    Const numRow = 10
    Const numCol = 10
    Cells.ClearContents
    For r = 1 To numRow
        For c = 1 To numCol
            Cells(r, c) = r * c
        Next c
    Next r
End Sub

実は複数のセルに配列を使って値をセットする方法があります。
次のサンプルは上のサンプルと同じことを配列を使って処理します。

Sub test2()
    Const numRow = 10
    Const numCol = 10
    ReDim arrs(numRow - 1, numCol - 1)
    Cells.ClearContents
    For r = 1 To numRow
        For c = 1 To numCol
            arrs(r - 1, c - 1) = r * c
        Next c
    Next r
    Range(Cells(1, 1), Cells(numRow, numCol)).Value = arrs
End Sub

「Range(範囲).Value = 配列」とすると指定した範囲に、配列の値がそれぞれセットされます。
配列はゼロから始めます。Rangeで指定した範囲の左上隅が配列の(0,0)に該当します。
範囲と配列のサイズは同じにします。範囲の方が配列より小さいと範囲が限度になります。範囲の方が大きいとはみ出したセルに「#N/A」がセットされます。
「Range(“A1:J10”).Value = arrs」という書き方でも動きますが、範囲を可変にする場合は、サンプルのように、ReDimを使って配列を定義し、Cellsを使ってRangeを指定する方法がよいでしょう。

この方法を使うと驚くほど処理が速いです。

コメント

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