【发布时间】:2016-11-17 01:19:20
【问题描述】:
我是这个论坛的新手,但最近阅读了大量帖子,因为我目前正在自学 VBA 以供工作使用!
我目前对我创建的一些代码有疑问。该代码的目的是根据双击的单元格值自动过滤多个工作表,然后将这些过滤结果复制到另一个“主报告”工作表。问题是它运行一次非常好,之后如果我尝试再次运行它或工作簿中的任何其他宏,则会弹出一个错误,要求我关闭一些东西以释放内存!
我曾尝试运行一次宏,保存并关闭工作簿(以清除任何可能缓存的内容),重新打开并运行,但同样的错误仍然存在。我还尝试按照以下建议使用 .activate 更改我的 .select 提示:
How to avoid running out of memory when running VBA
但这似乎破坏了我的代码......然后我可能只是实现了错误,因为我有点 VBA 菜鸟 谁能帮我优化我的代码以防止这种情况发生?
我的代码如下:
Private Sub Merge()
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlBottom
End With
Selection.Merge
End Sub
-------------------------------------------------------------------------------------------------------------------------------------------------------
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Cancel = True
Application.ScreenUpdating = False
Application.EnableEvents = False
Sheets("Master Report").Cells.Delete 'clear old master report
Column = Target.Column
Row = Target.Row
'this automatically filters information for a single part and creates a new master report with summary information
PartNumber = Cells(Row, 2).Value 'capture target part number for filtering
PartDesc = Cells(Row, 7).Value 'capture target part description
PartNumberWildCard = "*" & PartNumber & "*" 'add wildcards to allow for additional terms
With Worksheets("NCR's") 'filter NCR sheet
.Select
On Error Resume Next
ActiveSheet.ShowAllData 'remove any previous filters
On Error GoTo 0
.Range("A1").AutoFilter Field:=2, Criteria1:=PartNumberWildCard
End With
Sheets("NCR's").Select
Sheets("NCR's").Range("A3:K3").Select
Sheets("NCR's").Range(Selection, Selection.End(xlDown)).Select 'select NCR filtered summary info
Selection.Copy
Sheets("Master Report").Select
Sheets("Master Report").Range("A1").Formula = PartNumber
Sheets("Master Report").Range("D1").Formula = PartDesc 'Print part no. & description at top of master report
Sheets("Master Report").Range("A4").Select
ActiveSheet.Paste 'paste filtered NCR info into master report
Sheets("Master Report").Range("A3:K3").Select
Call Merge
ActiveCell.FormulaR1C1 = "NCR's"
With Worksheets("CR's") 'filter CR sheet
.Select
On Error Resume Next
ActiveSheet.ShowAllData 'remove any previous filters
On Error GoTo 0
.Range("A1").AutoFilter Field:=3, Criteria1:=PartNumberWildCard
End With
Sheets("CR's").Select
Sheets("CR's").Range("A7:F7").Select
Sheets("CR's").Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Sheets("Master Report").Select
Sheets("Master Report").Range("P4").Select
ActiveSheet.Paste
Sheets("Master Report").Range("RP3:U3").Select
Call Merge
ActiveCell.FormulaR1C1 = "CR's"
With Worksheets("PO's") 'filter PO sheet
.Select
On Error Resume Next
ActiveSheet.ShowAllData 'remove any previous filters
On Error GoTo 0
.Range("A1").AutoFilter Field:=2, Criteria1:=PartNumberWildCard
End With
Sheets("PO's").Select
Sheets("PO's").Range("A3:H3").Select
Sheets("PO's").Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Sheets("Master Report").Select
lastRow = Sheets("Master Report").Range("A" & Rows.Count).End(xlUp).Row
lastRow = lastRow + 3
Sheets("Master Report").Range("A" & lastRow).Select
ActiveSheet.Paste
Sheets("Master Report").Range("A" & lastRow - 1 & ":H" & lastRow - 1).Select
Call Merge
ActiveCell.FormulaR1C1 = "PO's"
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub
另一条可能有帮助的信息是,我尝试删除三个过滤/复制/粘贴例程中的最后一个,这使我可以运行代码大约 3 次,然后再遇到相同的内存错误。此外,调试器总是卡在宏开始时清除主报告的命令
Sheets("Master Report").Cells.Delete 'clear old master report
【问题讨论】:
-
我还会在您的宏末尾添加
Application.CutCopyMode=False以清除剪贴板。 -
Avoid using
.Select,如果您不小心,可能会导致减速和错误行为
标签: excel vba memory optimization