【问题标题】:Format Excel worksheets using for each loop VBA使用每个循环 VBA 格式化 Excel 工作表
【发布时间】:2015-09-02 23:47:39
【问题描述】:

我有一个 3 张工作簿。我想使用 VBA(设置字体大小、自动调整列、排序)对每张工作表进行相同的格式化。我找到了一段代码来遍历工作表:

Sub wsLoop()

   ' Declare Current as a worksheet object variable.
   Dim ws As Worksheet

   ' Loop through all of the worksheets in the active workbook.
   For Each ws In ActiveWorkbook.Worksheets
    'Code here
   Next ws

End Sub

原始代码包含一个弹出消息框,其中包含工作表名称。当插入我从录制宏中获得的格式化代码时,循环只格式化了第一张纸。我一直在寻找,但我找不到一个简单的例子。我不应该只是能够进去吗:

Cells.Select
With Selection.Font
    .Name = "Calibri"
    .Size = 9
    .Strikethrough = False
    .Superscript = False
    .Subscript = False
    .OutlineFont = False
    .Shadow = False
    .Underline = xlUnderlineStyleNone
    .TintAndShade = 0
    .ThemeFont = xlThemeFontNone
End With

为什么只格式化第一张纸?

【问题讨论】:

    标签: vba foreach


    【解决方案1】:

    Cells.Select 选择当前活动工作表的单元格。此选择不会在 For Each 循环中更改

    您想要处理For Each 构造提供的工作表的单元格,即

    Sub wsLoop()
    ' Declare Current as a worksheet object variable.
    Dim ws As Worksheet
    
        ' Loop through all of the worksheets in the active workbook.
        For Each ws In ActiveWorkbook.Worksheets
    
            ' format font of currently looped worksheet object feferenced by WS
            With ws.Cells.Font
                .Name = "Calibri"
                .Size = 9
                .Strikethrough = False
                .Superscript = False
                .Subscript = False
                .OutlineFont = False
                .Shadow = False
                .Underline = xlUnderlineStyleNone
                .TintAndShade = 0
                .ThemeFont = xlThemeFontNone
            End With
        Next ws
    End Sub
    

    【讨论】:

      【解决方案2】:

      您永远不会告诉它转到另一张纸。 最简单、最直观(虽然不是最好!)的方法是激活每张工作表,然后运行代码。

      无论您想对 for each 循环中的每个工作表做什么,都必须使用 ws.这样您就可以轻松地将任何录制的宏添加到循环中。

      For Each ws In ActiveWorkbook.Worksheets
       ws.activate
       cells.select
       With selection... yaddayadda
        yaddayadda
       end with
      Next ws
      

      就像我说的,有更好的方法可以做到这一点,但是由于您似乎是新手,所以这是最容易遵循的。 如果您是高级程序员,请避免使用类似宏记录器的编码,因为它速度慢且效率低下。 (在我看来很明显,但是 nvm...)

      【讨论】:

      • 我建议因此避免使用.Activate.Select,而是使用对象。代码变得更干净、更快,屏幕不会跳进跳出。只有少数情况下.Activate.Select 是合理的。
      • stackoverflow.com/questions/10714251/… 提供了深入的解释和良好的提示...
      • 我知道,我们都知道。如果你仔细阅读,我已经提到了这一点。我教 VBA 已经 10 多年了。对于试图掌握 VBA 的 Excel 新手用户来说,使用对象会让人感到困惑。使用 .activeate,.select 是他们的方式,以后,你可以教他们有效的编码。
      猜你喜欢
      • 2014-03-22
      • 1970-01-01
      • 1970-01-01
      • 2021-09-11
      • 2016-11-25
      • 1970-01-01
      • 2014-11-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多