Vba 从字符串数组创建字符串。最快的方法?

Vba 从字符串数组创建字符串。最快的方法?,vba,Vba,我有一个字符串数组(A到E),我想把它合并成一个字符串(“abcde”)。我应该循环数组还是使用Join函数 Dim MyArray(5) as String Dim MyString as String MyArray(1) = "A" MyArray(2) = "B" MyArray(3) = "C" MyArray(4) = "D" MyArray(5) = "E" 哪个更快更明智 这个 还是这个 MyString = Join(MyArray, " ") 对于100k阵列

我有一个字符串数组(A到E),我想把它合并成一个字符串(“abcde”)。我应该循环数组还是使用Join函数

Dim MyArray(5) as String
Dim MyString as String

MyArray(1) = "A"
MyArray(2) = "B" 
MyArray(3) = "C" 
MyArray(4) = "D" 
MyArray(5) = "E" 
哪个更快更明智

这个

还是这个

MyString = Join(MyArray, " ")
对于100k阵列

Sub test()

    Dim aArr(1 To 100000) As String
    Dim i As Long
    Dim sString As String
    Dim snTimer As Single

    FillArray aArr

    snTimer = Timer

    For i = 1 To 100000
        sString = sString & Space(1) & aArr(i)
    Next i

    Debug.Print Timer - snTimer
    snTimer = Timer

    sString = Join(aArr, Space(1))

    Debug.Print Timer - snTimer

End Sub
加入显然是赢家

 2.050781 
 0 

原因是每次与
&
连接时,都必须重新分配内存以适应新数组(不管怎样,所有字符串都是新数组)。使用Join,您只需将一个数组(源数组)复制到另一个数组(字符串),VBA已经知道大小。

如果要有效组合多个字符串,可以定义一个类

运行下面的代码来构建一个多达一百万的数字字符串只需要几分之一秒(0.3秒)。构建一个数组并使用
Join
需要不远的时间(0.25秒),调用
Join
函数只需要大约10%的时间

如果字符串已经在一个数组中,那么使用
Join
是有意义的,但是对于少量的字符串,差异不太可能明显

Sub JoinStringTest()

Dim i As Long, t As Double
Dim sb As New StringBuilder
Dim sbRet As String
Dim joinRet As String

t = Timer
For i = 1 To 1000000
  sb.Append CStr(i)
Next
sbRet = sb.Text
Debug.Print "SB", Timer - t

t = Timer
Dim a(1000000) As String
For i = 1 To 1000000
  a(i) = CStr(i)
Next i
joinRet = Join(a, "")
Debug.Print "Join", Timer - t

Debug.Print sbRet = joinRet

End Sub

我假设join将更快,因为它是在本机代码中实现的,而您正在使用for循环在每次迭代中增加字符串,并调用两次串联运算符,可能在前后获得系统时间(使用更大的数组)我可以提供一些关于哪一个更好的线索。我建议使用对您个人更具可读性的解决方案。对我来说,这就是连接,因为它在概念上更简单,并且避免了一个接一个的错误和其他可能的细微错误。为什么您认为这段特定代码的性能对您的应用程序比应用程序所做的任何其他事情都更重要?在构建字符串时,不要将长字符串与两个短字符串连接起来(强制长字符串复制两次)。因此,不要使用
MyString=MyString&=“MyArray(i)
而使用
MyString=MyString&(”“&MyArray(i))
Sub JoinStringTest()

Dim i As Long, t As Double
Dim sb As New StringBuilder
Dim sbRet As String
Dim joinRet As String

t = Timer
For i = 1 To 1000000
  sb.Append CStr(i)
Next
sbRet = sb.Text
Debug.Print "SB", Timer - t

t = Timer
Dim a(1000000) As String
For i = 1 To 1000000
  a(i) = CStr(i)
Next i
joinRet = Join(a, "")
Debug.Print "Join", Timer - t

Debug.Print sbRet = joinRet

End Sub