(VBA)通过图纸代号循环

(VBA)通过图纸代号循环,vba,indexing,Vba,Indexing,在VBA中,我知道可以像这样循环浏览工作表: for i = 1 to 5 msgbox worksheets(i).cells(1,1) next 这将从工作簿中提取前5张工作表(按从左到右的顺序)。我如何引用工作表的代码名?因为工作簿中的第一张工作表可能是Sheet10,第二张工作表可能是Sheet6,等等……所以如果我尝试使用sheet#s(代码名)循环,这可能吗 如果图纸称为Sht1、Sht2、Sht5 然后 如果图纸称为Sht1、Sht2、Sht5 然后 在代码名上没有索引器,所以你

在VBA中,我知道可以像这样循环浏览工作表:

for i = 1 to 5
msgbox worksheets(i).cells(1,1)
next

这将从工作簿中提取前5张工作表(按从左到右的顺序)。我如何引用工作表的代码名?因为工作簿中的第一张工作表可能是Sheet10,第二张工作表可能是Sheet6,等等……所以如果我尝试使用sheet#s(代码名)循环,这可能吗

如果图纸称为Sht1、Sht2、Sht5 然后


如果图纸称为Sht1、Sht2、Sht5 然后


在代码名上没有索引器,所以你必须自己在表格中循环。 一个非常基本的例子如下:

Public Sub FindSheets()
    Dim i As Integer
    Dim objSheet As Worksheet

    For i = 1 To 5
        Set objSheet = FindSheetByName("Sheet" & i)
        If objSheet Is Nothing Then
            MsgBox "No sheet with codename Sheet" & i
        Else
            MsgBox objSheet.Name & " has codename " & objSheet.CodeName
        End If
    Next
End Sub

Function FindSheetByName(ByVal v_strCodeName As String) As Worksheet
    Dim objSheet As Worksheet

    Set FindSheetByName = Nothing

    For Each objSheet In ActiveWorkbook.Sheets
        If objSheet.CodeName = v_strCodeName Then
            Set FindSheetByName = objSheet
            Exit Function
        End If
    Next
End Function

在代码名上没有索引器,所以你必须自己在表格中循环。 一个非常基本的例子如下:

Public Sub FindSheets()
    Dim i As Integer
    Dim objSheet As Worksheet

    For i = 1 To 5
        Set objSheet = FindSheetByName("Sheet" & i)
        If objSheet Is Nothing Then
            MsgBox "No sheet with codename Sheet" & i
        Else
            MsgBox objSheet.Name & " has codename " & objSheet.CodeName
        End If
    Next
End Sub

Function FindSheetByName(ByVal v_strCodeName As String) As Worksheet
    Dim objSheet As Worksheet

    Set FindSheetByName = Nothing

    For Each objSheet In ActiveWorkbook.Sheets
        If objSheet.CodeName = v_strCodeName Then
            Set FindSheetByName = objSheet
            Exit Function
        End If
    Next
End Function

您可以创建自己的工作表集合,通过代码名对其进行索引。此函数的作用是:

Function SheetsByCodeName() As Collection
    Dim sh As Worksheet
    Set SheetsByCodeName = New Collection
    For Each sh In ThisWorkbook.Worksheets
        SheetsByCodeName.Add sh, sh.CodeName
    Next
End Function
然后,您可以使用它来编制索引,如下所示:

dim sheetsByCN as Object: Set sheetsByCN = SheetsByCodeName
dim cn
For each cn in Array("Sheet10","Sheet11","Sheet22","Sheet5","Sheet1")
    debug.print sheetsByCN(cn).Cells(1,1).value
Next

您可以创建自己的工作表集合,通过代码名对其进行索引。此函数的作用是:

Function SheetsByCodeName() As Collection
    Dim sh As Worksheet
    Set SheetsByCodeName = New Collection
    For Each sh In ThisWorkbook.Worksheets
        SheetsByCodeName.Add sh, sh.CodeName
    Next
End Function
然后,您可以使用它来编制索引,如下所示:

dim sheetsByCN as Object: Set sheetsByCN = SheetsByCodeName
dim cn
For each cn in Array("Sheet10","Sheet11","Sheet22","Sheet5","Sheet1")
    debug.print sheetsByCN(cn).Cells(1,1).value
Next

不,不可能按表的代号为表编制索引。
可以循环所有工作表并检查其代码名,也可以使用单独的方法:

Sub processSheet(ws As Worksheet)
    Debug.Print ws.Cells(1)
End Sub

Sub process()
    processSheet(Sheet10)
    processSheet(Sheet11)
    processSheet(Sheet12)
End Sub
另一个备选方案可能是(未测试):


不,不可能按表的代号为表编制索引。
可以循环所有工作表并检查其代码名,也可以使用单独的方法:

Sub processSheet(ws As Worksheet)
    Debug.Print ws.Cells(1)
End Sub

Sub process()
    processSheet(Sheet10)
    processSheet(Sheet11)
    processSheet(Sheet12)
End Sub
另一个备选方案可能是(未测试):


答案取决于你的最终目标。如果要在工作表中启动特定的VBA方法,则会有一个答案,但如果您只想根据代码名的顺序在工作表上迭代,则会有另一个答案。哦,顺便说一下,名字和代码不同,名字和索引也不同。这些都是完全独立的。@A.S.H抱歉,我编辑了我的问题。我希望通过代码名进行迭代。例如,对于一个有30多张工作表的工作簿,我尝试只循环10-15个代码名,以确保是name还是codeName?前者是您在Excel的选项卡栏中看到的内容。后者是VBA editor.codeName中相应模块的名称。正确,与编辑器中显示的模块对应的名称。答案取决于您的最终目标。如果要在工作表中启动特定的VBA方法,则会有一个答案,但如果您只想根据代码名的顺序在工作表上迭代,则会有另一个答案。哦,顺便说一下,名字和代码不同,名字和索引也不同。这些都是完全独立的。@A.S.H抱歉,我编辑了我的问题。我希望通过代码名进行迭代。例如,对于一个有30多张工作表的工作簿,我尝试只循环10-15个代码名,以确保是name还是codeName?前者是您在Excel的选项卡栏中看到的内容。后者是VBA editor.codeName中相应模块的名称。正确,与编辑器中显示的模块对应的名称。我希望遍历工作表代码名,而不是工作表名称。我希望遍历工作表代码名,而不是工作表名称。感谢您的回复。创建集合的原因是codeName是属性而不是对象?@excelmonkey93
codeName
是字符串类型的属性。要使用它进行索引,我们只需要创建自己的集合并将其用作键。
工作表
集合已经做了相同的事情,但是使用的是名称,而不是代码名,这就是为什么我们需要做一些类似的事情。明白了。非常感谢您的解释。谢谢您的回复。创建集合的原因是codeName是属性而不是对象?@excelmonkey93
codeName
是字符串类型的属性。要使用它进行索引,我们只需要创建自己的集合并将其用作键。
工作表
集合已经做了相同的事情,但是使用的是名称,而不是代码名,这就是为什么我们需要做一些类似的事情。明白了。非常感谢你的解释。