VBAで変動する総計を半期合計で計算する方法

このQ&Aのポイント
  • ピボットテーブルの総計行が追加されるたびに、他のセルに入力された総計を更新する必要があります。
  • その総計行に対する合計の数式は、SUMIF関数を使用して計算することができます。
  • VBAを使用して、特定のセルに総計の値を表示するように設定することができます。
回答を見る
  • ベストアンサー

VBA 変動する総計を半期合計で計算したい。

ピボットテーブルの総計行が元データが追加されるので変動してしまいます。 他のセルに(C37)式を入れていますが、ピボットの行が更新されるたびに 総計行の範囲を毎回張りなおさなければならない状態です。 変動しても他のセル(C37)に、合計が計算できるようにしたいです。 その総計行に対する合計の数式は以下です。(C37に入ってる式です。) =SUMIF(21:21,">=2007/10/1 ",29:29 )-SUMIF(21:21,">=2008/4/1 ",29:29 ) 29行目が総計で常に変動します。 そこで、A行に総計という文字がでたら、1つ右隣から始まる範囲での式がほしいです。 C37セルにその合計の値が表示されるようにしたいです。 21行目(固定)は日付で「2007/10/1」「2008/2/1」と2/1のように 月初の日付がB21セルから未来へ向かって表示。空白もあります。 (年度集計行を20行目に入れたため。) then以下どう書くか教えてください。 Sub 総計() Dim myRng As Range For Each myRng In Range("A:A") If myRng.Value = "総計" Then ※※※※※※※※※※ End If Next myRng End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • xsizukux
  • ベストアンサー率80% (4/5)
回答No.2

No.1です。 INDIRECT(MATCH("総計",A:A,0)&":"&MATCH("総計",A:A,0),1) 上記の関数はA列全体から"総計"の行を検索して、"総計"の行全体を範囲として返します。 例)"総計"が31行目にある時、"31:31"を範囲として返してます。 C37の式は、 SUMIF(21:21,">=2007/10/1 ",INDIRECT(MATCH("総計",A:A,0)&":"&MATCH("総計",A:A,0),1))-SUMIF(21:21,">=2008/4/1 ",INDIRECT(MATCH("総計",A:A,0)&":"&MATCH("総計",A:A,0),1)) になるかと思います。

TAKIMARU12
質問者

お礼

合計 / 金額 納期年 納期日 2007 2007 集計 2008 発注確度 2007/1/1 2008/1/1 2008/2/1 2008/3/1 2008/4/1 A:内示 確度高 C:今年度案件 11 D:次年度案件 Y:受注 9 9 5 37 30.2 Z:失注 22 (空白) 総計 1 9 2 3 4 5 どうもありがとうございます! しかしまだうまくいきません。上の図の答えは10にしたいです。 2007/10/1から2008/4/1までの総計数値を出したいです。 発注確度(日付)のあいているセルは合計しないので、総計でいう ところの9は足す必要ないセルになります。 あと、総計という言葉が上のセルにもう一つあるので、「A:A」という 範囲を「A20:A35」にしたいのですが、そうしたら、式の答えが 「0」になってしまいました。

その他の回答 (2)

  • xsizukux
  • ベストアンサー率80% (4/5)
回答No.3

No.1です。 「A20:A35」を範囲指定する場合は SUMIF(21:21,">=2007/10/1",INDIRECT(MATCH("総計",A20:A35,0)+19&":"&MATCH("総計",A20:A35,0)+19,1))- SUMIF(21:21,">=2008/4/1",INDIRECT(MATCH("総計",A20:A35,0)+19&":"&MATCH("総計",A20:A35,0)+19,1)) になります。 "+19"はA20以前の行(1~19行分)を足して正確な行番号にしています。 正解が出ない場合、空白のセルで =SUM(INDIRECT(MATCH("総計",A20:A35,0)+19&":"&MATCH("総計",A20:A35,0)+19,1)) 試してみてください。 "総計"行の合計値が表示され、正解ならこの関数には問題が無く SUMIF()関数の指定に問題があることになります。 あと、 発注確度 2007/1/1 2008/1/1 2008/2/1 2008/3/1 2008/4/1 総計 1 9 2 3 4 5 発注確度(日付)データ5に対して総計データ6あるのですが、2007/1/1 に対応する総計値はどれなのでしょうか? 日付に9 2 3 4 5を対応させても正解の10にはなりません^^;

TAKIMARU12
質問者

お礼

ありがとうございます。 うまくいきました。 >あと、 >発注確度 2007/1/1 2008/1/1 2008/2/1 2008/3/1 2008/4/1 >総計 1 9 2 3 4 5 >発注確度(日付)データ5に対して総計データ6あるのですが、2007/1/1 >に対応する総計値はどれなのでしょうか? >日付に9 2 3 4 5を対応させても正解の10にはなりません^^; すみません。説明不足でした。 総計「9」の数値の発注確度(日付)がないんです。年度の集計列 だったので。この表で言う2008/3/1までの計がほしかったのでした。 とてもむずかしい関数ですが(理解を超えてる)、回答いただけて感謝です。

  • xsizukux
  • ベストアンサー率80% (4/5)
回答No.1

参考までに MATCH関数、INDIRECT関数の組み合わせで"総計"の範囲を取得されたら どうでしょうか? セルC37の式"29:29"の箇所を変更 INDIRECT(MATCH("総計",A:A,0)&":"&MATCH("総計",A:A,0),1)

TAKIMARU12
質問者

お礼

ありがとうございます。 発注確度 2007/1/1 2007/10/1 2008/1/1 2008/2/1 A:内示 確度高 5 B:入札 正式見積 C:今年度案件 8 8 5 D:次年度案件 Y:受注 11 11 9 15 Z:失注 4 (空白) 総計 8 11 19 9 29 ※こんな感じの表です。 =SUMIF(21:21,">=2007/10/1 ",INDIRECT(MATCH("総計",$A$21:$A$34,0)&":"&MATCH("総計",$A$21:$A$34,0),1))-SUMIF(21:21,">=2008/4/1 ",INDIRECT(MATCH("総計",$A$21:$A$34,0)&":"&MATCH("総計",$A$21:$A$34,0),1) ) 式を頂いた回答に加えてみましたが、エラーになりませんが、 正解の数字が出てきません。どこをみているかが分からないです。

関連するQ&A

  • VBA Intersectで範囲の記述

    エクセル2000です。 Intersectで範囲の記述で、名前が定義された範囲、myRng と その2列右どなりを指定したいのですが、 Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Union(Range("myRng"), Range("myRng").Offset(, 2))) Is Nothing Then Exit Sub MsgBox Target.Address End Sub のようにUnionを使わなければできないでしょうか? myRngがA1:A10であれば、 If Intersect(Target, Range("A1:A10,C1:C10")) Is Nothing Then Exit Sub と簡単に記述できるのですが。

  • このVBAコードの解説をお願いします。

    特定の行の中で同じものが続いたらセルを結合する、ということがやりたくて 以下のコードをネット上から探してきました。 上記の動作は実現できたのですが、自分でこのコードをみてもイマイチわかりません。 お分かりになる方、できれば1行ずつ解説してください。 よろしくお願いします。 Sub Sample() Dim myRng As Range, myRow As Long Set myRng = Range("A1") For myRow = 1 To Cells(Rows.Count, 1).End(xlUp).Row With Cells(myRow, 1) If .Value = .Offset(1).Value Then Set myRng = Union(myRng, .Offset(1)) Else Application.DisplayAlerts = False myRng.Merge Application.DisplayAlerts = True Set myRng = .Offset(1) End If End With Next End Sub

  • 【VBA】改行されたセルの条件

    VBAにてA1のセルが画像のように改行されたセルであっても条件式で処理を行うようにしたいのですがうまくできません。 ↓式のように作成はしてみました どうしたら改行されたセルでも処理が行えるのでしょうか? Sub test() If Range("A1") = (行1行2の場合) Then 処理 End If End Sub

  • VBAでオートフィルを使って指定する文字列を含むものを表示させたい

    VBAを使って、セルD1に入力した文字列を検索するマクロを作りたいと思っています。 私は初心者で前に似たようなものを作ってもらって それを加工しようとしたのですが、うまくいきませんでした。 以前は完全に一致するもので表示でしたが、 今回は含むものを表示させたいです。 ワイルドカードは*をつけるのはわかるのですが、 いろいろやってみましたがダメでした。(単純なことかもしれないですけど) Private Sub Worksheet_Change(ByVal Target As Range) Dim myRng1 As Range Dim myRng2 As Range Set myRng1 = Target.Cells(1) If Application.Intersect(myRng1, Range("D1")) Is Nothing Then Exit Sub Set myRng2 = Range("D1").CurrentRegion With myRng2 If myRng1 = "" Then ActiveSheet.ShowAllData Else .AutoFilter Field:=4, Criteria1:=myRng1.Value End If End With End Sub

  • worksheetchangeイベント

    Private Sub Worksheet_Change(ByVal Target As Range) Dim myRng As Range Set myRng = Application.Intersect(Target, Range("A1:D2,A4:D6")) If myRng Is Nothing Then Exit Sub If WorksheetFunction.CountA(myRng) = 0 Then myRng.Value = "-" ElseIf Intersect(Target, Range("A1")).Value = "139.8" Then Range("B1:D1").Value = "-" End If End Sub A1:D2範囲とA4:D6範囲内で、アクティブセルでDELETEキーを押した場合、"-"がセルに挿入されるようにコードを書きました。 さらに、A1セルの値がドロップダウンリストで139.8に変更された場合、B1、C1、D1に"-"を入力するようにしました。 A1セルの値を変更した場合の処理がうまくいかず四苦八苦しています。 ElseIf Intersect(Target, Range("A1")).Value = "139.8" Then ここを、 Range("A1").value = "139.8" Then にしてしまうとA1の値が139.8の状態ではB1、C1、D1へ数値を入力しても"-"となってしまいます。 A1からD1まで連動したリストがリアルタイムで動作するようにコードを書きたいのですが・・・なんとか教えていただけませんでしょうか・・

  • Excel VBA ユーザー定義関数をイベントマクロで使用する

    Excel VBA ユーザー定義関数をイベントマクロで使用する Excel2003を使用しています。 あるセルと同色に塗りつぶされたセルの値を合計したく、下記1のユーザー定義関数を作成しました。 このユーザー定義関数を下記2のイベントプロシージャ内で呼び出して使用したいのですが、可能でしょうか? 可能であれば、どのようにコードを書いたらいいでしょうか? Call を使用するのかな?と思い、コードを追加してみましたが、引数の型が一致しないといった内容のエラーメッセージが表示されてしまいました。 よろしくお願いします。 ------------------------------------------------------------- 1.ユーザー定義関数(同色セルの合計) Function SumColor(hanni As Range, iro As Range) As Double   Dim myrng As Range   SumColor = 0    For Each myrng In hanni     If myrng.Interior.ColorIndex = iro.Interior.ColorIndex Then      SumColor = SumColor + myrng.Value     End If    Next myrng End Function 2.イベントマクロ(C列3行目以下ダブルクリックで塗りつぶし) Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)   If Target.Column = 3 And Target.Row >= 34 Then    Range(Cells(Target.Row, 3), Cells(Target.Row + 1, 38)).Interior.ColorIndex = 36   End If End Sub

  • エクセル VBA セルの色をSheet1とSheet2の両方を変えたいのですが・・・

    最近困っているところが表題の通りなのですが Sheet1のB2を右クリックするとB2のセルの色を変えて Sheet2のB2のセルも色を変えたいというものです。 現状で Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) Dim Rng As Range, myRng As Range Dim RngA As Range, myRngA As Range Set Rng = Range("B3:W3,b7:w8,b12:w12,d13:w13,d17:w18,d22:w23") Set myRng = Intersect(Target, Rng) If myRng.Interior.ColorIndex = xlColorIndexNone Then myRng.Interior.ColorIndex = 37 Else If myRng.Interior.ColorIndex = 37 Then myRng.Interior.ColorIndex = 45 Else myRng.Interior.ColorIndex = xlColorIndexNone End If End If Cancel = True End Sub とここまではあるのですが、これをどう改造すればSheet2の同じセルの色もかわるのでしょうか? 宜しくお願いいたします

  • エクセル VBAで

    変動する数値が、セル A1に入る状況で、 該当シートに Private Sub Worksheet_Change(ByVal Target As Range) If Range("A1").Value = 1 Then Range("C62").Value = "○" ElseIf Range("A1").Value = 2 Then Range("C62:C63").Value = "○" ElseIf Range("A1").Value = 3 Then Range("C62:C64").Value = "○" ElseIf Range("A1").Value = 4 Then Range("C62:C65").Value = "○" ElseIf Range("A1").Value = 5 Then Range("C62:C66").Value = "○" ElseIf Range("A1").Value = 6 Then Range("C62:C67").Value = "○" ElseIf Range("A1").Value = 7 Then Range("C62:C68").Value = "○" ElseIf Range("A1").Value = 8 Then Range("C62:C69").Value = "○" ElseIf Range("A1").Value = 9 Then Range("C62:C70").Value = "○" ElseIf Range("A1").Value = 10 Then Range("C62:C71").Value = "○" ElseIf Range("A1").Value = 11 Then Range("C62:C72").Value = "○" ElseIf Range("A1").Value = 12 Then Range("C62:C73").Value = "○" ElseIf Range("A1").Value = 13 Then Range("C62:C74").Value = "○" ElseIf Range("A1").Value = 14 Then Range("C62:C75").Value = "○" ElseIf Range("A1").Value = 15 Then Range("C62:C76").Value = "○" End If End Sub と言ったマクロを記述しましたが、 動作がどうにも重くて困っています。 一度、プレビューをした後は特に遅くなります。 何か良い解決方法はありますでしょうか?

  • VBA(エクセル)での条件付日付表示について

    A列に数字を入力、A25でA列の合計をするべく「=SUM(A1:A24)」という計算式の入ったシートがあるとします。(以下、B、C…と同じような列が続く) A列に入力されている数字が変更され、A25の合計値が変わった場合、その下のセル(A26)に日付と時刻を表示させたいのですが、うまくいきません。 ネットで検索したら、特定のセルの値が変更された時に日付と時刻を表示させる方法は何となくわかったのですが、この場合だと、直接A25のデータ変更された時のみA26に日付が表示されるだけで、A25の合計値がいくら変わったところで最新の時刻を表示させる事が出来ません。 どうすれば、A26に時刻を表示出来るのでしょうか? EXCEL、VBA初心者共に初心者で、あまりよくわかっていなくて申し訳ないのですが、どうぞご教授よろしくお願いします。 Private Sub Worksheet_Change(ByVal Target As Range) Dim myRng As Range Dim i As Range Set myRng = Me.Application.Intersect(Target, Me.Range("25:25")) If Not myRng Is Nothing Then Application.EnableEvents = False For Each i In myRng If IsEmpty(i.Value) Then i.Offset(1, 0).ClearContents Else i.Offset(1, 0).Value = Now End If Next i Application.EnableEvents = True End If End Sub

  • excel vba sumif 月間集計

    excel vba sumif 月間集計 どなたか教えていただけますか? sheet1に1日毎のデータが打ち込まれています。そのデータを同じブック内の月間シートが開いたときに表示してるのですが、31日間分のコードをsumifで処理しているため、かなりのファイル容量となり重くなります。もっと効率的な方法はないのでしょうか、(範囲指定の繰り返し処理等)お願いいたします。 なお、sheet1からsheet5まで日毎のデータをそれぞれ月間シート1~5に集計してます。 例です。 sheet1は   A    B     C    D     E   F・・・・ 1 日  目的  距離  燃料 2 1   社用  50 3 1   私用  60   10  4 2   社用  30 月間シート1は   A   B   C   D E    F 1 日  距離  燃料       1110 2 1  110    10 3 2   30     0  Private Sub Worksheet_Activate() UserForm1.Hide Range("A1").Select '距離数 Range("B2").Value = WorksheetFunction.SumIf(Sheets("Sheet1").Range("A2:A300"),   Range("A2"), Sheets("Sheet1").Range("C2:C300"))   Range("B3").Value = WorksheetFunction.SumIf(Sheets("Sheet1").Range("A2:A300"),   Range("A3"), Sheets("Sheet1").Range("C2:C300"))      ・      ・      ・ '累計 ・・・は、こんな感じ処理してます Dim myRng As Range Dim c As Range Set myRng = Range("F2:F32") For Each c In myRng c.Value = c.Offset(0, -4).Value + c.Offset(-1, 0).Value  Next c  End Sub

専門家に質問してみよう