Тестирование кода VBA - PullRequest
       12

Тестирование кода VBA

13 голосов
/ 18 августа 2011

Что считается наиболее точным способом сравнения кода VBA (в моем случае я тестирую код в Excel)?Существуют ли другие методы для тестирования кода, кроме приведенных ниже 2, и если да, то каковы плюсы / минусы метода?

Вот 2 популярных метода.Таймер

Sub TimerBenchmark()

Dim benchmark As Double
benchmark = Timer

'Do your code here

MsgBox Timer - benchmark

End Sub

И Тик (который я считаю аргументированным как наиболее точный):

Option Explicit
Private Declare Function GetTickCount Lib "kernel32" () As Long

Sub TickBenchmark()

Dim Start As Long
Dim Finish As Long

Start = GetTickCount()

'Do your code here

Finish = GetTickCount()
MsgBox CStr((Finish - Start) / 1000)

End Sub

Ответы [ 4 ]

15 голосов
/ 19 августа 2011

В следующем коде используется функция Windows, более точная, чем в Excel. Он взят из http://msdn.microsoft.com/en-us/library/aa730921.aspx#Office2007excelPerf_MakingWorkbooksCalculateFaster. На этой же странице содержатся некоторые полезные советы по повышению производительности в Excel 2007.

Private Declare Function getFrequency Lib "kernel32" _
Alias "QueryPerformanceFrequency" (cyFrequency As Currency) As Long
Private Declare Function getTickCount Lib "kernel32" _
Alias "QueryPerformanceCounter" (cyTickCount As Currency) As Long

Function MicroTimer() As Double

  'Returns seconds.

  Dim cyTicks1 As Currency
  Static cyFrequency As Currency
  MicroTimer = 0

  ' Get frequency.
  If cyFrequency = 0 Then getFrequency cyFrequency

  ' Get ticks.
  getTickCount cyTicks1                            

  ' Seconds
  If cyFrequency Then MicroTimer = cyTicks1 / cyFrequency 
End Function
6 голосов
/ 18 августа 2011

Интересный вопрос.На самом деле это не полный ответ, но это слишком долго, чтобы публиковать его в качестве комментария.
То, что я использую, - это такая процедура:

Option Explicit
Public Time As Double
Sub Chrono()
If Time = 0 Then
    Time = Now()
Else
    MsgBox "Total time :" & Application.Text(Now() - _
        Time, "mm:ss") & "."  'or whatever if not a msgbox
    Time = 0
End If
End Sub

Таким образом, вы можете поместить свой код везде, где выхотите и должны вызывать его только дважды (например):

If C_DEBUG Then Call Chrono

В начале и в конце части кода, которую вы хотите протестировать.

Тем не менее, я бы сказал,нет реального «точного» метода, потому что он также зависит от того, что работает на вашем компьютере.Я бы сказал, что эти методы в основном помогут определить, какой код лучше , чем другой.

2 голосов
/ 18 августа 2011

Любое измерение будет шумным, поэтому, если вам нужна точность, повторите измерение много раз и усредните результат.

1 голос
/ 14 сентября 2011

Professional Excel Development содержит утилиту dll PerfMon, которую я предпочитаю за ее точность и, поскольку ее легко вставить в код с помощью пары нажатий в меню

...