【问题标题】:Optimize Long for-loop with a Select Case in it使用 Select Case 优化 Long for 循环
【发布时间】:2017-07-10 10:53:11
【问题描述】:

我必须遍历大循环并使用 Case Select 结构。我首先遍历请求的参数(通常大约 10 个),然后对于每个匹配项,我遍历文件列表(大约 10k)。该代码具有以下结构,但包含更多案例。

For i = 1 To dNumColumns Step 1 
Debug.Print(CStr(Now() & " Column: " & UCase(vInHeaders(1,i))))

    Select Case UCase(Cols(1,i))
        Case "NAME":
            row = 1
            For Each t In vT
                vTestsValues(row, i) = t.Name : row += 1
            Next
        Case "DATE":
            row = 1
            For Each t In vT
                vTestsValues(row, i) = t.Date : row += 1
            Next
        Case "PATH":
            row = 1
            For Each t In vT
                vTestsValues(row, i) = t.Path : row += 1
            Next
        Case "RIGHTS":
            row = 1
            For Each t In vT
                vTestsValues(row, i) = t.Rights : row += 1
            Next
        Case "AUTHOR":
            row = 1
            For Each t In vT
                vTestsValues(row, i) = t.Author : row += 1
            Next
        Case "TYPE":
            row = 1
            For Each t In vT
                vTestsValues(row, i) = t.Type : row += 1
            Next
        Case "VERSION":
            row = 1
            For Each t In vT
                vTestsValues(row, i) = t.Version : row += 1
            Next
        Case Else
            row = 1
            For Each t In vT
                vTestsValues(row, i) = "ERR"
                row += 1
            Next
        End Select

dNumColumns is a Variant Array, containing Strings;
vT is a Variant Array containing a Document Object

将这些结果添加到 vTestsValues 的最有效方法是什么?已经尝试使用“For Each t In vT”(通常有 10k 个项目)并在其中嵌套“For i = 1 To dNumColumns”循环以选择案例并获得稍慢的性能。任何提示表示赞赏。

【问题讨论】:

  • 数据排序了吗?因为如果是这样,您可以进行二分搜索。
  • 不知道每个变量的声明和内容很难说。对于 10000 行和 10 列,它应该在不到 100 毫秒内执行。确保所有值都加载到数组中,并使用For To 而不是For Each in 循环遍历行。
  • Debug.Print 会减慢速度...

标签: vba loops for-loop select optimization


【解决方案1】:
    For Each t In vT
        vTestsValues(row, i) = CallByName(t, Cols(1,i), vbGet)  : row += 1
    Next

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    • 2011-08-30
    • 1970-01-01
    • 2015-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多