[英]Excel not responding after running macro
我使用以下代碼將一列從一張紙復制到另一張紙,然后用Null值替換空白單元格:
'Copying If Employee
sourceSheet.Activate
Range(Cells(2, 7), Cells(Rows.Count, 7).End(xlUp)).Select
Selection.Copy
destSheet.Activate
Range("E2", Cells(Rows.Count, 7)).PasteSpecial
For Each cell In Range("E2", Cells(Rows.Count, 5))
If Len(cell.Value) = 0 Then
cell.Value = "No"
End If
當我用Range("E2", Cells(500,5))
替換for語句時Range("E2", Cells(500,5))
它工作正常。
可能是什么問題? 我無法弄清楚。 誰能幫我這個?
Excel 2007具有1,048,576行。
您的For循環必須遍歷一百萬個單元,並且每次必須將一個單元(具有其所有屬性)加載到內存中。 單元對象的這種持續加載和卸載非常消耗資源。
每次將值No
分配給單元格時,Excel都會重新計算工作表,刷新屏幕,並可能觸發工作表/工作簿/單元格事件。 在評估下一個單元到下一個單元之前,需要進行所有這些操作。 除非您有大量的數據,否則在此示例中這將發生數百次。
500個單元格要小得多,可以毫無問題地處理。
編輯:
獲取最后一行。
如果要獲取包含數據的最后一個可見行,請使用:
With Workbooks(myWorkbook).Worksheets(myWorksheet)
LastRow = .Cells(.Rows.Count, "E").End(xlUp).Row
End With
如果要獲取最后一行數據,而不管其可見還是隱藏,請使用:
With Workbooks(myWorkbook).Worksheets(myWorksheet)
LastRow =.Range("E2").EntireColumn.Find("*", .Cells(1, .Range("E2").Column), , , xlByRows, xlPrevious).Row
End With
詳細信息Rondebruin有一個不錯的網站,提供有關獲取激光行/列的更多信息。
嘗試
For Each cell In Range("E2", Cells(destSheet.UsedRange.Rows.Count, 5))
If Len(cell.Value) = 0 Then
cell.Value = "No"
End If
或更優雅(可能更快),
Dim calcStatus As XlCalculation
calcStatus = Application.Calculation
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
For Each cell In Range("E2:E" & destSheet.UsedRange.Rows.Count)
If Len(cell.Value) = 0 Then
cell.Value = "No"
End If
Application.Calculation = calcStatus
Application.ScreenUpdating = True
正如Cabierberach正確指出的那樣,您當前的例行程序遍歷了100萬行。 除了他和JustinJDavies的解決方案之外,請考慮以下黑客:
無需將值0
設置為No
,您只需更改單元格在每次值為0
時顯示No
的格式即可。 通過將以下自定義格式應用於單元格: 0,-0,"No",@
可以在沒有宏的情況下完成此操作。 您可能需要用默認格式替換0
有關自定義數字格式的詳細說明,請參見此鏈接 。
如果要在VBA中執行此操作,此行就足夠了:
Range("E2:E" & Cells(Rows.Count, 1).End(xlUp).Row).CustomFormat = "0,0,""No"",@"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.