スポンサーリンク

セル結合しない方がExcelVBAは超高速パフォーマンス!

セル結合をするとExcelVBAはものすごく遅くなるのを実例で解説しようと思う。

 

1.結合してない50万セルをA列からB列にコピー

2.結合してる50万セルをA列からC列にコピー

 

主に2では読み取る動作が遅くなる。

 

1.まずは結合セル無しを見ていく。

A列の1~500000行まで数値が入っている。

f:id:engineer-kiyo:20201229001338p:plain

↓「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列は結合されている。

f:id:engineer-kiyo:20201229002608p:plain

↓「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個でもあると処理が非常に遅いものになります。何千ページもの帳票を作る場合は特に気を付けましょう。