6
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[Excel VBA]複数セルに値を一発で書き込み

Last updated at Posted at 2017-12-09

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

実行結果

image.png

6
10
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?