将数据表自动合并到一个工作表上

希望我能得到一些帮助,结合从不同的工作表的数据到一个自动请。

我目前有一个约14个不同的工作表的工作簿。 在选定的一组工作表中,包含将相应更新的数据 – 它们需要保持与用户分开。

为了能够汇总这些数据以生成一个特定的报告,我需要把所有的数据表(全都用相同的格式)合并成一个用于最终的汇总计算(这样=AVERAGEIFS函数可以工作,而其他的手工计算平均公式会更准确)。

目前我正在考虑用两种方法中的任何一种来解决问题:

  1. 将组合数据表分别引用数据表中的每个单元格。 我目前的公式是=Sheet1!A1

    这个公式的问题是,如果原始数据表中的任何行被删除(很有可能),这将导致组合数据表上的计算错误。

    然后,我看到了=INDIRECT("Sheet!A1") ,但是这不会在工作表中正确填写,这意味着我必须单独更新大约40K个单元格。

  2. 我在想的另一种方法是使用一个macros或一组公式将自动获取数据(我不希望有一个macros的运行命令)。

    macros/公式的devise是从选定的工作表中拾取每一行,并在它遇到第一个空白行并移到下一个选定的工作表(如循环)时停止。

对于我可怜的解释抱歉 – 任何其他关于我如何能够实现这一点的build议也将非常受欢迎。

提前谢谢了。

 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 

这将为您带来数据的所有行,直到每个工作表的第一个空白行(当然,忽略合并数据的行),并将它们连续粘贴到“组合数据表”中。

如有必要,更改“组合数据表”工作表的名称。

注意:如果第一行是空白的,则不会从该工作表中检索到数据。

希望这可以帮助!

编辑

好吧,如果我理解正确,每当任何其他数据表中的值发生更改时,都希望刷新合并表中的数据。 因此,为了在每个工作表中使用下面的代码来检索数据(我猜你提到了7个工作表):

 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 

关于你得到的错误,我想这是因为你没有改变合并信息的工作表的名字。 您需要将名称更改为“组合数据表”(不带引号),以便可以使用我编写的代码,也可以直接转到代码并将名称更改为您自己select的名称当你看到“合并数据表”的变化到你想要的名字内引号)。

我希望这会正确地工作,这次给你:)