【问题标题】:Loop to go through each worksheet in workbook循环浏览工作簿中的每个工作表
【发布时间】:2014-12-23 05:04:52
【问题描述】:

我正在尝试遍历工作簿中的每个工作表,但它不起作用。我认为这是 ActiveWorkbook.Worksheets 无法识别每个工作表并且仅在活动工作表上运行。任何建议都会很棒!我确定这是一个基本修复,但似乎无法弄清楚。谢谢!

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

【问题讨论】:

  • “我认为是 ActiveWorkbook.Worksheets 无法识别每个工作表”:最好有一个可以解释问题的理论。为什么不在循环中添加一些代码来显示 ActiveSheet 在每次迭代中是否实际发生了变化?
  • 我可以看到它在每次迭代中都没有改变,这就是我这么想的原因。谢谢。

标签: vba loops excel worksheet


【解决方案1】:

对于With 语句,每次您希望使用. 引用该对象时都需要继续,以便按照您的意图使用它。 但是,如果我理解你的意图,我认为最简单的解决方案是添加这行代码:

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 语句。

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

【讨论】:

  • 哦,是的,我又回来了。不幸的是,FormulaRow 位于不同的选项卡上,并且尝试从 ws 选项卡以外的地方进行复制让我感到困惑。
  • 通过添加 ws.Select,它不会跳过我不想执行操作的工作表。
  • 看起来您肯定从未激活过任何工作表,因此即使您在后台循环遍历 WS 数组,原始的 ActiveSheet 仍然保持不变。您可能希望摆脱代码中的 .Select、.Copy、.Paste,而直接设置值。它做更多的工作,看起来很草率,所有的屏幕都在后台闪烁。只是发表声明。 Sheets(sheetname).Cells(iRow, iCol) = VALUE YOU WANT TO SET 然后您可以使用 iRow 和 iCol 作为变量,并执行各种条件检查和循环。而不是宏记录的一种方式。
  • 如果公式行在不同的工作表上。指定它。 Sheets("FormulaSheet").Range("FormulaRow")
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-15
  • 1970-01-01
  • 2018-05-27
  • 1970-01-01
  • 2020-07-08
  • 2018-01-04
  • 2016-05-26
相关资源
最近更新 更多