0

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

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

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

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

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

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

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

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

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

4

1 回答 1

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

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

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

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

希望这可以帮助!

编辑

好的,如果我理解正确,您希望在任何其他数据表中的值发生变化时刷新合并表中的数据。因此,为此在您要从中检索数据的每个工作表中使用以下代码(我猜是您提到的 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

关于您遇到的错误,我认为这是因为您没有更改整合信息的工作表的名称。您需要将名称更改为“组合数据表”(不带引号),以便它可以与我编写的代码一起使用,或者您直接转到代码并将其中的名称更改为您自己的选择之一(每个当您看到“组合数据表”更改为引号内所需的名称时)。

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

于 2016-09-09T11:02:59.743 回答