セル結合をするとExcelVBAはものすごく遅くなるのを実例で解説しようと思う。
1.結合してない50万セルをA列からB列にコピー
2.結合してる50万セルをA列からC列にコピー
主に2では読み取る動作が遅くなる。
1.まずは結合セル無しを見ていく。
A列の1~500000行まで数値が入っている。
↓「A列からB列に値をコピー」ボタン押下で実行されるVBA
※nowtimeは自作関数なのでもしコピペして試す場合は、Nowの方をアンコメントして使ってください。
Public Sub noUnion()
Dim i As Long
Dim nLastRow As Long
' B列の値をクリア
Sheet1.Columns(2).Clear
' Debug.Print Now & " start"
Debug.Print nowtime & " start"
' 最終行を取得
nLastRow = Sheet1.Range("A1").End(xlDown).Row
For i = 1 To nLastRow
'A列の値をB列にコピー
Sheet1.Range("B" & i).Value = Sheet1.Range("A" & i).Value
If i Mod 10000 = 0 Then
Application.StatusBar = i
DoEvents
End If
Next i
' Debug.Print Now & " end"
Debug.Print nowtime & " End"
Application.StatusBar = ""
End Sub
処理時間は18秒
2.次に結合セルありを見ていく
A列の1~500000行まで数値が入っている。A列とB列は結合されている。
↓「A列をC列にコピー」ボタン押下で実行されるVBA
※B列がC列に変わっただけである。※nowtimeは自作関数なのでもしコピペして試す場合は、Nowの方をアンコメントして使ってください。
Public Sub Union()
Dim i As Long
Dim nLastRow As Long
' C列の値をクリア
Sheet1.Columns(3).Clear
' Debug.Print Now & " start"
Debug.Print nowtime & " start"
' 最終行を取得
nLastRow = Sheet1.Range("A1").End(xlDown).Row
For i = 1 To nLastRow
'A列の値をC列にコピー
Sheet1.Range("C" & i).Value = Sheet1.Range("A" & i).Value
If i Mod 10000 = 0 Then
Application.StatusBar = i
DoEvents
End If
Next i
' Debug.Print Now & " end"
Debug.Print nowtime & " End"
Application.StatusBar = ""
End Sub
処理時間は150秒
なんとセル結合なしの8倍もの時間がかかる。
セル結合すると遅いのである。
今回はセルの値を読み取るところだけの話であるが、セルに値を挿入、行のコピー等、とにかくすべての動作が遅くなるので大量に処理するエクセルではセル結合は絶対に使わないことをお勧めする。少ないデータ数なら遅くなっても全然気にならないが、普段からセル結合はしないようにすることをお勧めする。
エクセルの帳票に結合セルが1個でもあると処理が非常に遅いものになります。何千ページもの帳票を作る場合は特に気を付けましょう。