【问题标题】:I am looking to combine multiple sheets into a single consolidated sheet我希望将多张工作表合并为一张合并工作表
【发布时间】:2018-04-04 21:42:28
【问题描述】:

想要创建一个宏来循环遍历工作簿中的所有工作表并从每个工作表中选择所有数据,然后将所述数据粘贴到“主”工作表上的单个合并表中。所有工作表都有相同的列标题到“AB”列。

目前尝试使用此代码,但我无法将任何内容粘贴到主工作表上。可能会过度考虑设置每个选项卡的范围。

只是寻找一个简单的解决方案来复制每个工作表中的所有活动数据并将其粘贴到一个工作表中,以便将其全部合并。

提前致谢!

Sub CombineData()
Dim wkstDst As Worksheet
Dim wkstSrc As Worksheet
Dim WB As Workbook
Dim rngDst As Range
Dim rngSrc As Range
Dim DstLastRow As Long
Dim SrcLastRow As Long

'Refrences
Set wkstDst = ActiveWorkbook.Worksheets("Master")


'Setting Destination Range
Set rngDst = wkstDst.Cells(DstLastRow + 1, 1)

'Loop through all sheets exclude Master
For Each wkstSrc In ThisWorkbook.Worksheets
   If wkstSrc.Name <> "Master" Then

        SrcLastRow = LastOccupiedRowNum(wkstSrc)
        With wkstSrc
            Set rngSrc = .Range(.Cells(2, 1), .Cells(SrcLastRow, 28))
            rngSrc.Copy Destination:=rngDst
        End With

        DstLastRow = LastOccupiedRowNum(wkstDst)
        Set rngDst = wkstDst.Cells(DstLastRow + 1, 1)

    End If

 Next wkstSrc


End Sub

【问题讨论】:

  • 单步调试代码并检查函数返回的值。您可能也想发布代码。您粘贴的单元格是否包含公式?
  • 你还没有给DstLastRow赋值
  • @chrisneilsen- uninitialised 它将为零,所以没关系。
  • 这似乎是一个重复的问题,SO Question

标签: excel vba


【解决方案1】:

加入另一种方法。这确实假设您正在复制的数据在 A 列中的行数与在任何其他列中的行数一样多。它不需要你的函数。

Sub CombineData()

Dim wkstDst As Worksheet
Dim wkstSrc As Worksheet
Dim rngSrc As Range

Set wkstDst = ThisWorkbook.Worksheets("Master")

For Each wkstSrc In ThisWorkbook.Worksheets
   If wkstSrc.Name <> "Master" Then
        With wkstSrc
            Set rngSrc = .Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp)).Resize(, 28)
            rngSrc.Copy Destination:=wkstDst.Cells(Rows.Count, 1).End(xlUp)(2)
        End With
    End If
Next wkstSrc

End Sub

【讨论】:

  • 很快就谈到了。似乎我有一些没有被复制的空白。我注意到如果我在单元格中放置一些字符,它就可以正常工作。
  • “一些空白”到底是什么意思?在哪里?
  • 在 A 列中有一个注释部分,用于每张表的第一张未输入注释的表,因此将大约 84 行留空。如果我在该行中输入一些内容并运行脚本,如果我不这样做,它就会将其拉过来。
  • 如果 A 列中有 20 行数据,那么即使中间有空白行,也会将 20 行复制到主工作表。您是说 A 列中没有数据但其他列中有数据的行?如果是这样,这与我上面的评论有关。
  • 啊,我明白了 - 我可能最终会重新排列列,以便 A 列是我的主要标识符。谢谢
【解决方案2】:

你从其他地方复制了这个,你忘记复制获取工作表最后一行的函数,即这个LastOccupiedRowNum

所以将这个函数添加到同一个模块中,代码应该可以工作。如果它确实有效,请不要忘记将其标记为正确答案:

Function LastOccupiedRowNum(Optional sh As Worksheet, Optional colNumber As Long = 1) As Long
    'Finds the last row in a particular column which has a value in it
    If sh Is Nothing Then
        Set sh = ActiveSheet
    End If
    LastOccupiedRowNum= sh.Cells(sh.Rows.Count, colNumber).End(xlUp).row
End Function

【讨论】:

  • 在 LastOccupiedRowNum 行中添加在测试时不起作用。因此,我将其替换为一组 28,因为每张纸的数据一直到 AB 列。
  • 您的问题是获取最后一行,此函数为您提供最后一行,当然,您可以将其包含在主子中,但不建议这样做。我确信我可以完成这项工作,但既然其他人回答并且你很高兴,那么我不会再做更多的工作了
  • 我认为我以一种通用的方式处理以前的脚本,最终以我认为的方式工作。感谢您查看此内容!
【解决方案3】:

尝试动态查找最后一行,而不是使用 .cells

Dim lrSrc as Long, lrDst as Long, i as Long
For i = 1 to Sheets.Count
    If Not Sheets(i).Name = "Destination" Then
        lrSrc = Sheets(i).Cells( Sheets(i).Rows.Count,"A").End(xlUp).Row
        lrDst = Sheets("Destination").Cells( Sheets("Destination").Rows.Count, "A").End(xlUp).Row
        With Sheets(i)
            .Range(.Cells(2,"A"), .Cells(lrSrc,"AB")).Copy Sheets("Destination").Range(Sheets("Destination").Cells(lrDst+1,"A"),Sheets("Destination").Cells(lrDst+1+lrSrc,"AB"))
        End With
    End If
 Next i

这应该替换您的 sub 和相关功能。

【讨论】:

  • PS:我假设 A 列在所有工作表中都是连续的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-13
  • 2012-12-15
相关资源
最近更新 更多