0

日付を表すタブと各タブの合計が含まれるExcelブックがあります。これらすべての合計を最終シートで取得できますが、新しいスプレッドシートが追加されたときに、数式/マクロで名前付きシートの合計の合計を取得する必要があります。

注:-すべてのセルは同じままです(E56)

4

2 に答える 2

0

あなたが何をしようとしているのかわかりません。ユーザーが新しいシートに情報を配置してE56の値になるまで、シート全体にNewSheet!E56の値を追加しても意味がありません。

ただし、イベントを使用する必要があると思います。ThisWorkbook以下は、ブックのMicrosoftExcelオブジェクトに配置する必要のあるいくつかのイベントルーチンです。これらはイミディエイトウィンドウに出力されるだけなので、いつ起動されたかを確認できます。注:1つのユーザーイベントに対して複数のイベントを発生させることができます。たとえば、新しいワークシートを作成すると、「新しいシート用に作成」、「古いシート用に非アクティブ化」、「新しいシート用にアクティブ化」がトリガーされます。

含めることを忘れないでください

    Application.EnableEvents = False

    Application.EnableEvents = True

イベントをトリガーするこれらのルーチンの1つ内のステートメントの周り。

おそらく、SheetDeactivateを使用する必要があります。ユーザーがシートを離れるときは、E56の値を確認してください。存在する場合は、合計シートに含まれているかどうかを確認します。遊びましょう。ユーザーが行うことを実行します。これらのルーチンに追加して、さらに調査します。幸運を。

Private Sub Workbook_SheetActivate(ByVal Sh As Object)

  Debug.Print "Workbook_SheetActivate " & Sh.Name

End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)

   Call MsgBox("Workbook_BeforeClose", vbOKOnly)

End Sub
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Source As Range)

  Debug.Print "Workbook_SheetChange " & Sh.Name & " " & Source.Address

End Sub
Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)

  Debug.Print "Workbook_SheetDeactivate " & Sh.Name

End Sub
Private Sub Workbook_NewSheet(ByVal Sh As Object)

  Debug.Print "Workbook_NewSheet " & Sh.Name

End Sub
Sub Workbook_Open()

   Debug.Print "Workbook_Open"

End Sub

要件の明確化に応じた追加セクション

以下のコードは、TOTALを除くすべてのワークシートのセルE56の総計を再計算し、ワークブックが開かれるたび、およびユーザーが現在のワークシートを変更するたびに、結果をワークシートTOTALに格納します。

Excelで一貫したタイミングを取得することは困難ですが、私の実験によれば、この再計算のためにユーザーがワークシートの切り替えの遅延に気付く前に、500から1,000のワークシートが必要になります。

このコードのインストール方法を知っているかどうかわからないので、ここに簡単な手順を示します。短すぎるかどうかを尋ねます。

  • 関連するワークブックを開きます。
  • をクリックしAlt+F11ます。VBAエディタが表示されます。左下にプロジェクトエクスプローラーが表示されます。Ctrl+Rそうでない場合はクリックしてください。プロジェクトエクスプローラの表示は次のようになります。

VBAProject (Xxxxxxxx.xls)
    Microsoft Excel Objects
       Sheet1 (Xxxxxxxxx)
       Sheet10 (Xxxxxxxxx)
       Sheet11 (Xxxxxxx)
       :
       ThisWorkbook
  • をクリックしThisWorkbookます。画面の右上が白くなります。
  • 以下のコードをその白い領域にコピーします。
  • それ以上のアクションは必要ありません。マクロWorkbook_Open()およびWorkbook_SheetDeactivate()は、必要に応じて自動的に実行されます。

幸運を。

Option Explicit

Sub CalcAndSaveGrandTotal()

  Dim InxWksht As Long
  Dim TotalGrand As Double

  TotalGrand = 0#
  For InxWksht = 1 To Worksheets.Count
    If Not UCase(Worksheets(InxWksht).Name) = "TOTAL" Then
      ' This worksheet is not the totals worksheet
      If IsNumeric(Worksheets(InxWksht).Range("E56").Value) Then            '###
        TotalGrand = TotalGrand + Worksheets(InxWksht).Range("E56").Value
      End If                                                                '###
    End If
  Next

  'Write grand total to worksheet TOTAL
  ' ##### Change the address of the destination cell as required  
  Worksheets("TOTAL").Range("D6").Value = TotalGrand

End Sub
Sub Workbook_Open()

  ' The workbook has just been opened.

   Call CalcAndSaveGrandTotal

End Sub
Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)

  ' The user has selected a new worksheet or has created a new worksheet.

   Call CalcAndSaveGrandTotal

End Sub
于 2012-04-12T09:46:42.620 に答える
0

私はこれがプログラミングフォーラムであることを知っていますが、この特定の「必要性」はすべての配管なしで解決できるようです。

私は古い隠された最初と最後のシートのトリックが好きです。

  1. Firstというシートを作成します
  2. Lastというシートを作成します
  3. 現在のデータシートをこれら2つのシートの間に配置します。
  4. 最初最後のシートを非表示にする
  5. これで、3D数式を使用して、次のようにこれらすべてのシートのセルを合計できます。 = SUM(First:Last!E56)
  6. 最後に表示されたデータシートの後にブックにシートを追加するだけで、Excelは非表示の最後のシートの前にシートを挿入するので、数式はそのように拡張されます。
于 2012-04-12T21:44:15.350 に答える