如何让VBA宏运行到最后一张工作表时停止?运行时末尾报错
解决宏运行到最后一张表停止并避免错误的方法
错误原因
你的宏出现运行时错误,核心问题是最后一张工作表执行Sheets(ActiveSheet.Index + 1).Activate时,Index +1超出了工作表的索引范围,找不到对应的工作表。另外你尝试的If folder.Show <> -1 Then Exit Sub是针对文件选择对话框的逻辑,和当前遍历工作表的场景完全无关,所以无法解决问题。
修正后的宏代码
直接利用For Each遍历工作表的特性,不需要手动切换激活状态,直接对每个工作表对象操作,从根源避免越界问题:
Sub ACT1() Dim ws As Worksheet ' 只在开头关闭屏幕刷新,提升效率 Application.ScreenUpdating = False For Each ws In ThisWorkbook.Worksheets With ws.Range("B:B") .NumberFormat = "General" .Value = .Value .HorizontalAlignment = xlLeft End With Debug.Print ws.Name Next ws ' 恢复屏幕刷新 Application.ScreenUpdating = True End Sub
关键优化点
- 去掉了多余的
Select和Activate操作:直接通过ws.Range指定操作的工作表,避免依赖激活状态,代码更稳定高效 - 将
Application.ScreenUpdating放在循环外:只执行一次关闭和恢复,减少性能消耗 - 利用
For Each自动遍历所有工作表,无需手动控制索引,自然在最后一张表结束循环,不会出现越界错误
如果坚持要保留激活工作表的逻辑(不推荐,因为激活操作会降低宏效率),可以添加判断,跳过最后一张表的激活操作:
Sub ACT1() Dim ws As Worksheet Application.ScreenUpdating = False For Each ws In ThisWorkbook.Worksheets With ws.Range("B:B") .NumberFormat = "General" .Value = .Value .HorizontalAlignment = xlLeft End With Debug.Print ws.Name ' 判断当前是否是最后一张工作表,不是才执行激活 If ws.Index <> ThisWorkbook.Worksheets.Count Then Sheets(ws.Index + 1).Activate End If Next ws Application.ScreenUpdating = True End Sub
内容的提问来源于stack exchange,提问作者Hossam A.
相关产品推荐
相关产品推荐

