【问题标题】:VBA for loop takes too longVBA for 循环耗时太长
【发布时间】: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”函数打开了一个工作簿并提取了一个值,然后将其关闭。这是一个昂贵的过程。更不用说您是通过网络连接执行此操作的。甚至更贵。现在它处于一个循环中。怪不得这么慢。如果这不是常规过程,您可能只需将文件复制到本地计算机。此外,如果可能,您可以在源文件仍处于打开状态时将多个值复制到目标文件。

标签: vba excel


【解决方案1】:

这是您尝试做的一个工作示例:

Sub TestGetSheetValue()
    MsgBox GetSheetValue("N:\Tax Documents\", "Tax Stuff.xlsx", "Sheet1", "R1C3")
End Sub


Function GetSheetValue(strPath As String, strFile As String, strSheet As String, strCellRef As String)
    GetSheetValue = ExecuteExcel4Macro("'" & strPath & "[" & strFile & "]" & strSheet & "'!" & strCellRef)
End Function

显然根据需要更改您传递给函数的内容,注意地址是 R1C1 格式。

strSheet 是工作表名称,而不是工作表索引。

确保路径上有一个尾随 \

最后,尽量不要使用文件、路径和表格等名称作为变量名。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-06
    • 1970-01-01
    • 2016-12-07
    相关资源
    最近更新 更多