VBA循环效率
VBA loop efficiency
我已经多次使用网站上找到的答案,但这是我的第一个 post。
在函数或 sub 中执行 for 循环还是仅将循环的增量值作为参数发送到函数或 sub 中更有效?
我正在将一些文本数据文件导入Excel,解析出各个字段,然后将一些字段拆分为单个字符。我正在使用的一个文件是一份医生名单。我有姓名、地址、phone、DEA 编号、NPI 等
在检查 DEA 号码时,我有一个接收要检查的行号的子程序,它将 DEA 拆分为各个数字,一次对这些数字执行一个检查,然后修改另一个字段,状态为那个 DEA。如果此状态单元格包含单词 "GOOD" 以外的任何内容,则该单元格将显示为红色。另外,如果适用的话,我正在为坏的单个数字着色。
这个 sub 做了很多事情,我可能会把它分解一下,但是医生文件中没有任何其他地方我正在执行这个确切的步骤,所以我想我应该保持它是的。
无论如何,真正的问题是我是应该将行号发送到子程序中,还是应该只调用子程序并让子程序计算行数并进行检查。在第一种情况下,我将调用 sub 的次数等于 doctor 文件中的行数。在第二个中,我将调用 sub 一次并且 sub 包含每一行的 for 循环。通常哪个更有效率。
抱歉,如果我看起来多余。我训练了一些复杂的软件,这种东西有时会渗透到生活的其他领域。
编辑:我试图将其添加到评论中,但在这里 post 的经验不足。如果我为此违反了一些规则,我深表歉意...
这是我目前用来调用子程序的代码:
'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 循环还是保持原样更好?
这个问题目前过于宽泛,无法有效回答。因此,我只是提供一个可能有助于您构建程序的小见识。
通常情况下,最高效的代码是所有变量都尽可能本地化的代码。如果在循环中使用全局变量或调用其他函数,这将比使用局部变量执行所有计算要糟糕得多。
如果你想测试每一个,并为它们计时,你可以使用计时器。如果你有一个重大的差距,你将能够抓住它。如果不是,您的答案在处理时间方面没有显着差异。
- 您可以使用它并从
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.
我已经多次使用网站上找到的答案,但这是我的第一个 post。
在函数或 sub 中执行 for 循环还是仅将循环的增量值作为参数发送到函数或 sub 中更有效?
我正在将一些文本数据文件导入Excel,解析出各个字段,然后将一些字段拆分为单个字符。我正在使用的一个文件是一份医生名单。我有姓名、地址、phone、DEA 编号、NPI 等
在检查 DEA 号码时,我有一个接收要检查的行号的子程序,它将 DEA 拆分为各个数字,一次对这些数字执行一个检查,然后修改另一个字段,状态为那个 DEA。如果此状态单元格包含单词 "GOOD" 以外的任何内容,则该单元格将显示为红色。另外,如果适用的话,我正在为坏的单个数字着色。
这个 sub 做了很多事情,我可能会把它分解一下,但是医生文件中没有任何其他地方我正在执行这个确切的步骤,所以我想我应该保持它是的。
无论如何,真正的问题是我是应该将行号发送到子程序中,还是应该只调用子程序并让子程序计算行数并进行检查。在第一种情况下,我将调用 sub 的次数等于 doctor 文件中的行数。在第二个中,我将调用 sub 一次并且 sub 包含每一行的 for 循环。通常哪个更有效率。
抱歉,如果我看起来多余。我训练了一些复杂的软件,这种东西有时会渗透到生活的其他领域。
编辑:我试图将其添加到评论中,但在这里 post 的经验不足。如果我为此违反了一些规则,我深表歉意...
这是我目前用来调用子程序的代码:
'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 循环还是保持原样更好?
这个问题目前过于宽泛,无法有效回答。因此,我只是提供一个可能有助于您构建程序的小见识。
通常情况下,最高效的代码是所有变量都尽可能本地化的代码。如果在循环中使用全局变量或调用其他函数,这将比使用局部变量执行所有计算要糟糕得多。
如果你想测试每一个,并为它们计时,你可以使用计时器。如果你有一个重大的差距,你将能够抓住它。如果不是,您的答案在处理时间方面没有显着差异。
- 您可以使用它并从
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.