Склеивание строк стандартными методами происходит довольно медленно, особенно когда результирующая строка очень большая. Для примера вставьте на форму MSFlexGrid, заполните ячейки произвольными значениями и вставьте такой код:
Dim Text As String Dim i As Long Dim j As Long With MSFlexGrid1 For i = 1 To .Rows - 1 For j = 1 To .Cols - 1 Text = Text + .TextMatrix(i, j) + Chr$(9) Next Text = Left$(Text, Len(Text) - 1) Text = Text + Chr$(13) + Chr$(10) Next Text = Left$(Text, Len(Text) - 2) End WithСклеивание ячеек происходит медленно так как переменная Text постоянно изменяет свой размер при добавлении нового значения. Гораздо быстрее будет воспользоваться API функцией CopyMemory:
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _ (pDst As Any, pSrc As Any, ByVal ByteLen As Long) Private Sub Command1_Click() Dim Text As String Dim i As Long Dim j As Long ' Переменная pos обозначает номер позиции в текстовой ' строке, с которой будет добавляться новый символ Dim pos As Long Dim src As String ' Заполняем строку пробелами Text = Space$(10000) With MSFlexGrid1 For i = 1 To .Rows - 1 For j = 1 To .Cols - 1 ' Присваиваем src содержимое ячейки плюс символ табуляции src = .TextMatrix(i, j) + Chr$(9) ' Если начальная позиция плюс длина добавляемой строки ' превышает размер строки Text, то прибавляем к ней следующие ' 10000 пробелов If pos + LenB(src) > LenB(Text) Then Text = Text + Space$(10000) ' Копируем содержимое добавляемой строки в переменную Text ' с позиции pos CopyMemory ByVal StrPtr(Text) + pos, ByVal StrPtr(src), LenB(src) ' Устанавливаем новую позицию для текста pos = pos + LenB(src) Next ' После прохода всех колонок убираем из конца строки символ табуляции ' просто сдвинув позицию на 2 байта (каждый символ занимает 2 байта) pos = pos - 2 ' Добавляем символы перевода строки src = Chr$(13) + Chr$(10) If pos + LenB(src) > LenB(Text) Then Text = Text + Space$(10000) CopyMemory ByVal StrPtr(Text) + pos, ByVal StrPtr(src), LenB(src) pos = pos + LenB(src) Next ' Убираем из конца строки символы перевода строки Text = Left$(Text, pos \ 2 - 2) End With End SubЭтот способ более громоздкий, но он стоит того, так как быстрее примерно в 20 раз.