我有一张相当大的纸张(大约60K行乘50列)。我正在尝试将几个(2到8)行复制到剪贴板中,然后插入复制的单元格。此操作需要一分多钟才能完成!
我尝试禁用自动计算,从VBA启动此操作,如下所示:
Range("A1").Insert xlShiftDown
无法使用。如果我粘贴(Ctrl-V)而不是插入它就像一个快照。
有关如何解决此问题的任何想法?
答案 0 :(得分:1)
由于您可以足够快地粘贴数据,因此请使用而不是插入,然后对行进行排序:
答案 1 :(得分:0)
我实现了Absinthe的算法,这是代码:
Sub InsertRows()
Dim SourceRange, FillRange As Range
Dim LastCol, LastRow, ActRow, CpdRows As Long
Dim i As Integer
If Application.CutCopyMode <> xlCopy Then Exit Sub
Application.ScreenUpdating = False
Application.EnableEvents = False
With ActiveSheet
LastCol = .UsedRange.Columns.Count
LastRow = .UsedRange.Rows.Count
ActRow = ActiveCell.Row
.Paste Destination:=.Cells(LastRow + 1, 1)
CpdRows = .UsedRange.Rows.Count - LastRow
Application.Calculation = xlCalculationManual
Set SourceRange = .Range(.Cells(ActRow, LastCol + 1), .Cells(ActRow + 1, LastCol + 1))
SourceRange.Cells(1).Value = CpdRows + 1
SourceRange.Cells(2).Value = CpdRows + 2
Set FillRange = .Range(.Cells(ActRow, LastCol + 1), .Cells(LastRow, LastCol + 1))
SourceRange.AutoFill Destination:=FillRange
For i = 1 To CpdRows
.Cells(LastRow + i, LastCol + 1).Value = i
Next i
.Range(.Cells(ActRow, 1), .Cells(LastRow + CpdRows, LastCol + 1)).Sort Key1:=.Cells(ActRow, LastCol + 1), _
Order1:=xlAscending, Header:=xlNo, MatchCase:=False, Orientation:=xlTopToBottom
.Columns(LastCol + 1).Delete
End With
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
它的工作速度肯定比“插入复制的单元格”快,并且它似乎在第一次使用后加速(我的意思是,当我在第二次,第三次等时运行宏时,它比第一次运行时更快)。也有缺点。例如,以这种方式插入行时,命名范围不会自动展开。
此方法最重要的问题:Excel在排序时不会移动单元格的边框。因此,边界结构将被毁坏。我所知道的唯一解决方法是对边框使用条件格式。
总而言之,这是一个很好的解决方法