Excel 否则VBA不工作
正在编写此代码,但仍然无法使其正常工作。我曾试图通过搜索和复制类似的代码将其拼凑在一起,但复制给出的解决方案失败 我有工作表A和工作表B。我有工作表A上的表A和工作表B上的表B。我想自动筛选表A并将结果(“快速状态”列=“已关闭”)(不包括标题信息)复制到表B的底部 如果满足该条件(“快速状态”列=“已关闭”),它将复制“快速状态”列中以“已关闭”作为条件的行,并将其粘贴到另一张表上,然后从表A中删除数据。按预期工作 但是,如果有一天我没有关闭任何文件,autofilter将不会返回任何结果。这就是问题发生的时候。 当我在调试器中单步执行它时,它会继续执行“IF”部分并在Excel 否则VBA不工作,excel,vba,Excel,Vba,正在编写此代码,但仍然无法使其正常工作。我曾试图通过搜索和复制类似的代码将其拼凑在一起,但复制给出的解决方案失败 我有工作表A和工作表B。我有工作表A上的表A和工作表B上的表B。我想自动筛选表A并将结果(“快速状态”列=“已关闭”)(不包括标题信息)复制到表B的底部 如果满足该条件(“快速状态”列=“已关闭”),它将复制“快速状态”列中以“已关闭”作为条件的行,并将其粘贴到另一张表上,然后从表A中删除数据。按预期工作 但是,如果有一天我没有关闭任何文件,autofilter将不会返回任何结果。这
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-确保工作表和表名与您的工作表和表名匹配。哎呀,我真不敢相信我错过了。谢谢,代码工作得很好@玩家-我会去做更多的学习。