我知道如何遍历工作簿中的所有工作表,以及在我到达“结束标志”工作表后如何退出:
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
答案 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