【问题标题】:Create loop index and copy data from index worksheets into Master创建循环索引并将索引工作表中的数据复制到 Master
【发布时间】:2014-01-15 01:14:02
【问题描述】:

我要做的是从所有工作表中复制可变数据范围,但标题相同,然后一个接一个地粘贴到主工作表中。每当我单击另一张工作表并返回主控时,原始代码(下面的代码 1)都会更新主控中的数据。现在的问题是工作簿中还有其他工作表我不想包含在复制过程中。

我已经编辑了下面收到的代码(下面的代码 2),以尝试定义开始和结束表以运行“循环索引”,并删除“复制标题”代码行,因为每个工作表的标题都出现在整个过程中母版。显然它不起作用,我想知道是否有人可以提供帮助。

您能帮我更正合并后的代码或提供更优雅的解决方案吗?谢谢。

这里的原始问题 - Excel Forum post

此处的辅助代码 - Stack post LoopIndex

原始代码 1

Private Sub Worksheet_Activate()
Dim ws As Worksheet

Application.ScreenUpdating = False
Me.UsedRange.Clear

For Each ws In ThisWorkbook.Worksheets
If ws.Name <> Me.Name Then
    If Range("A1") = "" Then ws.Range("A1").EntireRow.Copy Me.Range("A1")'copy in the headers
    ws.UsedRange.Offset(1).Copy Me.Range("A" & Rows.Count).End(xlUp).Offset(1)'copy data
End If
Next ws

Application.ScreenUpdating = True
End Sub

编辑代码 2

Private Sub Worksheet_Activate()
Dim ws As Worksheet

Application.ScreenUpdating = False
Me.UsedRange.Clear

Dim StartIndex, EndIndex, LoopIndex As Integer
   StartIndex = Sheets("Master sheet").Index + 1
   EndIndex = Sheets("End").Index - 1

For LoopIndex = StartIndex To EndIndex

    If Range("A1") = "" Then ws.Range("A1").Offset(1).Copy Me.Range("A" &Rows.Count).End(xlUp).Offset(1)  'copy data
Next LoopIndex

Application.ScreenUpdating = True
End Sub

【问题讨论】:

  • 基本上,您只是想将跨工作表的数据块合并到主表中,是吗?您不想定位的工作表的名称是什么?
  • 表格将是月份的名称(Jan、Feb、Mar、Apr、May...),但这些将随着时间的推移而添加,我不确定我们是否会开始一个新文件当财政年度结束时......这就是为什么我想让代码“在'主表'和'结束'之间的表上执行代码

标签: vba excel copy


【解决方案1】:

当只有一个源工作表时,我几乎可以理解为什么您将其作为针对工作表“主列表”的工作表激活事件例程。当您有多个源工作表时,我很难将其视为方便。我不是要你证明你的决定是正确的,因为我对工作簿没有完全了解,但你可能想重新考虑你的方法。我已将下面的例程编码为普通宏,但您可以根据需要轻松更改。

我不喜欢假设要加载的工作表是从Sheets("Master sheet").Index + 1Sheets("End").Index - 1 的方法。尽管我从未尝试过这种方法,但我会认为这是不稳定的。

我创建了一个隐藏的工作表“加载列表”:

这会按要加载的顺序列出要加载的工作表。

我已经用数据填写了工作表“Sheet1”:

不是很有想象力的数据,但它可以很容易地检查“主列表”是否加载了正确的数据。工作表“Sheet2”到“Sheet5”具有相似的数据,只是数据行数不同,并且“S1”被“S2”、“S3”、“S4”和“S5”替换。

宏运行后,“主列表”顶部包含:

您可以看到我已经加载了第一个工作表中的所有行,然后只加载了后续工作表中的数据行。

关于我使用的 VBA,我并没有说太多。一旦你知道一个语句存在,通常很容易查找它。必要时询问。我希望我已经对代码的作用提供了充分的解释。有需要再问。

Option Explicit
Sub CombinedSelected()

  Dim ColSrcMax As Long
  Dim LoadList As Variant
  Dim RowListCrnt As Long
  Dim RowListMax As Long
  Dim RowMasterNext As Long
  Dim RowSrcMax As Long

  With Worksheets("Load List")
    RowListMax = .Cells(Rows.Count, "A").End(xlUp).Row
    ' Load the values from column A of worksheet "Load List" to LoadList.
    ' The statement converts LoadList to a 2 dimensional array. It is the
    ' equivalent of Redim LoadList(1 To RowListMax, 1 to 1)
    LoadList = .Range(.Cells(1, "A"), .Cells(RowListMax, "A")).Value
  End With

  RowMasterNext = 1

  With Worksheets("Master sheet")
    .Cells.EntireRow.Delete     ' Delete existing contents
  End With

  For RowListCrnt = 2 To RowListMax
    With Worksheets(LoadList(RowListCrnt, 1))
      ' Find last used row and column containing a value.
      ' Warning.  These statements do not allow for any of the source worksheets being empty
      RowSrcMax = .Cells.Find("*", .Range("A1"), xlFormulas, , xlByRows, xlPrevious).Row
      ColSrcMax = .Cells.Find("*", .Range("A1"), xlFormulas, , xlByColumns, xlPrevious).Column
      If RowListCrnt = 2 Then
        ' For first source worksheet only include header row
        .Range(.Cells(1, 1), .Cells(RowSrcMax, ColSrcMax)).Copy _
               Destination:=Worksheets("Master sheet").Cells(RowMasterNext, 1)
        RowMasterNext = RowMasterNext + RowSrcMax
      Else
        ' Data rows only to be copied
        .Range(.Cells(2, 1), .Cells(RowSrcMax, ColSrcMax)).Copy _
               Destination:=Worksheets("Master sheet").Cells(RowMasterNext, 1)
        RowMasterNext = RowMasterNext + RowSrcMax - 1
      End If
    End With
  Next

End Sub

【讨论】:

  • 非常感谢您的努力 - 这看起来很棒。所以它工作正常,我是否必须自己填充加载列表,每次添加新工作表时是否需要添加此工作表名称?
  • 是的,您必须维护工作表“加载列表”。这是一项额外的工作,但意味着要组合的工作表和组合的顺序由您完全控制。用户不能通过移动工作表来干扰,这并不难做到。如果工作表“加载列表”被隐藏,除了你需要知道它的存在之外没有人知道。
  • 谢谢托尼,我会试一试 - 再次感谢您的帮助!
  • 嗨,托尼 - 我按照您上面的指示在测试工作表中修复了所有问题,然后点击“运行”,它就像做梦一样!我确实注意到所有工作表的标题都被复制了。查看已将月份输入到单元格 A1 中的每张表 - 所以我从所有相关表中删除了这一行。然后我关闭了编辑器并像往常一样使用它,在工作表之间切换以查看它是否会更新 - 但它没有。当我从主表中进行选择时,我还需要做些什么来让它运行吗?
  • 我假设你只有一个标题行。对不起。您可以轻松地将Else 代码更改为从第 3 行开始,而不是从第 2 行开始。我例程我发布它不是 Worksheet_Activate 事件例程。如果你愿意,你可以改变它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-28
  • 1970-01-01
  • 1970-01-01
  • 2018-12-19
  • 1970-01-01
相关资源
最近更新 更多