簡體   English   中英

Excel運行宏后無響應

[英]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行。

  1. 您的For循環必須遍歷一百萬個單元,並且每次必須將一個單元(具有其所有屬性)加載到內存中。 單元對象的這種持續加載和卸載非常消耗資源。

  2. 每次將值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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM