我沒有太多編寫宏的經驗,因此需要此社區的幫助以解決遇到的以下問題:如何提高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中做到這一點! –