2017-03-17 69 views
1

在VBA中,我知道它能够循环通过工作表所示:(VBA)循环通过片代号

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

在工作簿(从左至右按顺序)其中拉动第一5张。我怎样才能参考工作表的代号呢?因为在工作簿中的第一张工作表中可能是Sheet10,第二张Sheet6等等......所以如果我试图循环使用sheet#s(codenames),那可能吗?

+0

问题的答案取决于你的最终目标。如果要在工作表中启动特定的VBA方法,则会有答案,但是如果您只想根据其代码名称的顺序在表单上迭代,则会有不同的答案。哦,顺便说一下,名称不同于代码名称与索引不同。这些完全相互独立。 –

+0

@ A.S.H道歉,我编辑了我的问题。我希望遍历代码名称。例如,对于具有30多张工作表的工作簿,我试图循环访问代码名称10-15 – lostinOracle

+2

只需确保* name *或* codeName *?前者是您在Excel中的标签栏中看到的内容。后者是VBA编辑器中相应模块的名称。 –

回答

3

您可以创建的工作表自己的收藏,您可以通过代号为指数。这个函数是:

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 
+0

感谢您的回复。创建集合的原因是codeName的属性而不是对象? – lostinOracle

+1

@ excelmonkey93'codeName'是string类型的属性。要使用它进行索引,我们需要的是创建我们自己的集合并将其用作关键字。 “Worksheets”集合已经做了相同的处理,但是名称而不是代码名称,这就是为什么我们需要做类似的事情。 –

+1

明白了。真的很感谢解释。 – lostinOracle

-2

如果叫Sht1,Sht2床单,,, Sht5 然后

for i = 1 to 5 
msgbox worksheets("Sht" & i).cells(1,1) 
next 
+0

我正在寻找迭代通过表代码名称,而不是工作表名称。 – lostinOracle

1

的是代号为没有索引,所以你必须通过自己的床单循环。 一个非常基本的例子是这样的:

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 
1

不,这不可能通过自己的代号指数表。
您可以循环中的所有表和检查他们的代号,或使用一个单独的方法:

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

Sub process() 
    processSheet(Sheet10) 
    processSheet(Sheet11) 
    processSheet(Sheet12) 
End Sub 

另一种方法是(未测试):

For Each ws In Array(Sheet10, Sheet11, Sheet12) 
    Debug.Print ws.Cells(1) 
Next