現在、日常的に使用しているexcelで処理時間が問題となり調査している過程で表題に挙げた問題に出会いました。
現象は以下の手順で容易に再現できるが原因がわかりません。よろしくお願いします。
簡単にその事象が確認出来るスクリプトを下記しました。
このスクリプト実行すると各サブ・プロシージャ(Proc_A,Proc_B)と全体の実行時間が表示される。
下の表は、このスクリプトを使って各々10回の試行にて測定した処理時間の平均とばらつきです。
実際にはPC環境を(DELL、Win7、Office2010-32Bit)、(Lenovo、Win7、Office2010-32Bit)、(Dynabook、Win8、Office2010-64Bit)
と変えて実施しました。処理時間は環境による違いはありますが、現象は変わりません。 下の表はDELL環境による測定結果です。
1.
Proc_A,Proc_Bのfor-nextカウンターJを(J=0 to 6)とし、マウスカーソル
をシート内に置いた状態にし、ショートカット・キーでスクリプトを実行。
--------------- J=0, シート内 --+-- J=0, シート外 --
平均 分散 平均 分散
Proc_A(T1-T0) 0.002 0.000 0.002 0.000
Proc_A(T2-T1) 0.001 0.000 0.000 0.000
Proc_A(End-T0) 0.067 0.000 0.070 0.000
2.
Proc_A,Proc_Bのfor-nextカウンターJを(J=6 to 6)とし、マウスカーソル
をシートの外に移した状態にし、ショートカット・キーでスクリプトを実行。
--------------- J=6, シート内 --+-- J=6, シート外 --
平均 分散 平均 分散
Proc_A(T1-T0) 0.000 0.000 0.000 0.000
Proc_A(T2-T1) 0.000 0.000 0.000 0.000
Proc_A(End-T0) 0.565 0.000 0.076 0.000
<------------ 今回のテストに使ったスクリプト ----->
Option Explicit
Dim C As Variant
Dim R As Variant
Dim T0 As Double
Dim T1 As Double
Dim T2 As Double
Private Sub Proc_A()
Dim i As Integer
Dim j As Integer
ReDim C(6, 300)
For i = 0 To 299
For j = 0 To 6
C(j, i) = "Test"
Next j
Next i
End Sub
Private Sub Proc_B()
Dim i As Integer
Dim j As Integer
ReDim R(6, 300)
For i = 0 To 200
For j = 0 To 6
R(j, i) = C(j, i)
Next j
Next i
End Sub
Private Sub Proc_C()
Dim i As Integer
Dim j As Integer
For i = 0 To 200
For j = 0 To 6
Cells(2 + i, 4 + j).Value = C(j, i)
Next j
Next i
End Sub
Sub Test()
Application.ScreenUpdating = False
Worksheets("sheet1").Activate
T0 = CDbl(Timer)
Range("B2:B5").ClearContents
Range("D1:J300").ClearContents
Proc_A '配列Cに文字列"TEST"を代入。
T1 = CDbl(Timer)
Proc_B '配列Cの各要素を配列Rに代入する。
T2 = CDbl(Timer)
Proc_C '配列Rの各要素をセルに書き出す。
Application.ScreenUpdating = True
Range("B2").Value = T1 - T0 'Proc_Aの処理時間。
Range("B3").Value = T2 - T1 'Proc_Bの処理時間。
Range("B5").Value = CDbl(Timer) - T0 '全体の処理時間。
Beep
End Sub