0

私の雇用主にとって残念なことに、私のネットワーク エンジニアリング コースには高度な Excel 数式プログラミングが含まれていませんでした。言うまでもなく、Excel の基本的な SUM および COUNT 数式コマンドの保存については何も知りません。

私の雇用主は、暦年の各月を表す複数のワークシートを含む Excel ワークブックを持っています。各列/行のワークブック全体のすべてのデータを反映するワークブックに「合計」ワークシートを作成できるようにしたいと考えています。

わかりやすくするための例:

  • ワークシート「May_2013」では、列 A に「DATE」というラベルが付いています。セル A2 には、データ "MAY-1" が含まれています。

  • ワークシート「June_2013」では、列 A に「DATE」というラベルが付いています。セル A2 には、データ "JUNE-1" が含まれています。

  • ワークシート「Total」では、列 A に「DATE」というラベルが付いています。セル A2 に "MAY-1" を反映させ、セル A3 に "JUNE-1" を反映させます。

すべてのワークシート、列 AQ、行 2 ~ 33 に対してこれを行い、対応する列のすべてのワークシートのすべてのデータを含むマスター シートを最後に入力します。

これは可能ですか?

4

3 に答える 3

2

ここに 2 つの VBA ソリューションがあります。最初はこれを行います:

  1. シート「合計」が存在するかどうかを確認します。ない場合は作成する
  2. 最初のシートの最初の行 (A から Q) を「合計」にコピーします。
  3. ブロック A2:Q33 を「合計」シートの行 2 からコピーします。
  4. 他のすべてのシートについて繰り返し、毎回下に 32 行を追加します

2 番目は、コピーする前に列データを操作する方法を示しています。各列に対して を適用しWorksheetFunction.Sum()ますが、使用したい他の集計関数に置き換えることができます。次に、結果 (シートごとに 1 行) を「合計」シートにコピーします。

どちらのソリューションも、このサイトからダウンロードできるワークブックに含まれています。でマクロを実行し、表示されるオプションのリストから適切なものを選択します。で 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

最終 (?) 編集: 誰かがワークブックに変更を加えるたびにこのスクリプトを自動的に実行する場合は、ワークブックにSheetChangeコードを追加してイベントをキャプチャできます。これは次のように行います。

  1. Visual Basic エディターを開く ()
  2. プロジェクト エクスプローラー (画面の左側) で、VBAProject を展開します。
  3. 「ThisWorkbook」を右クリックし、「コードの表示」を選択します
  4. 開いたウィンドウで、次のコード行をコピーして貼り付けます。

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
于 2013-04-10T18:54:18.627 に答える
0

間接関数を使用して、シート名を参照できます。下の画像では、この関数はヘッダー名 (B37) を受け取り、それをシート参照として使用しています。「MAY_2013」で作成した「A1」の正しい「合計セル」を選択してください。下に画像を置いて、参照名とタブ名を示します

方式

于 2013-04-10T19:18:04.723 に答える
0

異なるワークシートのデータを組み合わせてマスター シートを作成する RDBMerge アドインをご利用ください。詳細については、以下のリンクを参照してください。

http://duggisjobstechnicalstuff.blogspot.in/2013/03/how-to-merge-all-excel-worksheets-with.html

RDBMerge をダウンロード

于 2013-04-10T17:26:49.417 に答える