确定表是否为空,然后跳过其余的宏

时间:2018-05-22 23:11:31

标签: excel vba

下面的代码是我用来比较工作表上两个标签之间的条目。表对象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。

感谢您向我展示其他问题,但基本问题并非重复。

0 个答案:

没有答案