The blog suggested by tumchaaditya offers some excellent suggestions which are worth implementing but I doubt they will help here.
For me the key issue is that the macro slows down. Do you have commands like:
StrA = StrA & NewData
ReDim Preserve MyArray(1 To UBound(MyArray)+1)
These commands make StrA and MyArray slightly bigger. For each loop, the interpreter has to find space for the larger object, copy the data from the old object and then release the old object for garbage collection. Every time you make StrA or MyArray a little bigger, this process takes longer. I do not know why the problem is worse with Excel 2003; perhaps Excel 2007 has a better garbage collector.
If you are accumulating data from each row, something like this is much better:
Type SRowDtl ' The definition of a User Type must preceed any routines
Info1 As String
Info2 As Long
Info3() As Double
Dim RowDtl() as SRowDtl
Dim InxRowDtlCrntMax as Long
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
The syntax can look strange if you not familiar with what most languages call Structures and VBA calls User Types. But, once you are comfortable with the syntax, structures make your code much clearer and, often, much faster.