将数据表合并到一个工作表

时间:2016-09-09 00:43:47

标签: excel vba formula consolidation

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

为了总结这些数据以生成报告,我需要将所有数据表(所有数据均采用相同的格式)合并为一个用于最终的汇总计算(因此=AVERAGEIFS函数可以工作,其他一些手工计算平均公式会更准确)。

我想用两种方法中的任何一种解决问题:

  1. 组合数据表是否分别参考数据表中的每个单元格。我的公式为=Sheet1!A1

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

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

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

    宏/公式的设计是从选定的工作表中拾取每一行,一旦它到达第一个空白行就会停止并移动到下一个选定的工作表,如循环。

  3. 关于如何实现这一目标的任何其他建议也将受到欢迎。

1 个答案:

答案 0 :(得分:1)

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

这将为您提供包含数据的所有行,直到每个工作表中的第一个空白行(当然忽略合并数据的那一行)并将其粘贴到&#34;组合数据表&#34;连续。

更改&#34;组合数据表的名称&#34;工作表,如有必要。

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

希望这有帮助!

修改

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

Private Sub Worksheet_Change(ByVal Target As Range)

    Call combineDatasheets

End Sub

现在,以下代码转到模块(VBA-&gt; Insert-&gt; 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

关于您收到的错误,我认为这是因为您还没有更改合并信息的工作表的名称。您需要将名称更改为&#34;组合数据表&#34; (没有引号)因此它可以使用我编写的代码,或者直接转到代码并将其中的名称更改为您自己选择的名称(每次您看到&#34;组合数据表&# 34;在引号内更改为您想要的名称。

我希望这次对你有效:)