Search code examples
excelvbaworksheet

How can I loop through a subset of worksheets?


I know how to loop through all the worksheets in a workbook, and how to exit once I reach an 'end-flag' worksheet:

For Each ThisWorkSheet In Worksheets
   If ThisWorkSheet.Name = "FlagEnd" Then Exit For
   MsgBox "This worksheet name is: " & ThisWorkSheet.Name
Next

However I cannot get the loop to begin on a 'start-flag' worksheet (or even better on the worksheet right after the start-flag worksheet. For example the flagged start/end worksheets are in the middle of a bunch of other worksheets, so beginning or end traversing is not workable.

There could be hundreds of worksheets before that 'FlagStart' sheet, so I really need to start on the right sheet.

Tried:

Set ThisWorkSheet = Sheets("FlagNew")

and

For Each Sheets("FlagNew") In Worksheets

Ideas?

Solution: Mathias was very close, but dendarii was that tiny step closer with the custom ending index. I actually figured out my final solution on my own, but wanted to give credit. Here was my final solution:

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

Solution

  • If this is not a particularly changeable workbook (i.e. worksheets are not being added and deleted all the time), you could store the names of the worksheets in a range on a hidden sheet and loop through them by name.

    However, it sounds like they are stored consecutively in the workbook so, building on Mathias' solution, you could use a function to return the indices of the start and end worksheets and then loop through:

    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