使用每个循环VBA格式化Excel工作表

时间:2015-06-17 16:01:16

标签: vba foreach

我有一张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

为什么这只会格式化第一张?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

你永远不会告诉它去另一张纸。 最简单,最直观(尽管不是最好的!)方式是激活每张工作表,然后运行代码。

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

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

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