我如何通过 VBA 通过所有 Excel 工作表 运行 特定命令?

How can I run specific commands through all Excel worksheets via VBA?

大家好

简介。

在一个 Excel 工作簿中,我有两个结构相似的工作表。

为了使某些过程自动化,我编写了一个简单的 VBA 代码来执行以下操作:

代码.

Sub SuperiorsOrders()
    
    Application.ScreenUpdating = False
    
    Range("I3", Range("I3").End(xlDown)).TextToColumns FieldInfo:=Array(1, 4)
    Range("A3", "J3").End(xlDown).Sort [I2], xlAscending, Header:=xlYes
    Range("A3", "J3").End(xlDown).AutoFilter Field:=8, Criteria1:="J.S.Doe"
    
    Range("A1").Select
    Application.GoTo ActiveSheet.Range("A1"), Scroll:=True
    
    ActiveSheet.Next.Select
    
    Range("I3", Range("I3").End(xlDown)).TextToColumns FieldInfo:=Array(1, 4)
    Range("A3", "J3").End(xlDown).Sort [I2], xlAscending, Header:=xlYes
    Range("A3", "J3").End(xlDown).AutoFilter Field:=8, Criteria1:="J.S.Doe"
    
    Range("A1").Select
    Application.GoTo ActiveSheet.Range("A1"), Scroll:=True
    
    ActiveSheet.Previous.Select
    
    Application.ScreenUpdating = True

End Sub

问题.

为了减少代码,我尝试将其包装到 For Each 循环语句中。它仍然运行良好,但仅适用于活动工作表,而不适用于所有工作表。

Sub SuperiorsOrders()

Application.ScreenUpdating = False

Dim WS As Worksheet

For Each WS In Worksheets
    Range("I3", Range("I3").End(xlDown)).TextToColumns FieldInfo:=Array(1, 4)
    Range("A3", "J3").End(xlDown).Sort [I2], xlAscending, Header:=xlYes
    Range("A3", "J3").End(xlDown).AutoFilter Field:=8, Criteria1:="J.S.Doe"
    Range("A1").Select
    Application.GoTo ActiveSheet.Range("A1"), Scroll:=True
Next WS

Application.ScreenUpdating = True

End Sub

问题.

你能帮我重写代码以使其正常工作吗?

备注

我尝试在互联网上搜索解决方案,包括此处的类似问题,但它对我不起作用。

您必须将工作sheet 引用添加到循环中的范围,否则 Range 始终引用活动 sheet

    ws.Range("I3", ws.Range("I3").End(xlDown)).TextToColumns FieldInfo:=Array(1, 4)
   ' add the remaining lines of code starting with ws.

With  ws 
   .Range("I3", .Range("I3").End(xlDown)).TextToColumns FieldInfo:=Array(1, 4)
   ' add the remaing lines of code in the same way
End With 

所以你的代码应该是这样的

Sub SuperiorsOrders()

    Application.ScreenUpdating = False

    Dim WS As Worksheet

    For Each WS In Worksheets
        With WS
            .Range("I3", .Range("I3").End(xlDown)).TextToColumns FieldInfo:=Array(1, 4)
            .Range("A3", "J3").End(xlDown).Sort [I2], xlAscending, Header:=xlYes
            .Range("A3", "J3").End(xlDown).AutoFilter Field:=8, Criteria1:="J.S.Doe"
            ' .Range("A1").Select  That is not necessary
        End With
        'Application.GoTo ActiveSheet.Range("A1"), Scroll:=True  <= What is that good for?
    Next WS

    Application.ScreenUpdating = True

End Sub