You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 02:57:30