【发布时间】:2023-03-30 17:53:01
【问题描述】:
我必须反转范围的行。我编写的代码在 2 分钟、18 秒、587 毫秒内恢复了 1000 行 x 1000 列的范围。有人可以提供更快的代码吗?
1000 行 x 1000 列的平均时间:2 分钟、18 秒、587 毫秒
(Intel i7-6700 4 GHz,32 GB RAM)(Windows 10 Home x64)(Excel Office 365 MSO(16.0.11328.20144) 32 位)
我不需要关闭计算,单元格没有公式。 GMalc 代码很短而且非常快:8 秒,23 毫秒,但@Rory 建议更快,正如罗恩所说:1 秒,195 毫秒!!!谢谢
Sub InvertRangeRows(ByRef rngRange_IO As Range)
Dim RowI&, RowRange&, RowArray&, RowFirst As Long
Dim RowLast&, ColumnFirst&, ColumnLast As Long
Dim ArrayRange As Variant, ArrayInverted As Variant
Dim RowCurrent As Variant
Application.ScreenUpdating = False
ArrayRange = rngRange_IO
ReDim ArrayInverted(1 To UBound(ArrayRange))
For RowI = UBound(ArrayRange) To LBound(ArrayRange) Step -1
RowCurrent = Application.WorksheetFunction.Index(ArrayRange, RowI, 0)
RowRange = RowRange + 1
ArrayInverted(RowRange) = RowCurrent
Next RowI
With rngRange_IO
RowFirst = .Row
RowLast = RowFirst + UBound(ArrayRange) - 1
ColumnFirst = .Column
ColumnLast = ColumnFirst + UBound(ArrayRange, 2) - 1
End With
With rngRange_IO.Worksheet
For RowI = RowFirst To RowLast
RowArray = RowArray + 1
.Range(.Cells(RowI, ColumnFirst), .Cells(RowI, ColumnLast)) _
= ArrayInverted(RowArray)
Next RowI
End With
Application.ScreenUpdating = False
End Sub
【问题讨论】:
-
你关闭计算了吗?
-
我怀疑使用 2D 数组会更快,在内存中循环处理行和列,然后一键将其写回工作表。
-
我打算和@Rory 一样建议你可以说
a()=range("a1:aa1000")然后在一个新数组aReveresed 中做你需要做的事情,然后range("a1:aa1000")=aReversed新数组的所有维度都可以也可以从范围的列/行或第一个数组中获取。 -
该范围内有任何公式吗?
-
假设数组的内容不包括公式,@Rory 在我的机器上的建议 - 我认为比你的慢(I7-3770K) - 粗略计算大约需要两秒钟。