VBA循环效率

时间:2015-01-14 17:40:36

标签: performance excel-vba for-loop vba excel

我已经在网站上找到了很多次的答案,但这是我的第一篇文章。

在函数或子函数中执行for循环或者只是将循环的递增值作为参数发送到函数或子函数中是否更有效?

我正在将一些文本数据文件导入Excel,解析出各个字段,然后将一些字段拆分为单个字符。我使用的一个文件是医生列表。我有姓名,地址,电话,DEA号码,NPI等。

当检查DEA号码时,我有一个子接收要检查的行号,它将DEA分成各自的数字,一次检查这些数字,然后修改具有该DEA状态的另一个字段。如果该状态单元格中包含除“GOOD”之外的任何内容,则该状态单元格将显示为红色。此外,如果适用,我正在为不好的个别数字着色。

这一个子做了很多,我可能会分解一下,但是医生文件中没有任何其他地方我正在执行这个确切的步骤,所以我想我应该保持它像它是

无论如何,真正的问题是我是否应该将行号发送到子或我应该只调用子并让子计算行数并进行检查。在第一种情况下,我将调用sub多次等于doctor文件中的行数。在第二个中,我将调用sub一次,sub包含每行的for循环。这通常更有效率。

如果我看起来多余,请道歉。我训练一些复杂的软件,有时候这种事情会泄漏到其他生活领域。

编辑:我试图将此添加到评论中,但在此处发布的经验不足。如果我违反了一些规则,我会道歉......

这是我目前用来调用sub的代码:

'Use the Doctor Last Name as the number of rows count
Dim numRows As Integer
numRows = Application.CountA(Sheets("DoctorDEA").Range("m:m"))

'lineCtr is the Line Counter used to iterate the FOR loops
Dim lineCtr As Integer
    lineCtr = 1

'Call DEACHecking and DisplayIssues Subs
For lineCtr = 1 To numRows - 1
    DEAChecking (lineCtr)
    DisplayIssues (lineCtr)
Next lineCtr

我的问题是:如果只调用没有参数的DEAChecking并且让DEAChecking计算行号然后使用FOR循环或保持原样,那会更好吗?

2 个答案:

答案 0 :(得分:1)

这个问题现在太宽泛,无法有效回答。所以我只是提供一个可以帮助您构建程序的小知识。

通常,最有效的代码是所有变量尽可能本地的代码。如果在循环内部使用全局变量或调用其他函数,则比使用局部变量执行所有计算要差得多。

答案 1 :(得分:0)

如果你想测试每个,并计时,你可以使用计时器。如果你有一个主要的差距,你将能够抓住它。如果没有,您将得到答案,处理时间没有显着差异。

  • 您可以使用此功能并从TimerTest调用您的子版,或者只是在代码的开头调用Call TimerStart,最后调用TimerStop
  • 使用计时器
  • 运行一些代码
  • 记录结果
  • 重复并比较
  • HH:MM:SS:00格式

计时器代码:

Public strStartTime As String
Public strEndTime As String
Public startTime As Date
Public endTime As Date


Sub timeTest()

    Call TimerStart
        'INSERT CALL TO YOUR SUB HERE
    Call TimerStop   

End Sub

Sub TimerStart()

    startTime = Now

End Sub

Sub TimerStop()

    endTime = Now

'Waited until the timer stopped to perform any additional code, such as formatting the time

    Dim TotalTime As String

    strStartTime = Format(startTime, "hh:mm:ss:" & Right(Format(Timer, "#0.00"), 2))  
    strEndTime = Format(endTime, "hh:mm:ss:" & Right(Format(Timer, "#0.00"), 2))
    TotalTime = Format(endTime - startTime, "hh:mm:ss:" & Right(Format(Timer, "#0.00"), 2))

    MsgBox ("      Start: " & strStartTime & vbNewLine & _
            "        End: " & strEndTime & vbNewLine & _
            "Total Time : " & TotalTime)               
End Sub

信用: @Nick Dandoulakis在他的回答中提到了计时器格式:Providing this solution to show clock time with accuracy of less than a second