下面的代码是我用来比较工作表上两个标签之间的条目。表对象OpenComplaints上有一个辅助列,标记为CCMS Notification。它在表对象OpenQns上搜索匹配项。如果没有匹配则返回#N / A.
此宏的目的是在表OpenComplaints上为#N / A自动过滤列CCMS通知,然后复制DataBodyRange并将这些结果粘贴到第三个选项卡上。然后,它会删除复制过的OpenComplaints中的条目。
这一切都很棒。但是如果表是空的,它会崩溃。如果表为空,我希望这跳过宏。我花了几个小时从谷歌和stackoverflow尝试了很多例子,我似乎无法得到任何例子,所以我很抱歉,如果有人在其他地方被问过,但我似乎无法让其他人的代码工作。目前,如果表为空,则选择整个表(即使在自动过滤时),然后删除条目。
理想情况下,我想尽可能多地使用结构化引用,因为此工作表中人们添加或删除列的风险很高。
这是我的代码
Sub DeleteClosedQns()
'
' DeleteClosedQns Macro
If Range("D9").Value = "" Then
Dim response As VbMsgBoxResult
response = MsgBox("Previous step is not marked as complete. Proceed?", vbYesNo)
If response = vbNo Then
Exit Sub
End If
End If
'Checks if the previous step was completed, as marked by a X.
Sheets("BP -Tracker - Open Complaints").Select
Sheets("BP -Tracker - Open Complaints").ListObjects("OpenComplaints").Range.AutoFilter Field:=2, Criteria1:= _
"#N/A"
Sheets("BP -Tracker - Open Complaints").ListObjects("OpenComplaints").DataBodyRange.Copy
' Sets AutoFilter to #N/A, then copies the table body
Sheets("YTD History Closed").Select
With activesheets
Dim LastRow As Long
LastRow = Sheets("YTD History Closed").ListObjects("ClosedQns").Range.Columns(4).Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row + 1
End With
Range("A" & LastRow).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
' Navigates to the History Closed tab, calculates the last row used
' Then pastes with special values
Sheets("BP -Tracker - Open Complaints").Select
Sheets("BP -Tracker - Open Complaints").ListObjects("OpenComplaints").DataBodyRange.ClearContents
' Selects the entries that have been copied over, then deletes them
If Sheets("BP -Tracker - Open Complaints").ListObjects("OpenComplaints").ShowAutoFilter Then
Sheets("BP -Tracker - Open Complaints").ListObjects("OpenComplaints").Range.AutoFilter
End If
' Removes the data filter
Sheets("Instructions").Select
Range("D10", "D10").Value = "X"
' Marks the step as complete with an X
End Sub
编辑:@soulshined。我很高兴这只是简单的逻辑验证。但是我提到我遇到了麻烦。请不要忽视我的问题只是因为它对你来说很简单。
@bigben抱歉是的,我只复制过滤后的数据。然后删除过滤后的数据。如果没有来自autofilter的结果,它只复制整个范围,这是我试图避免的错误。
我使用以下测试代码尝试了CountA 表格(“BP -Tracker - Open Complaints”)。ListObjects(“OpenComplaints”)。Range.AutoFilter字段:= 2,Criteria1:= _ “#N / A”
If WorksheetFunction.CountA(Range("OpenComplaints[CCMS Notification]")) > 0 Then
MsgBox ("> 0")
End If
If WorksheetFunction.CountA(Range("OpenComplaints[CCMS Notification]")) = 0 Then
MsgBox ("Empty")
End If
实际上并没有告诉我过滤后的表是否为空。它似乎甚至计算隐藏列,因为我的表OpenComplaints没有“#N / A”条目,并且当我应用该过滤器时它是空的。 XlCellTypeVisible似乎不适用于CountA。
感谢您向我展示其他问题,但基本问题并非重复。