7

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

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

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

在“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
4

6 回答 6

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
于 2009-10-19T22:49:44.450 回答
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
于 2009-10-20T08:40:05.917 回答
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 中编写它,但你明白了。

于 2009-10-19T22:29:03.413 回答
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"

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

于 2009-10-20T01:33:00.210 回答
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
于 2015-12-18T12:03:03.133 回答
-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  
于 2012-11-09T20:32:21.950 回答