
EXCEL2013 Win7
図のようなデータからピボットテーブルを作るVBAを書きました。
「作業日受入日」の最大日付を集計する式をつけくわえたところ
全ての項目に対する最大日付が表示されてしまいました。
「区分」による集計はしつつも
全体の最終作業日だけを表示する方法はないのでしょうか。
皆様よろしくお願いいたします。
Sub ピボットテーブルを作成するVBA()
Dim ds As Variant
Dim er As Long
Dim ws As Worksheet
Dim pvc As PivotCache
Dim pvt As PivotTable
Dim pvf As PivotField
'●集計しようとしているシート名の取得
ds = ActiveSheet.Name
'●データの最終行番号を取得
er = Worksheets(ds).Cells(Rows.Count, 1).End(xlUp).Row
'●ピボットテーブルの作成
Set ws = Sheets.Add
Set pvc = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, _
SourceData:=ds & "!R1C1:R" & er & "C7", _
Version:=xlPivotTableVersion15)
Set pvt = pvc.CreatePivotTable(TableDestination:=ws.Name & "!R3C1", _
TableName:="PIVOT", _
DefaultVersion:=xlPivotTableVersion15)
With pvt
With .PivotFields("工場コード")
.Orientation = xlRowField
.Subtotals(1) = False
End With
With .PivotFields("作業整理番号")
.Orientation = xlRowField
.Subtotals(1) = False
End With
With .PivotFields("品名")
.Orientation = xlRowField
.Subtotals(1) = False
End With
With .PivotFields("区分")
.Orientation = xlColumnField
.Position = 1
End With
With .PivotFields("金額")
.Orientation = xlDataField
.Function = xlSum
.Caption = "合計金額"
.NumberFormat = "#,##0"
End With
With .PivotFields("作業日受入日")
.Orientation = xlDataField
.Function = xlMax
.Caption = "最終作業日"
.NumberFormat = "yyyy/mm/dd"
End With
.RowAxisLayout xlTabularRow
End With
End Sub

No.3ベストアンサー
- 回答日時:
できたようでよかったです
配列数式で一部不足があったので訂正します
"=MAX(IF(R2C1:R" & er & "C1=RC[-7],IF(R2C2:R" & er _
& "C2=RC[-6],IF(R2C3:R" & er & "C3=RC[-5],R2C7:R" & er & "C7))))"
試験したときの32(行)が一部残ったまんまでしたm(_ _)m
「工場コード、作業整理番号、品名が一致する」条件のもと、作業受入日の最大値を計算しています。
本当はこの計算結果もピボットテーブルで出せるのでそこから持って来たかった。
元の表→ピボットテーブルで最終日計算→元の表に追加→ピボットテーブル作成
が
元の表→元の表に配列数式で最終日計算を追加→ピボットテーブル作成
となってます。
配列数式利用で計算速度が遅いかも。なのでFor~nextに
.Range("h" & n) = .Range("h" & n).Value
を入れてしまえばいいかもです。
ピボットテーブル作成マクロの勉強になりました(^^)/
CoalTar様、
上記の分を反映して、新たに補足欄に完成版としてコードを載せました。
参考にするかたもいるかもしれませんから。
(あまり長い補足が書けないので、ばらばらになってしまったのが残念です。)
最初のコメント以降もフォローも頂き、本当にありがとうございました。
このコメントを持ってクローズさせていただきます。
No.2
- 回答日時:
No1の回答は作成したピボットテーブルのデータ取得でしたが、わからないので
配列数式で最終日を取得しました。
ピボットテーブルに組み込んだので位置がいまいちかも
Sub ピボットテーブルを作成するVBA2()
Dim ds As Variant
Dim er As Long
Dim ws As Worksheet
Dim pvc As PivotCache
Dim pvt As PivotTable
Dim pvf As PivotField
Dim n As Long '追加
'●集計しようとしているシート名の取得
ds = ActiveSheet.Name
'●データの最終行番号を取得
er = Worksheets(ds).Cells(Rows.Count, 1).End(xlUp).Row
'●追加
With Worksheets(ds)
.Range("H1") = "最終"
For n = 2 To er
.Range("H" & n).FormulaArray = _
"=MAX(IF(R2C1:R32C1=RC[-7],IF(R2C2:R" & er & "C2=RC[-6],IF(R2C3:R" & er & "C3=RC[-5],R2C7:R" & er & "C7))))"
Next n
.Range("h2:h" & er) = .Range("h2:h" & er).Value
End With
'●ピボットテーブルの作成
Set ws = Sheets.Add
Set pvc = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, _
SourceData:=ds & "!R1C1:R" & er & "C8", _
Version:=xlPivotTableVersion15) 'C7→C8に変更
Set pvt = pvc.CreatePivotTable(TableDestination:=ws.Name & "!R3C1", _
TableName:="PIVOT", _
DefaultVersion:=xlPivotTableVersion15)
With pvt
With .PivotFields("工場コード")
.Orientation = xlRowField
.Subtotals(1) = False
End With
With .PivotFields("作業整理番号")
.Orientation = xlRowField
.Subtotals(1) = False
End With
With .PivotFields("品名")
.Orientation = xlRowField
.Subtotals(1) = False
End With
With .PivotFields("区分")
.Orientation = xlColumnField
.Position = 1
End With
With .PivotFields("金額")
.Orientation = xlDataField
.Function = xlSum
.Caption = "合計金額"
.NumberFormat = "#,##0"
End With
'行フィールドへ
With .PivotFields("最終")
.Orientation = xlRowField
.Subtotals(1) = False
.Caption = "最終作業日"
.NumberFormat = "yyyy/mm/dd"
End With
.RowAxisLayout xlTabularRow
End With
End Sub

CoalTar様、テストしてみました!
元の表へ付け加えた最終作業日がミソですね。
これは私も試みてどうしてもできなかった部分です。
どうなっているのかよくわからないので、このあとちゃんと解析してみます。
他への応用も利きそうですね。
何度もありがとうございました。
今後ともよろしくお願いいたします。
No.1
- 回答日時:
実際に試していないので、、、
ご質問のマクロ
With .PivotFields("金額")
.Orientation = xlDataField
.Function = xlSum
.Caption = "合計金額"
.NumberFormat = "#,##0"
End With
を除いて作成
元の表に作業列を追加し、GetPivotedata関数で
=GETPIVOTDATA("作業日受入日",Sheet3!$A$3,"工場コード",A2,"作業整理番号",B2,"品名",C2)
で最大値列を追加
コードは
ピボットテーブルを作成する元の範囲を作業列分の1列追加し、(C7→C8)
With .PivotFields("作業日受入日")
.Orientation = xlDataField
.Function = xlMax
.Caption = "最終作業日"
.NumberFormat = "yyyy/mm/dd"
End With
を削除し
作業列を行フィールドに追加してはどうでしょうか?
ただし、画像がとても荒く、目的のものになっているか不明。
当方、力不足でピボットテーブル作成時のシート名取得方法がわかりません。
ご質問のコード、絶対自分じゃ作れませんから(^^;
回答が内容でしたので投稿。参考まで
ご回答ありがとうございます。
画像がとても荒いのに気づかず失礼いたしました。
ご回答の内容をよく考えてみたのですが、理解力がなくてわかりませんでした。
せっかく書いていただいたのに、申し訳ありません。
ピボットテーブル作成時のシート名は、今回の場合ws.Nameとなると思います。
ピボットは最近使い始めたばかりの機能で、実はよくわかっていません。
式も嘘がはいっているかもしれませんが、目的の内容で表示はされているので、ヨシとしています。
GetPivotdata関数は初めて知りました。おかげさまで勉強になりました。
大切なお時間をこの回答のために割いていただいたことに、心からお礼申し上げます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 最終列の右へSUM関数を作成するため下記コードを実行しましたが、最終列「10月28日」が上書きされて 3 2022/12/05 20:32
- Visual Basic(VBA) エクセル VBA 処理スピードを上げたいのですが。 6 2023/03/31 20:52
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
- Visual Basic(VBA) Excel VBA メール作成について 本文の中にExcel でコピーした図を上下に2つ 貼り付けを 2 2023/06/14 01:48
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- その他(Microsoft Office) マクロVBAについて 1 2022/09/06 18:12
- Visual Basic(VBA) QRコード作成マクロについて 3 2022/11/26 16:55
- Visual Basic(VBA) vbaのエラー対応(実行時エラー7:メモリが不足しています) 4 2023/04/24 00:20
- Excel(エクセル) vba 転記するときの最終行について 2 2022/09/03 09:31
- Visual Basic(VBA) EXCELのVBAについて 2 2023/07/05 17:17
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
特定のセルだけ結果がおかしい...
-
エクセルのdatedif関数を使って...
-
エクセルのVBAで集計をしたい
-
【マクロ】【配列】3つのシー...
-
vba テキストボックスとリフト...
-
エクセル ドロップダウンリスト...
-
【関数】同じ関数なのに、エラ...
-
Office2021のエクセルで米国株...
-
【マクロ】列を折りたたみ非表...
-
9月17日でサービス終了らし...
-
【マクロ】アクティブセルの時...
-
ページが変なふうに切れる
-
【条件付き書式】シートの中で...
-
【マクロ】3行に上から下に並...
-
【マクロ】オートフィルターの...
-
【マクロ】EXCELで読込したCSV...
-
【画像あり】オートフィルター...
-
他のシートの検索
-
エクセルの循環参照、?
-
Excelファイルを開くと私だけVA...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
9月17日でサービス終了らし...
-
エクセル
-
【マクロ】WEBシステムから保存...
-
エクセルの循環参照、?
-
エクセル ドロップダウンリスト...
-
エクセルのdatedif関数を使って...
-
特定のセルだけ結果がおかしい...
-
【マクロ】A列にある、日付(本...
-
【マクロ】EXCELで読込したCSV...
-
【マクロ】アクティブセルの時...
-
【エクセル】期限アラートについて
-
iPhoneのExcelアプリで、別のシ...
-
【関数】同じ関数なのに、エラ...
-
Excelの新しい空白のブックを開...
-
【マクロ】3行に上から下に並...
-
【マクロ】宣言は、何のために...
-
VBA チェックボックスをオーバ...
-
Excelについての質問です 並べ...
-
【マクロ】アクティブセルの2...
-
【関数】不規則な文章から●●-●●...
おすすめ情報
画像が小さくて申し訳ありませんでした。
目標としている表です。
【完成版】CoalTar様のご協力に感謝いたします。
Sub ピボットテーブルを作成するVBA2()
Dim ds As Variant
Dim er As Long
Dim ws As Worksheet
Dim pvc As PivotCache
Dim pvt As PivotTable
Dim pvf As PivotField
Dim n As Long
'●集計しようとしているシート名の取得
ds = ActiveSheet.Name
'●データの最終行番号を取得
er = Worksheets(ds).Cells(Rows.Count, 1).End(xlUp).Row
(【完成版2】へ続く)
'【続き、完成版2】
'●元データの並べ替え⇒作業整理番号と作業日受入日をキーとし、昇順で並べ替える
Worksheets(ds).Range("A1:G" & er).Sort _
Key1:=Range("B2:B" & er), _
Order1:=xlAscending, _
Header:=xlYes, _
Key2:=Range("G2:G" & er), _
Order2:=xlAscending, _
Header:=xlYes
'(【完成版3】へ続く)
'【続き、完成版3】
'●作業整理番号ごとの最終(日)の表示
With Worksheets(ds)
.Range("H1") = "最終"
For n = 2 To er
.Range("H" & n).FormulaArray = _
"=MAX(IF(R2C1:R" & er & "C1=RC[-7],IF(R2C2:R" & er & "C2=RC[-6],IF(R2C3:R" & er & "C3=RC[-5],R2C7:R" & er & "C7))))"
.Range("h" & n) = .Range("h" & n).Value
Next n
End With
'(完成版4へ)
'【続き、完成版4】
'●ピボットテーブルの作成
Set ws = Sheets.Add
Set pvc = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, _
SourceData:=ds & "!R1C1:R" & er & "C8", _
Version:=xlPivotTableVersion15)
Set pvt = pvc.CreatePivotTable(TableDestination:=ws.Name & "!R3C1", _
TableName:="PIVOT", _
DefaultVersion:=xlPivotTableVersion15)
'(完成版5へ)
'【続き、完成版5】
With pvt
With .PivotFields("工場コード")
.Orientation = xlRowField
.Subtotals(1) = False
End With
With .PivotFields("作業整理番号")
.Orientation = xlRowField
.Subtotals(1) = False
End With
’(完成版6へ)
'【続き、完成版6】
With .PivotFields("品名")
.Orientation = xlRowField
.Subtotals(1) = False
End With
With .PivotFields("最終")
.Orientation = xlRowField
.Subtotals(1) = False
.Caption = "最終作業日"
.NumberFormat = "yyyy/mm/dd"
End With
'(完成版7へ)
'【続き、完成版7】
With .PivotFields("区分")
.Orientation = xlColumnField
.Position = 1
End With
With .PivotFields("金額")
.Orientation = xlDataField
.Function = xlSum
.Caption = "合計金額"
.NumberFormat = "#,##0"
End With
.RowAxisLayout xlTabularRow
End With
End Sub