如何循环工作表的子集?

时间:2009-10-19 22:17:13

标签: excel-vba vba worksheet excel

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

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

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

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

尝试:

Set ThisWorkSheet = Sheets("FlagNew")

For Each Sheets("FlagNew") In Worksheets

想法?

解决方案: 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

6 个答案:

答案 0 :(得分:2)

我相信如果您使用“foreach”,您将无法控制起始页。就此而言,我甚至不确定您是否会保证迭代发生的顺序 我认为你应该做的是首先,获取你感兴趣的工作表的索引(按名称获取工作表,并获取其索引),然后使用for循环迭代,从标志开始的标签索引表索引。
[编辑:我通过一个简单的例子入侵]

Sub Iterate()

Dim book As Workbook
Dim flagIndex As Integer
Dim flagSheet As Worksheet

Set book = ActiveWorkbook
Set flagSheet = book.Worksheets("Sheet3")
flagIndex = flagSheet.Index

Dim sheetIndex As Integer
Dim currentSheet As Worksheet

For sheetIndex = flagIndex To book.Worksheets.Count
    Set currentSheet = book.Worksheets(sheetIndex)
Next

End Sub

答案 1 :(得分: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

答案 2 :(得分:1)

怎么样?

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

此代码可能不太正确。我在SO编辑器中写的不是VBA,但是你明白了。

答案 3 :(得分:0)

您迭代的工作表是否具有通用名称格式?

例)

Sheets(0).name > "Reports"
Sheets(1).name > "Start Here"
Sheets(2).name > "emp.0001"
Sheets(3).name > "emp.0002"
Sheets(4).name > "emp.0003"
Sheets(5).name > "emp.0004"
Sheets(6).name > "End Here"

如果是这样,在每个循环中,只需执行Left(ThisWorkSheet.name, 4) = "emp"验证它是否是您要引用的工作表。

答案 4 :(得分:0)

在Excel VBA 2013中,如果您有工作表,则需要在选项卡之间进行更新" Blankfirst"和" Blanklast"这很有效。

使用下面的代码测试它会带回您的标签名称,然后替换您的操作代码来代替MsgBox wks.Name部分。

Sub Macro2()

    On Error Resume Next
    GetStartIndex = ThisWorkbook.Worksheets("Blankfirst").Index + 1

    On Error Resume Next
    GetEndIndex = ThisWorkbook.Worksheets("Blanklast").Index - 1

    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

答案 5 :(得分:-1)

 Public Sub ITERATE_WORKSHEETS()  
   On Error Resume Next    
   Dim x As Long  
         For x = 0 To 100  
              MsgBox Worksheets(x).Name  
         Next x   
   On Error GoTo 0  
   MsgBox "all done"  
 End Sub  
相关问题