Option Explicit
Private Declare Function timeGetTime Lib "winmm.dll" () As Long
'-------------------------------------------------
Private Function timechk(t As Long) As Long
Static chk As Long
timechk = t - chk
chk = t
End Function
'-------------------------------------------------
Sub test()
Const x = 100
Const y = 1000
Dim i As Long
Dim v, w(4, 2)
Application.ScreenUpdating = False
With Workbooks.Add(xlWBATWorksheet)
With .Worksheets(1).Cells(1).Resize(y, x)
.Value = "abcde"
w(0, 1) = "Events=True"
w(0, 2) = "Events=False"
w(1, 0) = "v = .Value"
w(2, 0) = ".ClearContents"
w(3, 0) = ".Value = v"
w(4, 0) = "計"
For i = 1 To 2
Call timechk(timeGetTime)
v = .Value
w(1, i) = timechk(timeGetTime)
.ClearContents
w(2, i) = timechk(timeGetTime)
.Value = v
w(3, i) = timechk(timeGetTime)
Application.EnableEvents = False
Next
Application.EnableEvents = True
End With
w(4, 1) = w(1, 1) + w(2, 1) + w(3, 1)
w(4, 2) = w(1, 2) + w(2, 2) + w(3, 2)
.Sheets.Add.Cells(1).Resize(5, 3).Value = w
End With
Application.ScreenUpdating = True
End Sub
こんなコードでちょっと実験してみた事があります。
PCの性能にもよりますが、xl2000では1secかからない処理です。2007だと4secかかります。
ただ、2回目のLoopは、Application.EnableEvents = False を入れているため1sec程度に改善します。
ClearContentsメソッドやセル範囲への配列書込み時など、
『イベントプロシージャがない場合でもEnableEventsプロパティは制御したほうが良い』
みたいです。
上記は一例に過ぎませんが、処理内容によっては、バージョンを意識したコーディングが必要という事なのでしょう。
ちょっとした工夫をする事で、少しは改善するかもしれません。
お礼
わざわざ具体的な例を示していただき、ありがとうございました。