Excel VBA循环格式化所有表格时字体设置仅生效于当前工作表问题
问题原因
原代码格式设置仅对活动工作表生效的核心原因是未显式指定操作对象的所属范围:
- 代码中
Cells.Select没有绑定当前循环到的ws工作表对象,默认只会选中当前处于激活状态的工作表单元格,后续所有基于Selection的字体、行高列宽、数字格式设置,自然只会作用在初始的活动工作表上。 - 开头的
Set ws = ActiveSheet是冗余代码,后续For Each ws In ActiveWorkbook.Worksheets循环会重新给ws变量赋值,这行不会产生实际作用。 - 全选整张工作表单元格设置格式的逻辑本身效率极低,实际仅需要针对遍历到的表格对象做格式设置即可。
修正后代码
直接操作表格对象的范围,完全弃用Select/Selection的低效写法,从根源避免跨表作用范围错误:
Sub Format_Tables() ' Tables_Format Macro Dim ws As Worksheet Dim tbl As ListObject '遍历活动工作簿内所有工作表 For Each ws In ActiveWorkbook.Worksheets '遍历当前工作表内的所有表格 For Each tbl In ws.ListObjects '设置表格内置样式 tbl.TableStyle = "TableStyleMedium9" '设置表格范围内的字体格式 With tbl.Range.Font .Name = "Garamond" .Size = 12 .Strikethrough = False .Superscript = False .Subscript = False .OutlineFont = False .Shadow = False .Underline = xlUnderlineStyleNone .ThemeColor = xlThemeColorLight1 .TintAndShade = 0 .ThemeFont = xlThemeFontNone End With '自动适配行高列宽、设置数字格式 tbl.Range.Rows.AutoFit tbl.Range.Columns.AutoFit tbl.Range.NumberFormat = "0.000" Next tbl Next ws End Sub
补充说明
- 所有VBA操作优先直接操作目标对象,不要依赖
Select选中后再操作Selection,后者不仅运行速度慢,还很容易因为活动窗口、活动工作表切换不及时出现作用范围错误。 - 如果确实需要给整张工作表的所有单元格设置格式,而不是仅针对表格区域,只需要把上述代码中所有
tbl.Range替换为ws.Cells即可,不需要额外执行激活工作表、选中单元格的操作。
内容的提问来源于stack exchange,提问作者Monica Romero
相关产品推荐
相关产品推荐

