如何循环工作表的子集?

Kir*_*ngs 7 excel vba worksheet excel-vba

我知道如何遍历工作簿中的所有工作表,以及如何在到达"结束标志"工作表时退出:

For Each ThisWorkSheet In Worksheets
   If ThisWorkSheet.Name = "FlagEnd" Then Exit For
   MsgBox "This worksheet name is: " & ThisWorkSheet.Name
Next
Run Code Online (Sandbox Code Playgroud)

但是我无法在'start-flag'工作表上开始循环(或者在start-flag工作表之后的工作表上更好.例如,标记的开始/结束工作表位于一堆其他工作表的中间,所以开始或结束遍历是行不通的.

在'FlagStart'表单之前可能有数百个工作表,所以我真的需要从正确的表单开始.

尝试:

Set ThisWorkSheet = Sheets("FlagNew")
Run Code Online (Sandbox Code Playgroud)

For Each Sheets("FlagNew") In Worksheets
Run Code Online (Sandbox Code Playgroud)

想法?

解决方案:Mathias非常接近,但是dendarii与自定义结束索引相距甚远.我实际上已经找到了自己的最终解决方案,但是我想给予赞扬.这是我的最终解决方案:

Private Sub CommandButtonLoopThruFlaggedSheets_Click()
    ' determine current bounds
    Dim StartIndex, EndIndex, LoopIndex As Integer
    StartIndex = Sheets("FlagNew").Index + 1
    EndIndex = Sheets("FlagEnd").Index - 1

    For LoopIndex = StartIndex To EndIndex
        MsgBox "this worksheet is: " & Sheets(LoopIndex).Name
        ' code here
    Next LoopIndex
End Sub
Run Code Online (Sandbox Code Playgroud)

小智 2

如果这不是一个特别容易更改的工作簿(即工作表不会一直添加和删除),您可以将工作表的名称存储在隐藏工作表的某个范围内,并按名称循环遍历它们。

然而,听起来它们是连续存储在工作簿中的,因此,在 Mathias 的解决方案的基础上,您可以使用一个函数返回开始和结束工作表的索引,然后循环:

Public Function GetStartIndex() As Integer
    On Error Resume Next
    GetStartIndex = ThisWorkbook.Worksheets("MyStartingWorksheet").Index + 1
End Function

Public Function GetEndIndex() As Integer
    On Error Resume Next
    GetEndIndex = ThisWorkbook.Worksheets("MyEndingWorksheet").Index - 1
End Function

Sub LoopThrough()

    Dim wks As Worksheet
    Dim i As Integer
    Dim iStart As Integer
    Dim iEnd As Integer

    iStart = GetStartIndex()
    iEnd = GetEndIndex()

    If iStart > 0 And iEnd > 0 And iEnd > iStart Then
        For i = iStart To iEnd
            Set wks = ThisWorkbook.Worksheets(i)
            MsgBox wks.Name
        Next i
    End If

End Sub
Run Code Online (Sandbox Code Playgroud)