2017-03-17 67 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