为什么VBA Next不会转到下一个工作表

时间:2017-04-03 23:33:41

标签: excel-vba foreach vba excel

所以我一直在这里寻找一段时间,我试图制作贯穿工作簿中每个工作表的代码,除非工作表名为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

任何帮助都会非常赞赏。 感谢

2 个答案:

答案 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,这会阻止代码崩溃,但不会强制它按照指示执行。