【ExcelVBA】処理が遅い場合の対処法(高速化/速度改善)
スポンサーリンク

概要

処理が遅い場合は以下の方法を試してみてください。

  1. 描画停止…一時的に描画を停止することで高速化する。
  2. 自動再計算停止…一時的に自動再計算を停止することで高速化する。
  3. セル範囲一括操作…セルへアクセスする回数を極力減らすことで高速化する。

描画停止

一時的に描画を停止することで高速化できます。

コード

Sub Function1()
    
    ' 描画停止
    Application.ScreenUpdating = False
    
    'ここで重い処理を行う
    '...
    
    ' 描画再開
    Application.ScreenUpdating = True
    
End Sub

要点

  1. 描画しないため処理が高速化される。

自動再計算停止

一時的に自動再計算を停止することで高速化できます。

コード

Sub Function2()
    
    '手動再計算
    Application.Calculation = xlCalculationManual
    
    'ここで重い処理を行う
    '...
    
    '自動再計算
    Application.Calculation = xlCalculationAutomatic
    
End Sub

要点

  1. 再計算しないため処理が高速化される。

セル範囲一括操作

セルへアクセスする回数を極力減らすことで高速化できます。

コード

高速化前(1つずつコピー)

Sub Function3()
    
    Dim data1 As String
    
    Dim row_start As Integer: row_start = 1
    Dim row_end As Integer: row_end = 10000
    Dim col_start As Integer: col_start = 1
    Dim col_end As Integer: col_end = 10
    Dim col_offset As Integer: col_offset = 100
    
    '開始時間計測
    startTime = Timer
    
    '1つずつコピー
    For row_index = row_start To row_end
        For col_index = col_start To col_end
            '取得
            data1 = Cells(row_index, col_index).Value
            '設定
            Cells(row_index, col_index + col_offset).Value = data1
        Next
    Next
    
    '終了時間計測
    endTime = Timer
    processTime = endTime - startTime
    Debug.Print ("経過時間[" & processTime & "]秒")
    
End Sub
実行結果

経過時間[10.50781]秒

高速化後(一括コピー)

Sub Function4()
    
    Dim data1 As Variant
    
    Dim row_start As Integer: row_start = 1
    Dim row_end As Integer: row_end = 10000
    Dim col_start As Integer: col_start = 1
    Dim col_end As Integer: col_end = 10
    Dim col_offset As Integer: col_offset = 100
    
    '開始時間計測
    startTime = Timer
    
    '一括コピー
        '取得
        data1 = Range(Cells(row_start, col_start), Cells(row_end, col_end)).Value
        '設定
        Range(Cells(row_start, col_start + col_offset), Cells(row_end, col_end + col_offset)).Value = data1
    
    '終了時間計測
    endTime = Timer
    processTime = endTime - startTime
    Debug.Print ("経過時間[" & processTime & "]秒")
    
End Sub
実行結果

経過時間[0.0859375]秒

要点

  1. セルへアクセスする回数を取得と設定の2回にすることで、処理が劇的に速くなる。

関連リンク

  1. 【ExcelVBA】目次

外部リンク

  1. VBA の処理を高速化する
スポンサーリンク
おすすめの記事