组合两个或多个字符串数组

时间:2017-02-17 15:06:45

标签: excel excel-vba vba

我试图找到从大型文件(800 000行)中连接大约7列的行值的最快方法。

我发现了一种几乎即时的方法,可以在不同的数组中加载每一列。

但是当我使用下面的代码时,处理速度非常慢,例如每100行需要2-3秒。

也许你们可以帮助我一种在没有for的情况下从并行数组连接值的方法。

列的顺序不正确。

For rowI = LBound(arrShInvoice) To UBound(arrShInvoice)
    dKey = arrShInvoice(rowI, 1)
    dItem = ""

    Call displayStatusBarEvents("Procesing " & dFName & vbNewLine & "row: ", rowI, UBound(arrShInvoice), 100, , True)
    For Each colI In arrTargetFields
        If dItem = "" Then
            dItem = dData(colI)(rowI, 1)
        Else
            dItem = dItem & delimiterI & dData(colI)(rowI, 1)
        End If
    Next
    dDescriptive.Add dKey, dItem
Next

我在VBA方面相当先进,所以用你最好的想法来打击我。

1 个答案:

答案 0 :(得分:1)

很难发布您的帖子,而且我们还没有看到完整的代码(很高兴看到它!)。将它添加为答案,因为它不适合一组评论

您必须阅读Optimize string handling in VB6

  1. 连接时,加入longs字符串一次。 dItem & (delimiterI & dData(colI)(rowI, 1))比使用dItem & delimiterI & dData(colI)(rowI, 1)两次
  2. Ditem要好得多
  3. VbNullStringLen(Ditem) = 0If dItem = ""
  4. 更快
  5. 您的IF测试应首先分支到更可能的结果,以避免通过Else。如果 dItem 不可能为空,请更改IF流程
  6. 如果您必须有进度指示器,请使用StatusBar每10000行左右(使用 Mod )而不是调用单独的函数(您正在执行每个< / em> line)
  7. 您的新问题

    如果不使用PowerShell,您必须将数组与For循环组合,即

    Dim Array1()
    Dim Array2()
    Dim lngRow As Long
    
    Array1 = Array("a", "b", "c")
    Array2 = Array(1, 2, 3)
    
    For lngRow = 0 To UBound(Array1)
        Array1(lngRow) = Array1(lngRow) & Array2(lngRow)
    Next