Как отмечали другие, каждая конкатенация строк в VB будет выделять новую строку, а затем копировать данные, а затем отменять выделение оригинала, как только сможет. В цикле это может вызвать проблемы.
Чтобы обойти это, вы можете создать простой класс StringBuilder, такой как этот:
Option Explicit
Private data As String
Private allocLen As Long
Private currentPos As Long
Public Function Text() As String
Text = Left(data, currentPos)
End Function
Public Function Length() As Long
Length = currentPos
End Function
Public Sub Add(s As String)
Dim newLen As Long
newLen = Len(s)
If ((currentPos + newLen) > allocLen) Then
data = data & Space((currentPos + newLen))
allocLen = Len(data)
End If
Mid(data, currentPos + 1, newLen) = s
currentPos = currentPos + newLen
End Sub
Private Sub Class_Initialize()
data = Space(10240)
allocLen = Len(data)
currentPos = 1
End Sub
Этот класс минимизирует количество выделенных строк, заставляя строку строиться с пробелами в ней, а затем перезаписывая пробелы по мере необходимости. Он перераспределяет, чтобы примерно удвоить свой размер, когда обнаруживает, что у него недостаточно места для предварительной инициализации. Метод Text возвращает часть строки, которая фактически используется.