【发布时间】:2020-07-30 20:20:54
【问题描述】:
我想遍历工作簿中的表格并重命名表格中的某些列标题,以启用高级筛选器来复制数据。目前,我使用On Error Resume Next 来避免在表中找不到该列时出现错误消息,然后转到下一个表。
虽然这个方法工作得很好,但是当我试图调整表格的范围时,它在代码的后面产生了问题。调整大小不起作用。在@HTH 的帮助下,很明显On Error Resume Next 是一些代码更改后的问题。
有没有办法修复On Error Resume Next,或者我应该使用不同的方法循环遍历表格并重命名标题,跳过没有这些特定标题的表格?
当前相关代码:
'Loop through and apply a change to all Tables in the Excel Workbook
Dim tbl As ListObject
Dim sht As Worksheet
'Loop through each sheet and table in the workbook
For Each sht In wb.Worksheets
For Each tbl In sht.ListObjects
On Error Resume Next
'rename headings
tbl.ListColumns("Ranging").Name = "MS"
tbl.ListColumns("Stock on Hand - Store").Name = "SOH"
Next tbl
Next sht
'Create Filter Criteria ranges
With MainWB.Worksheets.Add
.Name = "FltrCrit"
Dim FltrCrit As Worksheet
Set FltrCrit = MainWB.Worksheets("FltrCrit")
End With
With FltrCrit
Dim DerangedCrit As Range
Dim DormantCrit As Range
Dim OverstockCrit As Range
Dim OutdatedCrit As Range
Dim NegCrit As Range
Dim myLastColumn As Long
'Create Deranged Filter Criteria Range
.Cells(1, "A") = "Deranged"
.Cells(2, "A") = "MS"
.Cells(3, "A") = "<>4"
.Cells(2, "B") = "SOH"
.Cells(3, "B") = "=0"
'get last column, set range name
With .Cells
'find last column of data cell range
myLastColumn = .Find(What:="*", After:=.Cells(2), LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext).Column
'specify cell range
Set DerangedCrit = .Range(.Cells(2, "A:A"), .Cells(3, myLastColumn))
End With
End With
'Copy Filtered data to specified tables
Dim tblFiltered As ListObject
Dim copyToRng As Range, SDCRange As Range
'DERANGED
'Store Filtered table in variable
Set tblFiltered = wb.Worksheets("Deranged with SOH").ListObjects("Table_Deranged_with_SOH")
'Remove Filtered table Filters
tblFiltered.AutoFilter.ShowAllData
'Set Copy to range on Filtered sheet table
Set copyToRng = tblFiltered.HeaderRowRange
Set SDCRange = MainWB.Worksheets(2).ListObjects("Table_SDCdata").Range
'Use Advanced Filter
SDCRange.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=DerangedCrit, CopyToRange:=copyToRng, Unique:=False
'Resize filtered table to include new data
With wb.Worksheets("Deranged with SOH").Cells
'find last row of source data cell range
myLastRow = .Find(What:="*", LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
End With
With tblFiltered
.Resize .HeaderRowRange.Resize(myLastRow - .HeaderRowRange.Rows(1).Row + 1)
End With
'Clear filter data on SDC
MainWB.Worksheets(2).ListObjects("Table_SDCdata").AutoFilter.ShowAllData
【问题讨论】:
-
尝试将 OERN 放置在
For Each sht In wb.Worksheets之前和On Error GoTo 0之后的Next sht之后。这样,您将 1) 避免在每次循环迭代中调用相同的语句 2) 完成后恢复默认错误条件 -
你可能会发现这篇文章很有用rubberduckvba.wordpress.com/2019/05
-
那么让我们深入研究一下“相关变量值的断点和立即窗口查询”方法
-
@HTH 抱歉,这是我的错误,断点设置为在调整大小之前停止。正如你所建议的,它工作得很好。再次感谢您的快速帮助!
-
@SimoneFick,不客气。从我可以看到你的编码水平正在迅速提高。继续这样!
标签: excel vba resume onerror excel-tables