将数据表合并到一张工作表上
Consolidation of data sheets onto one worksheet
我有一本工作簿,大约有 14 个作品sheet。一组选定的工作 sheet 包含将要更新的数据。他们需要为用户保持分开。
要汇总这些数据以生成报告,我需要将所有数据 sheet 合并为一个数据以进行最终汇总计算(因此 =AVERAGEIFS
函数可以工作,其他一些手动计算的平均公式会更准确)。
我正在考虑使用以下两种方法之一来解决问题:
让组合数据sheet 分别引用数据 sheet 上的每个单元格。我的公式是 =Sheet1!A1
.
问题是,如果原始数据sheet上的任何行被删除,将导致合并数据sheet的计算错误。
我看到了 =INDIRECT("Sheet!A1")
的建议,但是这不会在整个工作中正确填充 sheet,这意味着我将不得不单独更新大约 40K 个单元格。
一个宏或一组自动获取数据的公式(我不希望宏有一个 运行 命令)。
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" 在引号内更改为您想要的名称时)。
我希望这一次对你能正常工作:)
我有一本工作簿,大约有 14 个作品sheet。一组选定的工作 sheet 包含将要更新的数据。他们需要为用户保持分开。
要汇总这些数据以生成报告,我需要将所有数据 sheet 合并为一个数据以进行最终汇总计算(因此 =AVERAGEIFS
函数可以工作,其他一些手动计算的平均公式会更准确)。
我正在考虑使用以下两种方法之一来解决问题:
让组合数据sheet 分别引用数据 sheet 上的每个单元格。我的公式是
=Sheet1!A1
.问题是,如果原始数据sheet上的任何行被删除,将导致合并数据sheet的计算错误。
我看到了
=INDIRECT("Sheet!A1")
的建议,但是这不会在整个工作中正确填充 sheet,这意味着我将不得不单独更新大约 40K 个单元格。一个宏或一组自动获取数据的公式(我不希望宏有一个 运行 命令)。
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" 在引号内更改为您想要的名称时)。
我希望这一次对你能正常工作:)