2014-10-27 205 views
0

我试图循环遍历工作簿中的每个工作表,但它不工作。我认为这是ActiveWorkbook.Worksheets不能识别每个工作表,只能在Active工作表上运行。任何建议都会很棒!我相信这是一个基本的修复,但似乎无法弄清楚。谢谢!循环遍历工作簿中的每个工作表

Sub LoopThroughWorksheets() 
    Dim ws As Worksheet 

    For Each ws In ActiveWorkbook.Worksheets 
     If (ws.Name <> "Sheet1") And (ws.Name <> "Sheet2") And (ws.Name <> "Sheet8") And (ws.Name <> "Sheet42") Then 

      With ws 
       'code 
       'Sheets("Formula").Select 
       Range("FormulaRow").Copy 
       'Selection.Copy 
       ActiveSheet.Select 
       ActiveSheet.Range("A1").Select 
       ActiveSheet.Paste 
       Calculate 
       Range("Q1:X1").Select 
       Selection.Copy 
       Range("Q3:X3000").Select 
       Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _ 
        SkipBlanks:=False, Transpose:=False 
       Application.CutCopyMode = False 
       Calculate 
       Selection.Copy 
       Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
        :=False, Transpose:=False 

      End With 
     End If 
    Next ws 

End Sub 
+0

“我认为这是不承认每个工作表的ActiveWorkbook.Worksheets”:这是很好的有一个理论,这可能解释的问题。为什么不向你的循环添加一些代码来显示在每次迭代中ActiveSheet实际上是在变化的呢? – MartynA 2014-10-27 21:50:56

+0

我可以看到它在每次迭代中都没有变化,这就是我为什么这么想的原因。谢谢。 – 2014-10-27 22:07:46

回答

1

对于With声明,你需要将每个你想引用对象与.使用它你打算的方式同步进行。 但是,如果我理解你的intnent,我认为最简单的解决办法是在这行代码添加:

ws.Select 

如下:

For Each ws In ActiveWorkbook.Worksheets 
    If (ws.Name <> "Sheet1") And (ws.Name <> "Sheet2") And (ws.Name <> "Sheet8") And (ws.Name <> "Sheet42") Then 

     ws.Select 

     With ws 
      'code 
      'Sheets("Formula").Select 
      Range("FormulaRow").Copy 

     ... 

,然后你也应该改变工作的事情例如从Range("FormulaRow").Copy.Range("FormulaRow").Copy,因此您一定要正确使用With声明。

希望是有道理的......

+0

哦,是的,这是回到我身边。不幸的是,FormulaRow是在不同的标签,并试图从不是Ws标签复制是让我绊倒。 – 2014-10-27 22:09:11

+0

通过添加ws.Select,它不会跳过我不想执行此操作的工作表。 – 2014-10-27 22:11:09

+0

它绝对看起来像您从未激活过任何工作表,因此即使您在后台循环访问WS Array,原始ActiveSheet仍保持不变。 您可能想要退出。在代码中选择.Copy,.Paste,然后直接设置值。它使得更多的工作,并看起来马虎,在后台激活闪烁的所有屏幕。只要发表声明。 表格(sheetname).Cells(iRow,iCol)=您想要设置的值 然后您可以使用iRow和iCol作为变量,并执行各种条件检查和循环。而不是宏观记录的ONE方式。 – peege 2014-10-27 22:12:22