【发布时间】:2017-11-06 22:41:55
【问题描述】:
刚开始使用 VBA,我的代码非常缓慢。我在网络驱动器上有许多工作簿,每个工作簿都有几个工作表。我正在尝试使用以下代码从每个工作表中的多个非连续范围获取数据到预先设计的工作表:
Private Function GetValue(path, file, sheet, ref)
'retrieve value
'// code
GetValue = ExecuteExcel4Macro(arg)
End Function
Sub UpdateModel1()
sheet = "blah blah"
Application.ScreenUpdating = False
'Outputs
destRow = 31 'destination row
destCol = 6 'destination column
srcRow = 50 'source row
For C = 23 To 31 'loop through source columns
ref = Cells(srcRow, C).Address
Cells(destRow, destCol) = GetValue(path, file, sheet, ref)
destCol = destCol + 1
Next C
Application.ScreenUpdating = True
End Sub
但是,在 sub 过程中使用嵌套的 for 循环需要的时间太长。有关如何改进此代码的任何建议? PS:这是一个业余爱好者的代码,我只是在寻找能够体面地完成工作的东西。
【问题讨论】:
-
也许 GetValue 会减慢它的速度,因为循环的迭代次数并不多。您是否尝试不使用 GetValue 来查看它的执行速度有多快?
-
我不明白这一点:
ExecuteExcel4Macro(arg)arg 没有在任何地方定义,那么您就不要使用传递给函数的变量。当你运行它时,你得到除了“=”之外的任何结果吗? -
看起来您的“GetValue”函数打开了一个工作簿并提取了一个值,然后将其关闭。这是一个昂贵的过程。更不用说您是通过网络连接执行此操作的。甚至更贵。现在它处于一个循环中。怪不得这么慢。如果这不是常规过程,您可能只需将文件复制到本地计算机。此外,如果可能,您可以在源文件仍处于打开状态时将多个值复制到目标文件。