(VBA)通过图纸代号循环
在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 然后 在代码名上没有索引器,所以你
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是属性而不是对象?@excelmonkey93codeName
是字符串类型的属性。要使用它进行索引,我们只需要创建自己的集合并将其用作键。工作表
集合已经做了相同的事情,但是使用的是名称,而不是代码名,这就是为什么我们需要做一些类似的事情。明白了。非常感谢你的解释。