简体   繁体   English

Excel:跨多个工作表填充数据

[英]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: 第一个做到这一点:

  1. Check if a sheet "totals" exists. 检查是否存在“总计”表。 Create it if it does not 如果没有,请创建它
  2. Copy the first row (A to Q) of first sheet to "totals" 将第一张纸的第一行(A到Q)复制到“总计”
  3. Copy block A2:Q33 to "totals" sheet starting at row 2 将块A2:Q33复制到从第2行开始的“总计”表
  4. Repeat for all other sheets, appending 32 rows lower each time 对所有其他工作表重复此操作,每次减少32行

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: 你这样做如下:

  1. open the Visual Basic editor () 打开Visual Basic编辑器()
  2. In the project explorer (left hand side of the screen), expand the VBAProject 在项目资源管理器(屏幕左侧)中,展开VBAProject
  3. Right-click on "ThisWorkbook", and select "View Code" 右键单击“ThisWorkbook”,然后选择“查看代码”
  4. In the window that opens, copy/paste the following lines of code: 在打开的窗口中,复制/粘贴以下代码行:

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

Download RDBMerge 下载RDBMerge

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM