如何修改VBA宏使其在工作簿所有工作表中重复执行?
修改VBA宏以遍历所有工作表执行操作
你这段代码虽然写了For Each ws In Worksheets循环,但所有操作都依赖Select、Selection和Application.Goto,这些方法默认作用于当前激活的工作表,完全没和循环里的ws对象关联,所以才会只在同一个表重复执行。
下面是修正后的代码,核心是直接通过ws对象绑定工作表操作,全程不用选单元格,既高效又能确保每个工作表都被正确处理:
Sub Macro1() Dim ws As Worksheet ' 遍历工作簿内所有工作表 For Each ws In Worksheets With ws ' 取消当前工作表所有单元格的合并(直接操作,无需选中) .Cells.UnMerge ' 删除原D列和E列:注意删完D列后,原E列会变成新的D列,所以连续删两次D列 .Columns("D:D").Delete Shift:=xlToLeft .Columns("D:D").Delete Shift:=xlToLeft ' 定位J10,选中从J10到最右、最下的区域对应的整列并删除 Dim targetColumns As Range Set targetColumns = .Range("J10", .Range("J10").End(xlToRight)).End(xlDown).EntireColumn targetColumns.Delete End With Next ws End Sub
关键修改点说明:
- 去掉所有
Select/Selection操作,直接通过ws.前缀指定操作对象,确保代码作用在当前循环的工作表上 - 修正了删除列的逻辑:原代码删完D列再删E列会出错,因为删除D列后原E列自动左移成为新的D列,所以连续删两次D列才是正确的
- 用
With ws简化代码,所有.开头的操作都指向当前循环的工作表,避免重复写ws.
内容的提问来源于stack exchange,提问作者Cunctator
相关产品推荐
相关产品推荐

