Мой предполагаемый заголовок для этого поста: Оптимизация кода цикла VB6 (VBA) (извините за проблемы)
Итак, я использовал этот код в своей программе VB6 (VBA):
Public Sub Form_Load()
Dim Output As String
For i = 1 To 990
For i2 = 1 To 990
Output = Output & i * i2
Next
Next
End Sub
И у меня проблемы с циклами for, которые очень медленные, и в крайних случаях для их выполнения требуется несколько часов. Есть какие-нибудь советы по оптимизации моего кода?
Почему вы не можете использовать желаемое название в качестве фактического названия?





С трудом догадываюсь, для чего это, но промежуточный шаг с массивами ускоряет
Public Sub Form_Load2()
Const n As Long = 500, n2 As Long = 200
Dim Output As String
Dim i As Long, i2 As Long
ReDim vals(1 To n2) As String
For i = 1 To n
For i2 = 1 To n2
vals(i2) = i * i2
Next
Output = Output & Join(vals, "")
Next
Debug.Print Output
End Sub
С i и i2, ограниченными соответственно 500 и 200, это происходит почти мгновенно.
Вы можете попробовать большее число, но я советую вам делать небольшие шаги ..
Это будет немного быстрее, чем решение, предоставленное @DisplayName
Public Sub Form_Load()
Const I_MAX As Long = 990
Const I2_MAX As Long = 990
Dim Output As String
Dim i As Long
Dim i2 As Long
Dim lCount As Long
Dim arr As Variant
lCount = 0
ReDim arr(I_MAX * I2_MAX)
For i = 1 To I_MAX
For i2 = 1 To I2_MAX
arr(lCount) = i * i2
lCount = lCount + 1
Next
Next
Output = Join(arr, vbNullString)
Debug.Print Output
End Sub
Ваша проблема в том, что вы перетасовываете миллионы мегабайт памяти. На полпути ваш код копирует 5,7 МБ из одной области памяти в другую каждый раз через внутренний цикл. Итого 5700 гигабайт на всю программу.
Правила объединяют небольшие строки вместе, а затем объединяют меньшие строки в конце конкатенации. Чтобы меньшие строки не превышали, скажем, 4000 байтов, присоедините эти файлы в конце.
В современных языках есть объект построителя строк, в VBA тоже есть объект, который просто так не называется.
В VBA есть функция Mid и инструкция Mid. Они делают противоположные вещи. Итак, вы сначала создаете свое последнее жало. Затем с помощью Midутверждение вставьте ваши подстроки в первую строку. Это позволяет избежать перетасовки всех сотен мегабайт. Используйте Rtrim, чтобы обрезать лишние пробелы в конце. Если вы уменьшите размер вывода до 6 миллионов пространств, тогда он будет соответствовать вашему примеру и будет использовать около 12 МБ по сравнению с тысячами гигабайт.
Вот небольшой пример.
Private Sub Form_Load()
OutPut = Space(1500)
For x = 1 To 500
Offset = Offset + Len(CStr(x))
Mid(OutPut, Offset) = CStr(x)
Next
MsgBox OutPut
End Sub
См. Указатели, необходимые для ускорения макроса вложенного цикла в VBA
Это всегда будет приводить к одному и тому же ответу, так почему вы рассчитываете его каждый раз? Просто проработайте это один раз и жестко закодируйте ответ (я думаю, результат будет примерно 8 * 10 ^ 8) Упс только что заметил, что вы используете &, так что это будет очень длинная строка, а не число. Таким образом, он выполняет долгое преобразование в строку каждый раз в цикле - неудивительно, что это занимает некоторое время - еще больше причин для жесткого кодирования строки