所以我一直在这里寻找一段时间,我试图制作贯穿工作簿中每个工作表的代码,除非工作表名为Summary,Archive或Template。在运行代码时,当我从具有这三个名称中的任何一个的工作表开始时,它似乎跳过代码,但从未进入下一个工作表。 (值得一提的是,我的代码涉及到另一个工作簿来收集数据)。
以下是我所拥有的:
For Each rs In ActiveWorkbook.Worksheets
If rs.Name <> "Summary" And rs.Name <> "Archive" And rs.Name <> "Template" Then
'my Code to do
End If
Next rs
任何帮助都会非常赞赏。 感谢
答案 0 :(得分:2)
在您从问题中省略的实际处理代码中,您正在使用Activesheet
或根本没有父工作表。请改用rs
。
For Each rs In ActiveWorkbook.Worksheets
WITH RS '<~~ use rs
select case lcase(.Name)
case "summary", "archive", "template"
'do nothing
case else
rs.Select '<~~ not considered 'best practice'
'my Code to do with stuff .Range("A1") or .Cells(1, "A") on rs
end select
END WITH
Next rs
请注意,在With ... End With
中,您在所有工作表成员之前使用.
将父工作表推送到With ... End With
中描述的工作表。
答案 1 :(得分:0)
当你遇到意想不到的事情时,我发现最好能够直观地检查发生了什么。试试这个: -
Sub Ryan_S()
Dim Ws As Worksheet
For Each Ws In ActiveWorkbook.Worksheets
Debug.Print Ws.Name
If Ws.Name <> "Summary" And Ws.Name <> "Archive" And Ws.Name <> "Template" Then
Debug.Print , "Executing my code"
'my Code to do
End If
Next Ws
End Sub
除了我反对调用工作表“rs”(这在我的书中是一行:-)的小反抗之外,代码与你的完全一样。但是,我添加了两行代码,它们将某些内容打印到立即窗口(如果默认情况下不可见,则为Ctl + G)。第一行只打印被调用的每张纸的名称,第二行只打印在其中一张选定的纸张上。
此测试将指导您解决错误。您可能会发现您正在遍历错误的工作簿(正如上面有人建议的那样),或者您的代码实际运行但没有按预期执行。初学者的常见错误是在其中包含On Error Resume Next
,这会阻止代码崩溃,但不会强制它按照指示执行。