Excel出力の悩みどころ
Excelは1シートあたりで1,048,576行、16,384列まで使える。
使えるが故に、Excelに目いっぱいデータを出力する業務アプリケーションはよくある。
というか、いっぱい作った。
Excel出力あるある
Excel出力って実装1つですごく遅くなったり速くなったり。
昔、Access VBAでのExcel出力機能を改善することがあったけど、
数時間かかっていたものを書き方を改善させると20秒で出力できたり。
一番あるあるだったのが、1セルずつ出力。
これが100列、10,000行とかあったものだから、そりゃ処理速度遅いよね。。。
改善方法
1セルごとの書き込みを、まとめて書き込みに変えられれば、劇的に速度は改善する。
実装
出力範囲を先に確定させて、二次元配列に値を編集し、その二次元配列をRangeオブジェクトに叩き込めば、一発で書きこみができます。
(なので、変なセル結合があると困るのです。。。)
※Excel 2016です。
標準モジュール
Option Explicit
Public Sub RenderingTrial()
Dim i As Long
Dim j As Long
Dim b As Workbook
Dim w As Worksheet
Dim r As Range
Const RowSize = 10
Const ColumnSize = 5
''配列だけど、定義はVariantで
Dim v As Variant
''出力したいセルの範囲と同サイズの二次元配列を作る
''1次元目:RowSize
''2次元目:ColumnSize
ReDim v(1 To RowSize, 1 To ColumnSize)
''テスト用のデータを投入
For i = LBound(v, 1) To UBound(v, 1)
For j = LBound(v, 2) To UBound(v, 2)
v(i, j) = i * j + (i + j)
Next j
Next i
Set b = ThisWorkbook
Set w = b.Worksheets("TEST")
''配列と同サイズのRangeを作成
''左上のセルを起点に、二次元配列と同じサイズになるよう、Resize
Set r = w.Range("B2").Resize(RowSize, ColumnSize)
''配列を代入
r.Value = v
Set r = Nothing
Set w = Nothing
Set b = Nothing
End Sub