二次元配列のデータをセルに高速で貼り付ける方法
データをセルに貼り付け、と聞くとすぐに思いつくのは各データをカンマで区切ったCSVファイルです。
ただ、CSVファイルから直接セルに貼り付けようとすると1セルずつ処理することになり、ファイル読み込みを行いながらセルへの貼り付けを行うことの効率の悪さや、1セルずつ処理を行うことでの再描画や再計算が発生することなどにより、処理速度が遅くなる恐れがあります。
そこで、CSVファイルから二次元配列に変換(ファイルをメモリ領域に格納)し、その二次元配列を1セルずつではなく1回で全てのセルに貼り付ける(メモリのデータを1回で貼り付け)、というデータ化と1度でセルに貼り付けの二段階に処理を行うことにします。
CSVファイルから二次元配列への変換方法は「VBAでCSVファイルを二次元配列に格納する」を参照ください。ここではそれ以降の二次元配列を1度にセルに貼り付ける処理方法を紹介します。
二次元配列の全データを1度に対象セル全てに貼り付けるコード
1度に対象セル全てに貼り付けるコードの書き方にはいくつかありますが、セル範囲の開始と終了を指定する方法と、開始セルから貼り付け範囲まで拡張する方法の2つを紹介します。どちらを使っても構いません。
処理速度を測定してもどちらが速いか分からないぐらいの差です。
1 2 3 4 5 |
'// Rangeオブジェクトで貼り付けるセル範囲の開始と終了を指定する場合 Range(開始セル, 終了セル).Value = ar '// Rangeオブジェクトで開始セルから貼り付けるセル範囲を拡張する場合 Range(開始セル).Resize(行数, 列数).Value = ar |
サンプルコード
二次元配列を用意し、それを1度でセルに貼り付けるサンプルです。上で書いた2通りの書き方のそれぞれで貼り付けを行っています。
なお、貼り付け先のセル範囲を特定するために二次元配列の1次元目と2次元目の要素数を取得しています。二次元配列の要素数の取得方法の詳細は「配列の要素数を取得する(UBound、LBound)」を参照ください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
Sub Array2ToCell() Dim ar(3, 5) '// 二次元配列 Dim iRow '// データ設定用の行カウンタ Dim iCol '// データ設定用の列カウンタ Dim iRowMax '// 二次元配列の最大行数 Dim iColMax '// 二次元配列の最大列数 '// テストデータ用に二次元配列に値を設定 For iRow = 0 To 3 For iCol = 0 To 5 ar(iRow, iCol) = CStr(iRow) & CStr(iCol) Next Next '// 1次元目の要素数を取得 iRowMax = UBound(ar, 1) - LBound(ar, 1) + 1 '// 2次元目の要素数を取得 iColMax = UBound(ar, 2) - LBound(ar, 2) + 1 '// Rangeオブジェクトで貼り付けるセル範囲を指定する場合 Range(Cells(1, 1), Cells(iRowMax, iColMax)).Value = ar '// Rangeオブジェクトで開始セルから貼り付けるセル範囲を拡張する場合 Range("C6").Resize(iRowMax, iColMax).Value = ar End Sub |
実行結果(事前にセルの書式を文字列にしています)