[英]Excel: Populate Data Across Multiple Worksheets
Unfortunately for my employer, none of my network engineering courses included advanced Excel formula programming. 不幸的是,对于我的雇主,我的网络工程课程都没有包括高级Excel公式编程。 Needless to say, I know nothing about Excel save for basic SUM and COUNT formula commands. 不用说,我对基本的SUM和COUNT公式命令的Excel保存一无所知。
My employer has an Excel workbook with multiple worksheets within it representing each month of the calendar year. 我的雇主有一个Excel工作簿,其中包含多个工作表,代表日历年的每个月。 We want to be able to have a "total" worksheet in the workbook that reflects all data across the entire workbook in each column/row. 我们希望能够在工作簿中创建一个“总计”工作表,以反映每个列/行中整个工作簿中的所有数据。
An example for the sake of clarity: 为清晰起见的一个例子:
In the worksheet "May_2013", column A is labeled "DATE". 在工作表“May_2013”中,A列标记为“DATE”。 Cell A2 contains the data "MAY-1". 单元格A2包含数据“MAY-1”。
In the worksheet "June_2013", column A is labeled "DATE". 在工作表“June_2013”中,A列标记为“DATE”。 Cell A2 contains the data "JUNE-1". 单元格A2包含数据“JUNE-1”。
In the worksheet "Total", column A is labeled "DATE". 在工作表“总计”中,列A标记为“日期”。 We want cells A2 to reflect "MAY-1" and A3 to reflect "JUNE-1". 我们希望单元格A2反映“MAY-1”,A3则反映“JUNE-1”。
We want to do this for all worksheets, columns AQ, rows 2-33 and populate a master sheet at the very end containing all data in all worksheets in their corresponding columns. 我们希望对所有工作表,列AQ,第2-33行执行此操作,并在最后填充主表,其中包含相应列中所有工作表中的所有数据。
Is this possible? 这可能吗?
Here are two VBA solutions. 这是两个VBA解决方案。 The first does this: 第一个做到这一点:
The second shows how to do some manipulation of the column data before copying: for each column it applies the WorksheetFunction.Sum()
, but you could replace that with any other aggregating function that you would like to use. 第二个展示了如何在复制之前对列数据进行一些操作:对于每个列,它应用WorksheetFunction.Sum()
,但是您可以将其替换为您要使用的任何其他聚合函数。 It then copies the result (one row per sheet) to the "totals" sheet. 然后它将结果(每张一行)复制到“总计”表。
Both solutions are in the workbook you can download from this site . 这两种解决方案都在您可以从此站点下载的工作簿中。 Run the macros with , and pick the appropriate one from the list of options that shows up. 使用,运行宏,并从显示的选项列表中选择适当的宏。 You can edit the code by invoking the VBA editor with . 您可以通过调用VBA编辑器来编辑代码。
Sub aggregateRaw()
Dim thisSheet, newSheet As Worksheet
Dim sheetCount As Integer
Dim targetRange As Range
sheetCount = ActiveWorkbook.Sheets.Count
' add a new sheet at the end:
If Not worksheetExists("totals") Then
Set newSheet = ActiveWorkbook.Sheets.Add(after:=Sheets(sheetCount))
newSheet.Name = "totals"
Else
Set newSheet = ActiveWorkbook.Sheets("totals")
End If
Set targetRange = newSheet.[A1]
' if you want to clear the sheet before copying data, uncomment this line:
' newSheet.UsedRange.Delete
' assuming you want to copy the headers, and that they are the same
' on all sheets, you can copy them to the "totals" sheet like this:
ActiveWorkbook.Sheets(1).Range("1:1").Copy targetRange
Set targetRange = targetRange.Offset(1, 0) ' down a row
' copy blocks of data from A2 to Q33 into the "totals" sheet
For Each ws In ActiveWorkbook.Worksheets
If ws.Name <> newSheet.Name Then
ws.Range("A2", "Q33").Copy targetRange
Set targetRange = targetRange.Offset(32, 0) ' down 32 rows
End If
Next ws
End Sub
Sub aggregateTotal()
Dim thisSheet, newSheet As Worksheet
Dim sheetCount As Integer
Dim targetRange As Range
Dim columnToSum As Range
sheetCount = ActiveWorkbook.Sheets.Count
' add a new sheet at the end:
If Not worksheetExists("totals") Then
Set newSheet = ActiveWorkbook.Sheets.Add(after:=Sheets(sheetCount))
newSheet.Name = "totals"
Else
Set newSheet = Sheets("totals")
End If
' assuming you want to copy the headers, and that they are the same
' on all sheets, you can copy them to the "totals" sheet like this:
Set targetRange = newSheet.[A1]
ActiveWorkbook.Sheets(1).Range("A1:Q1").Copy targetRange
Set targetRange = targetRange.Offset(1, 0) ' down a row
For Each ws In ActiveWorkbook.Worksheets
' don't copy data from "total" sheet to "total" sheet...
If ws.Name <> newSheet.Name Then
' copy the month label
ws.[A2].Copy targetRange
' get the sum of the coluns:
Set columnToSum = ws.[B2:B33]
For colNum = 2 To 17 ' B to Q
targetRange.Offset(0, colNum - 1).Value = WorksheetFunction.Sum(columnToSum.Offset(0, colNum - 2))
Next colNum
Set targetRange = targetRange.Offset(1, 0) ' next row in output
End If
Next ws
End Sub
Function worksheetExists(wsName)
' adapted from http://www.mrexcel.com/forum/excel-questions/3228-visual-basic-applications-check-if-worksheet-exists.html
worksheetExists = False
On Error Resume Next
worksheetExists = (Sheets(wsName).Name <> "")
On Error GoTo 0
End Function
Final(?) edit: If you want this script to run automatically every time someone makes a change to the workbook, you can capture the SheetChange
event by adding code to the workbook. 最终(?)编辑:如果您希望每次有人对工作簿进行更改时自动运行此脚本,您可以通过向工作簿添加代码来捕获SheetChange
事件。 You do this as follows: 你这样做如下:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
' handle errors gracefully:
On Error GoTo errorHandler
' turn off screen updating - no annoying "flashing"
Application.ScreenUpdating = False
' don't respond to events while we are updating:
Application.EnableEvents = False
' run the same sub as before:
aggregateRaw
' turn screen updating on again:
Application.ScreenUpdating = True
' turn event handling on again:
Application.EnableEvents = True
Exit Sub ' if we encountered no errors, we are now done.
errorHandler:
Application.EnableEvents = True
Application.ScreenUpdating = True
' you could add other code here... for example by uncommenting the next two lines
' MsgBox "Something is wrong ... " & Err.Description
' Err.Clear
End Sub
Kindly use RDBMerge add-in which will combine the data from different worksheet and create a master sheet for you. 请使用RDBMerge加载项,它将组合来自不同工作表的数据并为您创建主表。 Please see the below link for more details. 有关详细信息,请参阅以下链接。
http://duggisjobstechnicalstuff.blogspot.in/2013/03/how-to-merge-all-excel-worksheets-with.html http://duggisjobstechnicalstuff.blogspot.in/2013/03/how-to-merge-all-excel-worksheets-with.html
You can use the indirect function to reference the sheet name. 您可以使用间接功能来引用工作表名称。 In the image below this function takes the header name (B37) and uses it as the sheet reference. 在下图中,此功能采用标题名称(B37)并将其用作图纸参考。 All you have to do is choose the correct "total cell" which I made "A1" in "MAY_2013". 你所要做的就是选择正确的“总细胞”,我在“MAY_2013”中制作了“A1”。 I put an image below to show you my reference name as well as tab name 我在下面放了一个图像,显示我的参考名称和标签名称
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.