我有一本包含大约14个工作表的工作簿。选定的工作表集包含将要更新的数据。他们需要为用户保持分离。
为了总结这些数据以生成报告,我需要将所有数据表(所有数据均采用相同的格式)合并为一个用于最终的汇总计算(因此=AVERAGEIFS
函数可以工作,其他一些手工计算平均公式会更准确)。
我想用两种方法中的任何一种解决问题:
组合数据表是否分别参考数据表中的每个单元格。我的公式为=Sheet1!A1
。
问题是,如果原始数据表中的任何行被删除,将导致组合数据表上的计算错误。
我看到了=INDIRECT("Sheet!A1")
的建议,但这不会在工作表的上下填写正确,这意味着我必须单独更新大约40K的单元格。
一个宏或一组自动获取数据的公式(我不希望对宏有一个运行命令)。
宏/公式的设计是从选定的工作表中拾取每一行,一旦它到达第一个空白行就会停止并移动到下一个选定的工作表,如循环。
关于如何实现这一目标的任何其他建议也将受到欢迎。
答案 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;在引号内更改为您想要的名称。
我希望这次对你有效:)