Excel 否则VBA不工作

Excel 否则VBA不工作,excel,vba,Excel,Vba,正在编写此代码,但仍然无法使其正常工作。我曾试图通过搜索和复制类似的代码将其拼凑在一起,但复制给出的解决方案失败 我有工作表A和工作表B。我有工作表A上的表A和工作表B上的表B。我想自动筛选表A并将结果(“快速状态”列=“已关闭”)(不包括标题信息)复制到表B的底部 如果满足该条件(“快速状态”列=“已关闭”),它将复制“快速状态”列中以“已关闭”作为条件的行,并将其粘贴到另一张表上,然后从表A中删除数据。按预期工作 但是,如果有一天我没有关闭任何文件,autofilter将不会返回任何结果。这

正在编写此代码,但仍然无法使其正常工作。我曾试图通过搜索和复制类似的代码将其拼凑在一起,但复制给出的解决方案失败

我有工作表A和工作表B。我有工作表A上的表A和工作表B上的表B。我想自动筛选表A并将结果(“快速状态”列=“已关闭”)(不包括标题信息)复制到表B的底部

如果满足该条件(“快速状态”列=“已关闭”),它将复制“快速状态”列中以“已关闭”作为条件的行,并将其粘贴到另一张表上,然后从表A中删除数据。按预期工作

但是,如果有一天我没有关闭任何文件,autofilter将不会返回任何结果。这就是问题发生的时候。 当我在调试器中单步执行它时,它会继续执行“IF”部分并在

   Range(Selection, Selection.End(xlDown)).SpecialCells   (xlCellTypeVisible).Copy
不知道为什么它不停在IF部分并向下移动到Else。If部分应该检测到结果小于1,因此它应该清除过滤器,然后填充一个消息框,通知用户当天没有关闭任何文件

“PendA”是表A的名称。 “快速状态”是表A中我正在搜索条件“已关闭”的列的名称。 表A从B14开始。在L列结束

Sub MoveC()
'
' MoveC Macro


Dim rng As Range, res As Variant, lrow As Long


Set rng = ActiveSheet.ListObjects("PendA").AutoFilter.Range.Rows(1)
res = Application.Match("Quick Status", rng, 0)
rng.AutoFilter Field:=res, Criteria1:="Closed"

lrow = ActiveSheet.Cells(Rows.Count, res).End(xlUp).Row + 1



If ActiveSheet.Range(Cells(1, res), Cells(lrow, res)).SpecialCells(xlCellTypeVisible).Cells.Count > 1 Then
    Range("B15:L15").Select
    Range(Selection, Selection.End(xlDown)).SpecialCells(xlCellTypeVisible).Copy


    Sheets("Closed").Select
    Range("A2000").End(xlUp).Offset(1, 0).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False


    Sheets("Pending").Select
    Application.DisplayAlerts = False
    ActiveSheet.ListObjects("PendA").DataBodyRange.Rows.Delete
    ActiveSheet.ListObjects("PendA").Range.AutoFilter Field:=8


Else

    ActiveSheet.ListObjects("PendA").Range.AutoFilter Field:=8

    MsgBox "No Closures found. Should have taken a PTO today."

End If

End Sub

总的来说,有一种更好的方法来构造代码,以确保准确性、可维护性和易于阅读

试试下面的方法。它检查过滤器前的列中是否有“Closed”的实例

Sub MoveC()

    Dim PendATbl as ListObject
    Set PendATbl = Worksheets("A").ListObjects("PendA") 'change as needed

    With PendATbl

        If Not .ListColumns("Quick Status").DataBodyRange.Find("Closed", lookat:=xlWhole) Is Nothing Then

            .ListColumns("Quick Status").Range.AutoFilter 1, "Closed"
            .DataBodyRange.SpecialCells(xlCellTypeVisible).Copy

             Sheets("Closed").Range("A2000").End(xlUp).Offset(1).PasteSpecial xlPasteValues

            .DataBodyRange.Rows.Delete

        Else

           .Range.AutoFilter Field:=8
            MsgBox "No Closures found. Should have taken a PTO today."

        End If 

    End With

End Sub

+1
lrow=ActiveSheet.Cells(Rows.Count,res).End(xlUp).Row+1
中删除,然后查看它是否有效。如果没有,我有另一种方法,因为如果逻辑不正确,使用
SpecialCells
进行测试可能会很棘手。为什么在代码开始时使用<代码> ListObjs<代码>,然后在中间使用<代码>范围< /代码>。如果您坚持使用
ListObject
对象模型,您的代码将更易于阅读和维护。@scott Holtzman-我尝试从lrow=ActiveSheet.Cells(Rows.Count,res).End(xlUp).Row+1中删除+1,但仍然存在相同的问题。至于我为什么在方法之间切换,我不知道如何将复制的数据粘贴到表B的底部,特别是当我粘贴多行并使用粘贴特殊值时。每次我试图对它进行编码时,都会遇到错误,或者它会在表B的底部添加一个空行,而不会粘贴任何数据。这是我唯一能让它正常工作的方法。正如您可能收集到的-我是VBA新手。请更改
ActiveSheet
以明确说明您希望在所有实例中使用的工作表`。。。类似于
工作表(“SheetA”)
和/或
工作表(“SheetB”)
ActiveSheet
可能不是您想象的那样。若这不能解决问题,我会写一个最有可能有效的答案。我按照你们的建议做了,但仍然并没有雪茄。顺便说一句,谢谢你的帮助。我建议在尝试建议之前先学习如何使用调试器。重构你的代码并不能帮助你解决下一个问题——你不想回到三天的生活吗?如果不是,则在下一行获取“语法错误”。ListColumns(“快速状态”).DataBodyRange.Find(“关闭”,lookat:=xlWhole)是Nothing@Den-那个讨厌的
字,每次都让我讨厌!Try now.Odd now它在宏的前面停止了-它停在这一行Set PendATbl=Worksheets(“A”).ListObjects(“PendA”)。它给出了一个超出范围的下标error@Den-确保工作表和表名与您的工作表和表名匹配。哎呀,我真不敢相信我错过了。谢谢,代码工作得很好@玩家-我会去做更多的学习。