これは、手順が非常に忙しいために発生します。たとえばSub TheLoop()
、セルに20995 x 16回アクセスして、文字列を書き込みます。VBAとExcelの相互作用は遅いです。
手順を高速化するためにできることがいくつかあります。
1.プロシージャを実行する前に、イベントハンドラ、画面の更新、および計算を無効にします。手順の最後に、設定を再度復元します。
'Disable'
Application.EnableEvents = False
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
'...... Code'
'Enable'
Application.EnableEvents = True
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
2.最適化できますSub TheLoop
。セルにすぐに書き込む代わりに、配列内に値を書き込みます。配列が値でいっぱいになったら、配列の値を必要な範囲に割り当てます。例えば:
Dim ResultValues() As String
Dim j As Long
ReDim ResultValues(2 To 20997, 1 To 3)
For j = 2 To 20997
ResultValues(j, 1) = "New Defect"
ResultValues(j, 2) = "3"
ResultValues(j, 3) = "2"
Next j
With ThisWorkbook.Worksheets("myWorksheet")
.Range(.Cells(2, 3), .Cells(20997, 5)) = ResultValues
End With
編集:
変更する列の間の列がテキストまたは空のセルのみである場合、次のことができます。
- 範囲全体を配列に読み込みます。
- 次に、現在セルを変更しているのと同じ方法で配列を変更します。
- 変更が完了したら、マトリックス全体を範囲内に再度ダンプします。
例えば:
Sub TheLoop()
Dim arrRangeValues() as Variant
Dim j as Long
arrRangeValues= Range("A2:V20997").Value2
For j = 2 To 20997
arrRangeValues(j, 1) = "Defect" 'Cells(row_index , column_index)'
arrRangeValues(j, 3) = "New Defect"
arrRangeValues(j, 4) = "3" ' this one also might be empty'
arrRangeValues(j, 5) = "2" ' this one also might be empty'
arrRangeValues(j, 7) = "Name Surname"
arrRangeValues(j, 8) = arrRangeValues(j, 7)
arrRangeValues(j, 16) = arrRangeValues(j, 7)
...
arrRangeValues(j, 10) = " http://SERVER_NAME:8888/PROJECT_NAME/ "
Next j
Range("A2:V20997").Value2 = arrRangeValues
End Sub