Excel VBA Append для TextBox медленный

У меня есть пользовательская форма, которая генерирует большой объем текста и помещает его в текстовое поле.

У меня есть следующая функция, чтобы добавить следующую строку текста в текстовое поле:

Sub AddLineToSQL(sLine As String) frmSQL.txtSQL.Value = frmSQL.txtSQL.Value & sLine & vbCr End Sub 

При добавлении нескольких сотен строк текста требуется время для обработки (до 20 секунд).

Проблема заключается в том, что есть возможность добавить более тысячи строк текста.

У нас есть старая форма, которая делает в основном одно и то же, но я пытаюсь создать более чистый пользовательский интерфейс. старая форма написала текст на листе, и, похоже, он работает намного быстрее, чем добавление в текстовое поле.

Есть ли более эффективный способ добавления текста в текстовое поле, чем то, что у меня выше?

должен ли я просто делать то, что делал старая форма, и писать строки на листе?

Благодаря,

отметка

Не добавляйте строки в строку в TextBox. Вместо этого конкатенируйте String со всеми строками, а затем установите String как значение TextBox.

 Sub test() Dim sTxtSQL As String For i = 1 To 5000 sTxtSQL = sTxtSQL & "This is row " & i & vbCrLf Next frmSQL.txtSQL.Value = sTxtSQL frmSQL.Show End Sub 

если ваше количество текста будет большим, тогда вы можете использовать этот класс:

 ' Class: StringBuilder ' from http://stackoverflow.com/questions/1070863/hidden-features-of-vba Option Explicit Private Const initialLength As Long = 32 Private totalLength As Long ' Length of the buffer Private curLength As Long ' Length of the string value within the buffer Private buffer As String ' The buffer Private Sub Class_Initialize() ' We set the buffer up to it's initial size and the string value "" totalLength = initialLength buffer = Space(totalLength) curLength = 0 End Sub Public Sub Append(Text As String) Dim incLen As Long ' The length that the value will be increased by Dim newLen As Long ' The length of the value after being appended incLen = Len(Text) newLen = curLength + incLen ' Will the new value fit in the remaining free space within the current buffer If newLen <= totalLength Then ' Buffer has room so just insert the new value Mid(buffer, curLength + 1, incLen) = Text Else ' Buffer does not have enough room so ' first calculate the new buffer size by doubling until its big enough ' then build the new buffer While totalLength < newLen totalLength = totalLength + totalLength Wend buffer = Left(buffer, curLength) & Text & Space(totalLength - newLen) End If curLength = newLen End Sub Public Property Get Length() As Integer Length = curLength End Property Public Property Get Text() As String Text = Left(buffer, curLength) End Property Public Sub Clear() totalLength = initialLength buffer = Space(totalLength) curLength = 0 End Sub 

просто поместите его в любой модуль класса и назовите его после «StringBuilder»,

то вы можете протестировать его так же, как в ответе Акселя:

 Sub test() Dim i As Long Dim sb As StringBuilder Dim sTxtSQL As String Dim timeCount As Long timeCount = Timer Set sb = New StringBuilder For i = 1 To 50000 sb.Append "This is row " & CStr(i) & vbCrLf Next i sTxtSQL = sb.Text MsgBox Timer - timeCount frmSQL.txtSQL.Value = sTxtSQL frmSQL.Show End Sub 

Мой тест показал значительное сокращение времени для «i» циклов более 50 тыс.

  • Дублируйте то, что находится в текстовом поле в других текстовых блоках на других листах
  • XlsxWriter Python вставляет текстовое поле в диаграмму
  • Имя свойства динамически созданных текстовых полей
  • Управление текстовым полем в Excel - как ссылаться в Perl
  • Добавление текста в текстовое поле
  • Возьмите текстовое поле и перейдите в определенную ячейку.
  • Добавление переменного количества символов в строку, основанная на текущей длине строки
  • Вставить из excel в текстовое поле
  • Определите номер недели, номер месяца, год с момента управления DatePicker в пользовательской форме VBA
  • Текст текстового поля в Excel VBA
  • Передайте значение текстового поля UserForm в ячейку
  • Interesting Posts

    Excel Macro для копирования из последовательных строк в постоянное местоположение, а затем из постоянного места обратно в соответствующую строку

    Как мне форматировать эти данные?

    INDEX, MATCH два критерия, причем один из этих критериев условный … где идет IF?

    Как экспортировать datagridview в excel с помощью vb.net?

    Формулы XIRR Для каждой инвестиции

    Доступ к открытой книге Excel в C #

    Excel «true-false» для отмеченных ящиков

    Запрос пользователя перед продолжением цикла

    Удалить содержимое ячейки после Saveas

    VBA, чтобы найти название диаграммы и сравнить с строкой

    Excel автоматически сортирует текст в соответствии с формой

    Чтение данных Excel с C #

    VBA с excel – «Если ячейка содержит« thisString », добавьте« этот текст »в конец вызова в той же строке в столбце F»

    Excel-VBA: пропустить подпрограмму, если ячейка пуста

    График диаграммы Excel 2003 XYZ, такой как линейная диаграмма XY

    Давайте будем гением компьютера.