質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

1回答

4993閲覧

VBAでピボットテーブル フィールドの選択(抽出)⇒印刷を自動化したい

sall

総合スコア1

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

1グッド

1クリップ

投稿2021/04/05 09:12

客先ごとに【ピボットテーブルのフィールドを選択(抽出)⇒印刷】の作業をExcel VBAで自動化したい

社内でピボットテーブルで展開されるデータがあり、自分が担当する客先をフィルター検索して抽出し、表示された範囲を印刷するという作業を、客先1件ずつ行っています。
この作業(抽出~印刷×客先分)を自動化したく考えているのですが、下記のコードだと上手くいかず悩んでいます。
拙い説明で恐縮ですが、何か良い解決方法があればご教示いただければ幸いです。
よろしくお願いいたします。

≪ピボットテーブル概要≫
A列:社内チーム名
B列:客先(※この項目をフィルターで抽出しています)
C列:商品
D列~:商品の売り上げ個数、単価、総額等

発生している問題・エラーメッセージ

①抽出に時間がかかる(1分以上)
②1回分の抽出しかできない

該当のソースコード

Sub フィルターを設定する()  Dim pvItm As PivotItem  For Each pvItm In ActiveSheet.PivotTables(1).PivotFields("客先").PivotItems   Select Case pvItm.Value    Case "顧客A"     pvItm.Visible = True    Case Else     pvItm.Visible = False   End Select  Next pvItm End Sub
mari_0418👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんなのでどうでしょう。

VBA

1Sub フィルターを設定する(pvField As PivotField, itemName As String) 2 Dim pvItm As PivotItem 3 pvField.PivotItems(itemName).Visible = True 4 For Each pvItm In pvField.PivotItems 5 If pvItm.Value <> itemName Then 6 pvItm.Visible = False 7 End If 8 Next pvItm 9End Sub 10 11Public Sub 印刷() 12 Dim pvTable As PivotTable 13 Dim pvField As PivotField 14 Dim pvItm As PivotItem 15 Set pvTable = ActiveSheet.PivotTables(1) 16 Set pvField = pvTable.PivotFields("客先") 17 pvTable.ManualUpdate = True 18 For Each pvItm In pvField.PivotItems 19 フィルターを設定する pvField, pvItm.Value 20 pvTable.Update 21 ' ここで印刷処理 22 'ActiveSheet.ExportAsFixedFormat xlTypePDF, pvItm.Value & ".pdf" 23 Next pvItm 24 pvTable.ManualUpdate = False 25End Sub 26

・全ての顧客で、それぞれ絞れるように関数化しています。
・速度対策でpvTable.ManualUpdateにより自動更新を停止してから、pvTable.Updateにより反映しています。

という感じです。
印刷は時間がかかるかと思いますが、それは仕方ないとして
それなりにいけるんじゃないかと思います。

見逃してましたが「自分が担当する客先」分のみ印刷ということであれば
シートで管理してもいいですが、とりあえず簡単にコード埋め込みで

VBA

1Public Sub 印刷2() 2 Dim pvTable As PivotTable 3 Dim pvField As PivotField 4 Dim col顧客 As New Collection 5 Dim 顧客 As Variant 6 Dim msg As String 7 col顧客.Add "顧客A" 8 col顧客.Add "顧客B" 9 col顧客.Add "顧客C" 10 Set pvTable = ActiveSheet.PivotTables(1) 11 Set pvField = pvTable.PivotFields("客先") 12 pvTable.ManualUpdate = True 13 14 For Each 顧客 In col顧客 15 On Error Resume Next 16 pvField.PivotItems 顧客 17 If Err.Number = 1004 Then 18 msg = msg & vbCrLf & 顧客 19 On Error GoTo 0 20 Else 21 On Error GoTo 0 22 フィルターを設定する pvField, CStr(顧客) 23 pvTable.Update 24 ' ここで印刷処理 25 'ActiveSheet.ExportAsFixedFormat xlTypePDF, 顧客 & ".pdf" 26 End If 27 Next 顧客 28 pvTable.ManualUpdate = False 29 If msg = "" Then 30 MsgBox "印刷完了" 31 Else 32 MsgBox "印刷完了。以下の顧客データが存在しませんでした" & msg, vbExclamation 33 End If 34End Sub 35

投稿2021/04/05 20:41

編集2021/04/05 23:00
xail2222

総合スコア1497

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sall

2021/04/06 10:20

早速のご回答ありがとうございます! 希望通りの動作で、感動いたしました!! 大変助かりましたし、本当に勉強になります。 このようなご丁寧な回答をいただけたことも嬉しく、心から感謝申し上げます。 今後ともよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問