セル範囲を配列に入れて操作する
VBAで扱うEXCELシートのデータ量が多くなる(数十万セルとか)と、処理に時間がかかってくるようになります。
そんなとき、セルの範囲を一旦配列にぶち込んで配列の中でデータ処理をしてまたシートに戻すっていう方法を取ると早くなる場合があります(^o^)
今回は、そんなセル範囲のデータを配列に打ち込んだり、またシートに戻したりする方法を紹介します!
例えば次のようなデータがあったとします。
A1からA50000までには「1」、B1からB50000までは「2」が入力されています。
C列にA列とB列の合計を1行目から50000行目まで計算したいということを考えてみましょう。
ループを使う
データを配列に入れずに1つずつ計算して、50000行まで計算するとすると次の表なコードが考えられますね。
Sub sample()
Dim i As Long
For i = 1 To 50000
'ステータスバーに処理している行番号を表示する
Application.StatusBar = i & " 行目 処理中"
'A列とB列を足してC列に答えを入れているだけ
Cells(i, 3) = Cells(i, 1) + Cells(i, 2)
Next
'ステータスバーを戻す
Application.StatusBar = False
End Sub
For~Next文を使って順番に処理しています。
実行してみましょう!
※DoEvents入れないと動画撮るときに固まっちゃうので入れてますが、入れなくても大丈夫です。
まぁまぁ時間かかりましたね。。。
配列にしてから処理する
では、これを配列にぶち込んでから処理するとどうなるでしょうか。
セル範囲を配列にぶち込むときは、Variant型の配列を使います。
配列と言っても、普通にVariant型の配列を準備して、そこにセル範囲を打ち込むだけでOKです。
※Variant型の変数にセルの範囲を代入すると、Variant型の配列として記録されます。
コードは次のようになります(^o^)
Sub sample()
'Variant型の変数を準備する
Dim var As Variant
'セルの範囲をvarに代入する(ぶち込む) ※1
var = Range(Cells(1, 1), Cells(50000, 3))
'計算処理
Dim i As Long
For i = 1 To 50000
DoEvents
'ステータスバーに処理している行番号を表示する
Application.StatusBar = i & " 行目 処理中"
'A列とB列を足してC列に答えを入れているだけ
var(i, 3) = var(i, 1) + var(i, 2)
Next
'EXCELシートに戻す(※1の反対)
Range(Cells(1, 1), Cells(50000, 3)) = var
'ステータスバーを戻す
Application.StatusBar = False
End Sub
最初にVariant型の変数を準備して、そのあとその変数にセルの範囲を代入しています。(※1部分)
そのあと計算処理を行っていますが、この時点ではメモリ上の処理のため、シート上のC列には計算結果は出てきません。
最後、EXCELシートに配列を戻すときは※1の左辺と右辺を逆にするだけです。
これでシートに戻ります。
やってみましょう!
ん。これくらいのことだけあんまりスピードは変わらないですね。。。w
もっと大量にや計算が複雑になると大きくスピードも変わる場合もあります(^o^)
データを配列で処理する方法は、プログラムの中でよく使う方法になるのでぜひ覚えておきましょう!
コメント