Excel VBA循环遍历所有工作簿和所有工作表
我想要创build一个Excel VBA循环遍历所有.xlsx文件和这些文件中的所有工作表。 不过,我这里的代码只能处理第一张纸而不是所有的纸张。 有人可以告诉我,如果我的代码有什么问题吗? 非常感谢!
Sub Rollup() Dim wb As Workbook, MyPath, MyTemplate, MyName Dim ws As Worksheet MyPath = "I:\Reports\Rollup Reports\" MyTemplate = "*.xlsx" MyName = Dir(MyPath & MyTemplate) Do While MyName <> "" Set wb = Workbooks.Open(MyPath & MyName) For Each ws In wb.Worksheets LocationReport Next ws wb.Close True MyName = Dir() Loop End Sub Sub LocationReport() Application.ScreenUpdating = False Range("N4").Select ActiveCell.FormulaR1C1 = "1" Range("N4").Select Selection.Copy Range("B2:J7,B10:J20,B23:J28").Select Range("B23").Activate Selection.PasteSpecial Paste:=xlAll, Operation:=xlMultiply, SkipBlanks:= _ False, Transpose:=False Rows("1:1").Select Application.CutCopyMode = False Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove Application.ScreenUpdating = True End Sub
尝试在每个ws循环中添加ws.Activate:
For Each ws In wb.Worksheets ws.Activate LocationReport Next ws
一个可扩展的和OOP的esque处理方式是通过工作表作为参数:
Sub Rollup() Dim wb As Workbook, MyPath, MyTemplate, MyName Dim ws As Worksheet MyPath = "I:\Reports\Rollup Reports\" MyTemplate = "*.xlsx" MyName = Dir(MyPath & MyTemplate) Do While MyName <> "" Set wb = Workbooks.Open(MyPath & MyName) For Each ws In wb.Worksheets LocationReport (ws) Next ws wb.Close True MyName = Dir() Loop End Sub Sub LocationReport(ByRef ws As Worksheet) Application.ScreenUpdating = False With ws .Range("N4").FormulaR1C1 = "1" .Range("N4").Copy .Range("B2:J7,B10:J20,B23:J28").Select .Range("B23").Activate .Selection.PasteSpecial Paste:=xlAll, Operation:=xlMultiply, SkipBlanks:= _ False, Transpose:=False With .Rows("1:1") Application.CutCopyMode = False .Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove .Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove .Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove End With End With Application.ScreenUpdating = True End Sub
另外,稍微偏离主题,但我尽量避免使用Range.Select
,然后Selection.Method
方法。 只要有可能,只要将你的行为应用于范围就更好了。
我以上面的一些变化为例。