【问题标题】:Personal Macro Not Looping in Different Workbooks个人宏不在不同的工作簿中循环
【发布时间】:2017-01-30 17:11:16
【问题描述】:

我的问题是遍历工作簿中的多个工作表。

我需要将宏保存在我的个人工作簿中,但如果我这样做,它会遍历同一个工作表,直到达到工作表数。

如果我将代码移动到当前工作簿,它会很好地工作。我研究过编写一个宏来将模块从个人工作簿复制到当前工作簿,但对于其他用户来说,这个模块将简单地保存在另一个仅在后台打开以运行模块的工作簿中。

当代码保存到我的个人工作簿中的一个模块中,或者只是保存在另一个在后台打开的工作簿中时,我如何让这个循环遍历另一个工作簿中的所有工作表?

代码如下:

Sub WorksheetLoop()

  ' Loop Through Worksheets, Add Totals

Dim LastRow As Long
Dim ws As Worksheet
Dim starting_ws As Worksheet
Set starting_ws = ActiveSheet

  ' Loop Sum Formula Through All Worksheets

  For Each ws In ThisWorkbook.Worksheets
  ws.Activate

  'Now my code, the do something, (I have simplified this part since this _
   works, its the loop that's broken)

   'Insert new blank rows
  Rows("1:6").Select
  Selection.Insert Shift:=xlDown

   'Got to next worksheet, but it will not!
  Next

End Sub

【问题讨论】:

  • 尝试将 For Each ws In ThisWorkbook.Worksheets 更改为 For Each ws In ActiveWorkbook.Worksheets。如果您希望它在用户打开的工作簿中运行,而不是在存储宏的工作簿中运行。
  • 我仍然遇到同样的问题。它似乎可以识别当前工作簿并识别当前工作表,因为它循环了 9 次,这是工作簿中有多少张工作表,但它不会循环遍历每个工作表。
  • 您是否尝试过从全新的工作簿运行宏,以查看它是否特定于您要使用的工作簿?
  • 我有。事实上,每次我下载新数据时,它总是一个新的工作簿。它的第一个 CSV 格式,我在那里尝试过,然后保存为启用宏的 xlsx 格式,仍然是同样的问题。
  • 我的意思只是打开一个新工作簿而不导入任何数据,只是为了查看它是否循环通过 3 个默认工作表并最终出现在 Sheet3 上。我问的原因是因为 Vinnie 和我自己都在运行代码并获得预期结果并非巧合。我们都没有您的数据,也没有任何额外的代码,除了激活每张工作表以检查它是否在正确的工作簿上执行此操作外,我没有让它做任何事情。有时,当事情不正常时,您需要将其剥离为基础并重新构建。

标签: excel vba loops for-loop


【解决方案1】:

这段代码的逻辑有点不同,如果可行的话试试看:

   Sub WorksheetLoop()

      ' Loop Through Worksheets, Add Totals

    Dim LastRow As Long
    Dim ws As Worksheet
    Dim starting_ws As Worksheet
    Dim path As String
    Dim WorkingFile As Workbook
      ' Select the file you will manipulate to surely be in the correct WB.
    path = Application.GetOpenFilename(FileFilter:="Excel Files (*.*), *.*", Title:="Please select a file you want to modify")
    Workbooks.Open path
    Set WorkingFile = ActiveWorkbook

      For Each ws In WorkingFile.Worksheets
      ws.Rows("1:6").Insert Shift:=xlDown

      'Rest of the code
      Next
 End Sub

【讨论】:

  • 谢谢维尼,还是没有运气。我实际上是从使用“ActiveWorkbook.Worksheets”开始的,但仍然没有成功。它识别打开的工作表的数量,并运行多次,但永远不会更改它所在的工作表并一遍又一遍地在同一个工作表上运行,直到达到工作表计数。我正在疯狂地试图让它正确循环,而不必将代码直接实现到活动工作簿。
  • 在即时窗口中尝试debug.print ws.name 以检查哪个工作表处于活动状态。
  • 好的,我得到了这个调试来显示它在哪个工作表中。我没有找对地方。奇怪的是,它在同一个工作表中循环循环,但调试注册不同的工作表名称,就好像它认为它在不同的工作表中一样。这是如何或为什么会发生的,我怎样才能让它真正循环遍历每一个而不只是认为它是?
  • 另外,如果将模块从我的个人工作簿移动到实际工作簿,它会按顺序注册工作表名称,而不管实际选择了哪个工作表。尽管如此,它实际上还是适当地遍历了每个工作表。
  • 您好 Vinnie,很遗憾,仍然没有成功!我正要举起双手说算了。老实说,我不知道我做错了什么,并且提供的每个解决方案都会产生相同的结果。我在这里不知所措。感谢您提供的所有帮助。如果我找到解决方案,我一定会在这里更新。我敢打赌这将是一件超级简单的事情!
【解决方案2】:

这是工作代码,现在将其与最初发布的代码进行比较。

再次感谢维尼和戈登!

Sub Step_3_Add_Subtotals()

' Loop Through Worksheets, Add Totals

Dim LastRow As Long
Dim ws As Worksheet
Dim starting_ws As Worksheet
Set starting_ws = ActiveSheet

' Loop Sum Formula Through All Worksheets


For Each ws In ActiveWorkbook.Worksheets
ws.Activate

  'Now my code, the do something

'Insert new blank rows

Rows("1:6").Select
Selection.Insert Shift:=xlDown

'Copy current headers, paste them in K3:Q3
Range("K7:Q7").Select
Selection.Copy
Range("K3").Select
ActiveSheet.Paste


'Got to next worksheet, and now it does!

Next

starting_ws.Activate

End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-11
    相关资源
    最近更新 更多