我没有太多编写宏的经验,因此需要此社区的帮助以解决遇到的以下问题:如何提高VBA宏代码的速度?
我的宏将一个工作表中垂直范围内输入的值复制一份,然后粘贴这些值在另一个工作表中水平(转置)。它理论上会将第一张工作表中的值粘贴到第二张工作表中没有内容的第一行。由于前五行具有内容,所以它将这些值粘贴到第六行。 我在运行宏时遇到的问题是我觉得它太慢了,因此我希望它运行得更快。
我有相同的宏做同样的事情,但它将值粘贴到另一个工作表到第一行,它运行完美。
因此,我最好的猜测是第二个宏运行缓慢,因为它必须开始粘贴到第六行,并且前5行中可能有一些内容需要很长时间才能使宏经过(有很多单元格引用其他工作簿)来确定粘贴的下一行应该在哪里。这是我最好的猜测,因为我几乎不知道宏的任何信息,所以我不能确定问题是什么。
我在此向您提供我的宏的代码,并真诚地希望有人能告诉我什么使我的宏变慢,并为我提供解决方案,以便如何使它运行得更快。我在想,一个解决方案可能可能是宏不应该考虑前五行数据,并立即在第6行开始粘贴第一个条目。然后在第7行,等等。这可能是一个解决方案,但我不知道如何编写代码的方式,它会这样做。
感谢您抽出宝贵时间,帮助我找到一个解决办法,这里是代码:
Sub Macro1()
Application.ScreenUpdating = False
Dim historyWks As Worksheet
Dim inputWks As Worksheet
Dim nextRow As Long
Dim oCol As Long
Dim myCopy As Range
Dim myTest As Range
Dim lRsp As Long
Set inputWks = wksPartsDataEntry
Set historyWks = Sheet11
'cells to copy from Input sheet - some contain formulas
Set myCopy = inputWks.Range("OrderEntry2")
With historyWks
nextRow = .Cells(.Rows.Count, "A").End(xlUp).Offset(1, 0).Row
End With
With inputWks
Set myTest = myCopy.Offset(0, 2)
If Application.Count(myTest) > 0 Then
MsgBox "Please fill in all the cells!"
Exit Sub
End If
End With
With historyWks
With .Cells(nextRow, "A")
.Value = Now
.NumberFormat = "mm/dd/yyyy hh:mm:ss"
End With
.Cells(nextRow, "B").Value = Application.UserName
oCol = 3
myCopy.Copy
.Cells(nextRow, 3).PasteSpecial Paste:=xlPasteValues, Transpose:=True
Application.CutCopyMode = False
End With
'clear input cells that contain constants
With inputWks
On Error Resume Next
With myCopy.Cells.SpecialCells(xlCellTypeConstants)
.ClearContents
Application.GoTo .Cells(1) ', Scroll:=True
End With
On Error GoTo 0
End With
Application.ScreenUpdating = True
End Sub
宏观看起来像它应该去足够快。我会放弃'Application.GoTo .Cells(1)'并添加'application.calculation = xlCalculationManual' /'application.Calculation = xlCalculationAutomatic' – nutsch
是的,它运行在一秒钟之内。需要多长时间? – Stepan1010
我第二。我没有看到这些代码显而易见,这会让我从编程的角度进行编辑。我认为问题是** 1)**正在复制的范围的大小和** 2)**复制的工作簿也有许多单元链接到其他工作簿。此外,工作簿本身的大小可能会导致性能下降。当然,建议按照@nutsch打开/关闭calc,并检查工作簿的大小。哦,是的,我可以证实,找到第6行在这里并不是一个问题,因为它实际上编码很好,可以在jiff中做到这一点! –