【问题标题】:Copying Dynamic Range of Sheets to a Single Sheet将工作表的动态范围复制到单个工作表
【发布时间】:2017-06-21 18:52:27
【问题描述】:

我正在尝试将不同工作表上的多个不同部件列表合并到一个主列表中。

问题是,有时,例如,主框架零件或装饰零件将有多个板材(例如 Main frame、Main frame (2)、Trim、Trim (2)、Trim (3) 等)用于不同的部分。

所以我不能像我之前认为的那样对值进行硬编码,因为每个工作簿的工作表数量不同。我从中复制的第一张工作表和我从中复制的最后一张工作表是相同的,但是根据工作簿,它们可能是之前的工作表,并且总是之后的工作表,我不想包括在内,所以我不能倒数最后一张纸或始终从第一张纸开始。

我不是 VBA 专家,它似乎足够强大来处理我的问题,我只是不知道如何具体解决它。

我已将逻辑附加到我目前用于将所有工作表连接为一个的代码中,但它的动态性不足以适用于每种情况。 (也为风格不佳感到抱歉)

我们将不胜感激任何帮助或只是正确方向的一点。

    On Error Resume Next
Sheets(1).Select
Worksheets.Add
Sheets(1).Name = "Master"
Sheets(2).Activate
' Add copy logo once here.

Range("A6").EntireRow.Select
Selection.Copy Destination:=Sheets(1).Range("A1").End(xlUp)(1)
For j = 2 To 13 ' Range of sheets
Sheets(j).Activate
Range("A6").Select
Selection.CurrentRegion.Select

' Adjust here to eliminate header but include 2 rows below it
Selection.Offset(5, 0).Resize(Selection.Rows.Count - 5).Select
Selection.Copy Destination:=Sheets(1).Range("A65536").End(xlUp)(6)
Next

Sheets(1).Activate
Range("A1:O1").Select
Range("O1").Activate
Selection.Delete Shift:=xlUp
Range("O10").Select

Range("A1:O4").Select
Range("O4").Activate
Selection.Delete Shift:=xlUp

【问题讨论】:

  • 那么您在不同的工作簿中使用的这段代码,但它们有不同数量的工作表吗?
  • 是的。它一次只应用于一个工作簿以组合该工作簿中的工作表,但我希望它能够在不同的工作簿上工作,但我上面提到的可能会有细微的变化。
  • 那么您希望它能够运行超过 12 个工作表/少于 12 个工作表,还是希望它跳过某些工作表?
  • 是的。超过 12 个,可能少于 12 个。我希望它能够在开始或结束时跳过工作表。它将复制的第一张纸将始终与它将复制的最后一张纸同名。但是有可能在它之前有不同的命名表,而在它之后几乎总是有我不想包含的表
  • 我已经用你的新代码块编辑了我的帖子,我认为我已经正确地编辑了它,但是由于全新的代码改造,我现在有点迷茫,所以请原谅任何错误的编译错误...

标签: vba excel


【解决方案1】:

试试这个。这将循环遍历工作表,直到看到第一张工作表,然后开始循环遍历所有工作表,直到完成最后一张工作表,然后停止运行。只需将工作表名称放在那里即可。

Dim ws_count As Integer
Dim j as integer
Dim k as integer
ws_count = ActiveWorkbook.Worksheets.Count

For k = 1 to ws_count
    If Sheets(k).Name = "FirstSheet" Then
        For j = k to ws_count
            Sheets(j).Activate
            Range("A6").Select
            Selection.CurrentRegion.Select

            ' Adjust here to eliminate header but include 2 rows below it
            Selection.Offset(5, 0).Resize(Selection.Rows.Count - 5).Select
            Selection.Copy Destination:=Sheets(1).Range("A65536").End(xlUp)(6)
            If Sheets(j).Name = "LastSheet" Then
                Exit For 
            End If
        Next j
    Exit For
    End If
Next k

【讨论】:

  • 看起来对我有用,但出现错误。编译错误:对于已在使用的控制变量。你不能在 VBA 中嵌套 for 循环吗?
  • 哎呀,你可以,我不小心使用了两次 k。换了j,现在试试-
  • 抱歉,我想我复制了错误的代码块。我刚刚编辑了帖子以包含选择表格并将它们粘贴到新工作表的准确块。您的解决方案仍然适用于该代码吗?再次,对不起!!非常感谢您的回复。
  • 我最初提供的代码遍历每张纸并添加了两列。现在发布的部分将每个工作表的列表复制到主列表。
  • Sheets(1) 是否仍将是主工作表,还是现在也需要更改?
猜你喜欢
  • 1970-01-01
  • 2016-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多