O blog sugerido por tumchaaditya oferece algumas excelentes sugestões que valem a pena ser aplicadas, mas duvido que elas ajudem aqui.
Para mim, a questão principal é que a macro fica mais lenta. Você tem comandos como:
StrA = StrA & NewData
ReDim Preserve MyArray(1 To UBound(MyArray)+1)
Esses comandos tornam o StrA e o MyArray um pouco maiores. Para cada loop, o interpretador precisa encontrar espaço para o objeto maior, copiar os dados do objeto antigo e liberar o objeto antigo para a coleta de lixo. Toda vez que você torna o StrA ou MyArray um pouco maior, esse processo leva mais tempo. Eu não sei porque o problema é pior com o Excel 2003; talvez o Excel 2007 tenha um coletor de lixo melhor.
Se você está acumulando dados de cada linha, algo assim é muito melhor:
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
A sintaxe pode parecer estranha se você não estiver familiarizado com o que a maioria das linguagens chamam de tipos de usuário de chamadas de estruturas e VBA. Mas, uma vez que você esteja confortável com a sintaxe, as estruturas tornam seu código muito mais claro e, frequentemente, muito mais rápido.