【发布时间】:2015-01-14 17:40:35
【问题描述】:
我已经多次使用网站上的答案,但这是我的第一篇文章。
在函数或子程序中执行 for 循环或仅将循环的递增值作为参数发送到函数或子程序是否更有效?
我正在将一些文本数据文件导入 Excel,解析出各个字段,然后将一些字段拆分为单个字符。我正在使用的一个文件是医生名单。我有姓名、地址、电话、DEA 号码、NPI 等。
在检查 DEA 号码时,我有一个接收要检查的行号的子程序,它将 DEA 拆分为各个数字,一次对这些数字执行一个检查,然后使用该 DEA 的状态修改另一个字段.如果该状态单元格包含“GOOD”以外的任何内容,则该状态单元格将显示为红色。此外,如果适用,我正在为个别数字着色。
这个子做了很多工作,我可能会稍微分解一下,但是医生文件中没有任何其他地方可以执行这个确切的步骤,所以我想我应该保持原样.
无论如何,真正的问题是我应该将行号发送到 sub 还是应该只调用 sub 并让 sub 计算行数并进行检查。在第一种情况下,我将调用 sub 的次数等于医生文件中的行数。在第二个中,我将调用 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 循环还是保持原样?
【问题讨论】:
-
如果您重复调用具有新条件的子,则子必须设置环境(例如
With Sheets("mySheet") ... End With或 Set ws = Sheets("mySheet"), last_row = ... 等)来处理程序。如果循环在 sub 内,则环境只设置一次。 -
性能不是问题,从磁盘或网络读取文件需要更多更长的时间。专注于编写逻辑和可维护的代码。
-
汉斯,我想这是我问题的本质。我知道它会以任何一种方式工作。我只是不知道哪个更喜欢。
标签: performance excel for-loop vba