2015-12-15 136 views
1

我試圖循環遍歷工作簿中的所有工作表。我有以下代碼,它工作得很好;唯一的問題是,它只有在第一張紙上啓動宏時纔有效;如果我在任何其他地方做它,它會在第一次循環後停止。遍歷所有工作表

WS_Count = ActiveWorkbook.Worksheets.Count 
    For i = 1 To WS_Count 
     Dim ws1 As Worksheet 
     Set ws1 = ThisWorkbook.ActiveSheet 
     'if sheet contains evdre 
     Set c = ws1.Cells.Find("blabla") 
     If Not c Is Nothing Then 
      'do things 
     End If 
    Next i 

我不知道這個問題是由於一個事實,即宏應該總是在第一頁,或者如果啓動有一些錯誤代碼。 感謝您的任何幫助

編輯 在'做某事我實際上創造隱藏的牀單(我活躍在一個隱藏的副本);這可以讓計數陷入困境嗎?並因此只能在第一張工作

+0

是我還是沒有任何部分工作表在此代碼中更改? – Poof

+0

儘管iDevlop的回答可能是更有效的方法,但如果您在代碼中更改了一行,它將適用於您:只要在您的「做事情」中設置ws1 = ThisWorbook.Sheets(I)'適當引用'ws1'。 –

+0

是的,你的代碼中的問題只是,ActiveSheet不會改變,所以它在同一張表上多次循環。你可以a)改變它像斯科特解釋或b)使用基於對象的循環,如iDevlop explainend。 b)是更好的解決方案,因爲它更易於閱讀和擴展。 –

回答

3
Dim ws As Worksheet, c as range 
    for each ws in ThisWorkbook.WorkSheets 
    Set c = ws.Cells.Find("blabla") 
    If Not c Is Nothing Then 
     'do things 
    End If 
+0

當運行錯誤提示說對象不支持這個屬性或方法時:'For This ws In ThisWorkbook' – user3540466

+0

@iDevlop - 忘記了工作表位。 '對於ThisWorkbook.Worksheets中的每個工作表'工作表是Worksheets集合中的一個項目。 –

+0

我修復了代碼(在第二行添加了工作表) - 對不起 –