2015-12-15 138 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

我修复了代码(在第二行添加了工作表) - 对不起 –