Excel运行宏后没有响应

Pra*_*mod 0 excel vba excel-2007 excel-vba

我使用下面的代码将列从一个工作表复制到另一个工作表,然后用空值替换空白单元格:

'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
Run Code Online (Sandbox Code Playgroud)

当我用Range("E2", Cells(500,5))它替换for语句工作正常.

可能是什么问题?我无法弄明白.谁能帮我这个?

CaB*_*ach 8

Excel 2007有1,048,576行.

  1. 你的每个循环必须通过一百万个单元格,并且每次必须将一个单元格(包含其所有属性)加载到内存中.这种不断加载和卸载单元对象非常耗费资源.

  2. 每次将值分配给No单元格时,Excel都会重新计算工作表,刷新屏幕并可能触发工作表/工作簿/单元格事件.所有这一切都在评估下一个细胞到下一个细胞之前.除非您拥有大量数据,否则在此示例中将发生数十万次.

500个单元是一个小得多的数字,可以毫无问题地处理.

编辑:

得到最后一排.

如果要获取包含数据的最后一个可见行,请使用:

With Workbooks(myWorkbook).Worksheets(myWorksheet)
   LastRow = .Cells(.Rows.Count, "E").End(xlUp).Row
End With
Run Code Online (Sandbox Code Playgroud)

如果要获取包含数据的最后一行,无论它是可见还是隐藏,请使用:

With Workbooks(myWorkbook).Worksheets(myWorksheet)
   LastRow =.Range("E2").EntireColumn.Find("*", .Cells(1, .Range("E2").Column), , , xlByRows, xlPrevious).Row
End With
Run Code Online (Sandbox Code Playgroud)

欲了解更多信息,Rondebruin有一个很好的网站,有关于拉斯行/列的更多信息.