我如何通过 VBA 通过所有 Excel 工作表 运行 特定命令?
How can I run specific commands through all Excel worksheets via VBA?
大家好!
简介。
在一个 Excel 工作簿中,我有两个结构相似的工作表。
为了使某些过程自动化,我编写了一个简单的 VBA 代码来执行以下操作:
- 将格式从文本转换为范围内的数据;
- 按照从最旧到最新的范围对日期进行排序;
- 根据特定字符(部门负责人的全名,例如J.S.Doe)在一个范围内过滤;
- 激活视图并将视图移动到两个工作表的左上角单元格;
- 转到下一个工作表并重复代码,然后转到上一个工作表。
代码.
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
大家好!
简介。
在一个 Excel 工作簿中,我有两个结构相似的工作表。
为了使某些过程自动化,我编写了一个简单的 VBA 代码来执行以下操作:
- 将格式从文本转换为范围内的数据;
- 按照从最旧到最新的范围对日期进行排序;
- 根据特定字符(部门负责人的全名,例如J.S.Doe)在一个范围内过滤;
- 激活视图并将视图移动到两个工作表的左上角单元格;
- 转到下一个工作表并重复代码,然后转到上一个工作表。
代码.
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