2015-06-17 33 views
0

我有一个工作簿3张。我想使用VBA格式化每个工作表(设置字体大小,自动填充列,排序)。我发现了一段代码来遍历片材:格式Excel工作表使用每个循环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 

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

回答

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 
+0

感谢迈克,那工作!感谢帮助。 –

0

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

无论你想对每个循环内的每个工作表执行什么操作,都必须使用ws来完成。通过这种方式,您可以将任何录制的宏轻松添加到循环中。

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

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

+1

我建议避免使用'.Activate'和'.Select',而使用对象。代码变得更干净更快,屏幕不会跳出和跳出。只有少数情况下'.Activate'和'.Select'是合理的。 – MikeD

+1

http://stackoverflow.com/questions/10714251/how-to-avoid-using-select-in-excel-vba-macros提供了深入的解释和良好的提示... – MikeD

+0

我知道,我们都知道。如果你仔细阅读,我已经提到了这一点。我一直在教这个VBA超过10年了。对于新手Excel用户试图获得VBA的悬挂,使用对象是令人困惑的。使用.activeate,.select是他们的方式,然后,您可以教他们有效的编码。 – vacip