将数据表合并到一张工作表上

Consolidation of data sheets onto one worksheet

我有一本工作簿,大约有 14 个作品sheet。一组选定的工作 sheet 包含将要更新的数据。他们需要为用户保持分开。

要汇总这些数据以生成报告,我需要将所有数据 sheet 合并为一个数据以进行最终汇总计算(因此 =AVERAGEIFS 函数可以工作,其他一些手动计算的平均公式会更准确)。

我正在考虑使用以下两种方法之一来解决问题:

  1. 让组合数据sheet 分别引用数据 sheet 上的每个单元格。我的公式是 =Sheet1!A1.

    问题是,如果原始数据sheet上的任何行被删除,将导致合并数据sheet的计算错误。

    我看到了 =INDIRECT("Sheet!A1") 的建议,但是这不会在整个工作中正确填充 sheet,这意味着我将不得不单独更新大约 40K 个单元格。

  2. 一个宏或一组自动获取数据的公式(我不希望宏有一个 运行 命令)。

    macro/formula 的设计是从所选作品sheet 中选取每一行,一旦遇到第一个空白行就停止并移动到下一个所选作品sheet , 就像一个循环。

也非常欢迎关于如何实现这一目标的任何其他建议。

Sub combineDatasheets()

Dim sh As Worksheet

For Each sh In Sheets

    If sh.Name <> "Combined datasheet" Then

        a = sh.Cells(1, 1).End(xlDown).Row 'count rows untill blank

        b = Sheets("Combined datasheet").Cells(1, 1).End(xlDown).Row 'last row with data

            'find if there's any data already in "Combined datasheet" by looking at cell A1
            If Sheets("Combined datasheet").Cells(1, 1).Value = "" Then
                b = 0
            End If

        sh.Rows("1:" & a).Copy Destination:=Sheets("Combined datasheet").Range("A" & b + 1)

    End If

Next sh


End Sub

这将为您提供所有包含数据的行,直到每项工作的第一个空白行sheet(当然忽略您正在合并数据的行)并将它们粘贴到"Combined datasheet"连续。

根据需要更改 "Combined datasheet" 作品的名称sheet。

注意:如果第一行为空,则不会从该作品中检索任何数据sheet。

希望对您有所帮助!

编辑:

好的,如果我没理解错的话,您希望每当任何其他数据sheet 中的值发生变化时,您都希望刷新合并sheet 中的数据。 因此,为此,在您要从中检索数据的每个作品 sheet 中使用以下代码(我猜您提到的 7 个作品sheet):

Private Sub Worksheet_Change(ByVal Target As Range)

    Call combineDatasheets

End Sub

现在下面的代码进入一个模块(VBA->Insert->Module):

Sub combineDatasheets()

Dim sh As Worksheet

'Clear data in "Combined datasheet"
c = Sheets("Combined datasheet").Cells(1, 1).End(xlDown).Row
Sheets("Combined datasheet").Range("A1:A" & c).EntireRow.ClearContents


For Each sh In Sheets

    If sh.Name <> "Combined datasheet" Then

        a = sh.Cells(1, 1).End(xlDown).Row 'count rows untill blank

        'fix error when there's only 1 row with data
            If sh.Cells(2, 1).Value = "" Then
                a = 1
            End If


        b = Sheets("Combined datasheet").Cells(1, 1).End(xlDown).Row 'last row with data

            'find if there's any data already in "Combined datasheet" by looking at cell A1
            If Sheets("Combined datasheet").Cells(1, 1).Value = "" Then
                b = 0
                Else
                'fix error when "Combined datasheet" worksheet has only one row with data
                If Sheets("Combined datasheet").Cells(2, 1).Value = "" Then
                    b = 1
                End If
            End If


        sh.Rows("1:" & a).Copy Destination:=Sheets("Combined datasheet").Range("A" & b + 1)

    End If

Next sh

End Sub

关于您遇到的错误,我认为是因为您没有更改合并信息的作品sheet的名称。您需要将名称更改为 "Combined datasheet"(不带引号)以便它可以与我编写的代码一起使用,或者您直接转到代码并将其中的名称更改为您自己选择的名称之一(每次看到 "Combine datasheet" 在引号内更改为您想要的名称时)。

我希望这一次对你能正常工作:)