VBA遍历工作簿工作表失效:始终仅处理当前活动工作表求助
问题分析与修正代码
你的代码核心问题是所有Range操作都没有绑定到循环中的目标工作表,VBA里直接写Range()会默认指向当前活动工作表,所以循环时根本没切换到其他工作表执行判断和筛选。另外还有一处语法错误:筛选条件的引号没闭合。
修正后的For循环版本
Sub WorksheetLoop() Dim WS_Count As Integer Dim I As Integer Dim WS As Worksheet ' 声明工作表对象,明确操作目标 WS_Count = ActiveWorkbook.Worksheets.Count ' 遍历每个工作表 For I = 1 To WS_Count Set WS = ActiveWorkbook.Worksheets(I) ' 绑定当前循环的工作表 ' 所有Range操作通过WS对象调用,确保操作的是当前循环的工作表 If WorksheetFunction.Sum(WS.Range("N:N")) > 20000 Then ' 先清除原有筛选(可选,避免筛选状态叠加) If WS.AutoFilterMode Then WS.AutoFilterMode = False ' 修复引号闭合问题,同时去掉条件里的空格(确保筛选逻辑准确) WS.Range("A:P").AutoFilter Field:=7, Criteria1:="<>0" End If Next I End Sub
更推荐的For Each循环版本(简洁不易出错)
Sub WorksheetLoop_ForEach() Dim WS As Worksheet ' 直接遍历工作簿内所有工作表 For Each WS In ActiveWorkbook.Worksheets If WorksheetFunction.Sum(WS.Range("N:N")) > 20000 Then If WS.AutoFilterMode Then WS.AutoFilterMode = False WS.Range("A:P").AutoFilter Field:=7, Criteria1:="<>0" End If Next WS End Sub
关键修正说明
- 必须通过工作表对象(比如
WS)调用Range,明确指定操作的目标工作表,不能用无绑定的Range()。 - 修复了筛选条件的引号缺失问题,同时去掉
<> 0里的空格,避免筛选时误匹配带空格的内容(如果你的需求就是带空格,再加回去即可)。 - 新增清除原有筛选的逻辑,避免之前的筛选状态干扰新的筛选操作。
内容的提问来源于stack exchange,提问作者Sophie101
相关产品推荐
相关产品推荐

