блог, предложенный tumchaaditya, предлагает отличные предложения, которые стоит реализовать, но я сомневаюсь, что они помогут здесь.
для меня ключевой вопрос в том, что макрос замедляется. У вас есть такие команды, как:
StrA = StrA & NewData
ReDim Preserve MyArray(1 To UBound(MyArray)+1)
эти команды делают StrA и MyArray немного больше. Для каждого цикла интерпретатор должен найти место для большего объекта, скопировать данные из старого объекта, а затем освободить старый объект для сборки мусора. Каждый раз, когда вы сделайте StrA или MyArray немного больше, этот процесс занимает больше времени. Я не знаю, почему проблема с Excel 2003; возможно, в Excel 2007 имеет лучший сборщик мусора.
Если вы накапливаете данные из каждой строки, что-то вроде этого намного лучше:
Option Explicit
Type SRowDtl ' The definition of a User Type must preceed any routines
Info1 As String
Info2 As Long
Info3() As Double
End Type
Sub ProcessRows()
Dim RowDtl() as SRowDtl
Dim InxRowDtlCrntMax as Long
ReDim RowDtl(NumberOfRows)
InxRowDtlCrntMax = -1
For Each Row ....
' Store data from new row
InxRowDtlCrntMax = InxRowDtlCrntMax+1
RowDtl(InxRowDtlCrntMax).Info1 = xxx
RowDtl(InxRowDtlCrntMax).Info2 = yyy
RowDtl(InxRowDtlCrntMax).Info3(5) = zzz
Next
синтаксис может выглядеть странно, если вы не знакомы с тем, что большинство языков называют структурами, а VBA вызывает пользовательские типы. Но, как только вы освоитесь с синтаксисом, структуры сделают ваш код намного яснее и, зачастую, гораздо быстрее.