了解最新技术文章
导致 VBA 宏出现性能问题的一个常见问题是使用 .Select
函数。每次在 Excel 中选择单元格时,都会将此选择对象更改事件通知每个单一的 Excel 加载项(包括 think-cell),这会大幅降低宏的速度。尤其是使用宏记录器创建的宏,更容易出现此类问题。
Microsoft 也建议在 VBA 代码中避免使用 .Select 语句,以提高性能:
Office 博客:“在 Excel 中扫描大范围的最快方式是什么?”
MSDN:提高在 Excel 2007 中的性能:“直接引用诸如范围对象等 Excel 对象,而不对其进行选择或激活”(摘自“更快的 VBA 宏”一节)。
.Select
语句接下来看看以下的简单宏 AutoFillTable
:
Sub AutoFillTable() Dim iRange As Excel.Range Set iRange = Application.InputBox(prompt:="Enter range", Type:=8) Dim nCount As Integer nCount = iRange.Cells.Count For i = 1 To nCount Selection.Copy If iRange.Cells.Item(i).Value = "" Then iRange.Cells.Item(i).Range("A1").Select ActiveSheet.Paste Else iRange.Cells.Item(i).Range("A1").Select End If Next End Sub
此函数将打开输入框,该框会请求用户指定单元格范围。此函数会移动范围内的所有单元格。若发现非空的单元格,它会将单元格内容复制到剪贴板。该函数会将剪贴板内容粘贴到随后的每个空单元格。
AutoFillTable
使用剪贴板来复制单元格内容。因此,该函数需要选择所操作的每个单元格,以便 Excel 知道从哪个单元格进行复制以及应粘贴到哪个单元格。建议的解决方案显示在以下 AutoFillTable2
函数中:
Sub AutoFillTable2() Dim iRange As Excel.Range Set iRange = Application.InputBox(prompt:="Enter range", Type:=8) Dim iCellMaster As Excel.Range For Each iCell In iRange.Cells If iCell.Value = "" Then If Not iCellMaster Is Nothing Then iCellMaster.Copy (iCell) End If Else Set iCellMaster = iCell End If Next iCell End Sub
AutoFillTable2
与以上函数在两个重要方面有所不同:
最重要的是,AutoFillTable2 不再需要选择单元格。相反,若发现某单元格非空,则会将该单元格存储在变量 iCellMaster
中。此后,若发现空单元格,则会将 iCellMaster
的所有内容复制到 iCell
中。
它使用 Visual Basic 语言特征 For Each … Next
来访问范围中的每个单元格。这已经改善了易读性。
24小时免费咨询
请输入您的联系电话,座机请加区号