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

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

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

RPA(Robotic Process Automation)は、ホワイトカラーの間接業務を人間に代行して自動的に行う技術や概念を指します。人間が繰り返すクリックやキーボード入力といった定型的なデスクワークを行うことから、仮想知的労働者(Digital Labor)と呼ばれることがあります。

UiPath

UiPathは、API連携による高い拡張性を持つ幅広いシステムに適用可能なRPAプラットフォームです。開発・設定ソフトウェアや管理コンソール、バックオフィスロボットなどのツールがあり、必要に応じて導入することが可能です。

VBA

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

1回答

234閲覧

VBAで2つのスライサーを使った印刷

conron_murakawa

総合スコア2

RPA

RPA(Robotic Process Automation)は、ホワイトカラーの間接業務を人間に代行して自動的に行う技術や概念を指します。人間が繰り返すクリックやキーボード入力といった定型的なデスクワークを行うことから、仮想知的労働者(Digital Labor)と呼ばれることがあります。

UiPath

UiPathは、API連携による高い拡張性を持つ幅広いシステムに適用可能なRPAプラットフォームです。開発・設定ソフトウェアや管理コンソール、バックオフィスロボットなどのツールがあり、必要に応じて導入することが可能です。

VBA

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2024/11/26 06:52

実現したいこと

先日、マクロでスライサーのフィルタークリアの物を一部、スライサー項目別の物を一部ずつ印刷したいという問い合わせに回答頂き非常に感動した仕上がりの物をご教示頂きました。

今回、この応用でもう一つスライサーがあり2次抽出し、同じくフィルタークリアの物を一部、スライサー項目別の物を一部ずつ印刷したい。

発生している問題・分からないこと

苦戦している点が2段階構成になったことで抽出が上手くいかない事です。

例)
スライサー_日付:1124、1125、1126、、、と日付毎の抽出
スライサー_店舗コード:101、103、105、、、と店舗コードの抽出

日付が1124の時の店舗コード全クリアの物を1部、店舗コード項目別の物を1部ずつ、
続けて1125の時の店舗コード全クリアの物を1部、店舗コード項目別の物を1部ずつ
といった具合に日付の大分類ごとに店舗コードの各種を操作したいです。

該当のソースコード

Sub PrintSlicerFiltersAccurately_Final() Dim ws As Worksheet Dim slcCache As SlicerCache Dim slcItems As SlicerItems Dim s As slicerItem Dim i As Long Set ws = ThisWorkbook.Sheets("印刷") ' スライサーキャッシュを取得 On Error GoTo ErrHandler Set slcCache = ThisWorkbook.SlicerCaches("スライサー_店舗コード") On Error GoTo 0 Set slcItems = slcCache.SlicerItems ' 1. フィルタークリア状態を印刷 slcCache.ClearManualFilter ws.PrintOut Copies:=1 ' フィルタークリア状態を1部印刷 ' 2. 各スライサー項目ごとに1部ずつ印刷 With slcItems For i = 1 To .Count If .Item(i).HasData Then slcCache.ClearManualFilter For Each s In slcItems If .Item(i).Name <> s.Name Then s.Selected = False End If Next ws.PrintOut Copies:=1 End If Next End With slcCache.ClearManualFilter Exit Sub ErrHandler: MsgBox "スライサーが見つかりません", vbCritical End Sub

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

ChatGPTやこちらの掲示板などを拝見して調べましたが解決策がわかりませんでした

補足

特になし

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

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

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

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

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

guest

回答1

0

ベストアンサー

たぶん、こんな感じですかね?
前のはいまいちかも。
単一選択をサブルーチンに追い出せばロジックが分かりやすくなると思います。

Excel

1Sub test() 2 On Error GoTo WayOut 3 With ThisWorkbook.SlicerCaches 4 Dim slcCacheDate As SlicerCache: Set slcCacheDate = .Item("スライサー_日付") 5 Dim slcCacheCode As SlicerCache: Set slcCacheCode = .Item("スライサー_販売先") 6 Dim ws As Worksheet: Set ws = Worksheets("Sheet2") 7 End With 8 On Error GoTo 0 9 Dim iDate As SlicerItem 10 Dim iCode As SlicerItem 11 12 Application.ScreenUpdating = False 13 For Each iDate In slcCacheDate.SlicerItems 14 SelectOnlyOne iDate 15 slcCacheCode.ClearManualFilter 16 ws.PrintPreview 17 For Each iCode In slcCacheCode.SlicerItems 18 SelectOnlyOne iCode 19 ws.PrintPreview 20 Next 21 Next 22 23 slcCacheDate.ClearManualFilter 24 slcCacheCode.ClearManualFilter 25 Exit Sub 26 27WayOut: 28 MsgBox "規定のオブジェクトが見つかりませんでした。" 29End Sub 30 31'単一選択 32Private Sub SelectOnlyOne(ByRef pItem As SlicerItem) 33 Dim slcCache As SlicerCache 34 Dim s As SlicerItem 35 36 Set slcCache = pItem.Parent 37 slcCache.ClearManualFilter 38 For Each s In slcCache.SlicerItems 39 If s.Caption <> pItem.Caption Then 40 s.Selected = False 41 End If 42 Next 43End Sub

追記>>
ピボットの更新のマクロを書いてみました。
マクロのあるファイルと同じフォルダー内に他のアプリケーションから
CSVファイルを出力したと想定で書いてます。

Excel

1Sub testPivot更新() 2 Dim sFName As String 3 Dim wbkData As Workbook 4 Dim rngSource As Range 5 Dim pvtTable As PivotTable 6 7 ChDir ThisWorkbook.Path 8 sFName = Application.GetOpenFilename("CSVファイル,*.csv") 9 Set wbkData = Workbooks.Open(sFName) 10 With wbkData.Worksheets(1).Range("A1").CurrentRegion 11 Set rngSource = Intersect(.Cells, .Offset(1)) 12 End With 13 14 Set pvtTable = ThisWorkbook.Worksheets(2).PivotTables(1) 15 pvtTable.ChangePivotCache ThisWorkbook.PivotCaches. _ 16 Create(SourceType:=xlDatabase, SourceData:=rngSource) 17 pvtTable.PivotCache.Refresh 18 19 wbkData.Close False 20End Sub

これでやったら、無い項目は綺麗に消えると思いますが、いかがでしょうか?

投稿2024/11/26 10:26

編集2024/11/27 09:28
mattuwan

総合スコア2163

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

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

conron_murakawa

2024/11/27 05:16

早速のご回答ありがとうございます。 試してみたところ理想に近いものが出来ています!本当にすごい、、、! ですが何点か不具合があったので修正にチャレンジしましたができませんでした。 例えばわかりやすく今回対象の日付を「5」販売先を「A/B/C...」としたとき、5-A~Zと5-A、5-B、5-Cと印刷掛けたいのですが、走らせたところ上記とプラスしてスライサーのグレーアウトしている今回対象項目でないものまでループしています。(明転している5-A~Zと5-A、5-B、5-Cが走った後、暗転している1-A~Z、1-A、2-A~Z、2-D、2-Eといった具合) 説明がおぼつかず申し訳ありません。何か解決策もらえたらうれしいです
mattuwan

2024/11/27 05:25

マクロを実行する前の選択状況で、 個別に印刷したいということでしょうか? (「今回対象項目でない。」というものがこちらではわかりません。)
conron_murakawa

2024/11/27 05:35

新規のcsvデータから既存のピボットテーブルを更新するところまでがマクロ実行前の動きです。 ここからマクロを実行して日付別明細と日付別店舗明細の印刷をかけたいです
mattuwan

2024/11/27 06:19

あぁ、無くなった項目をスライサーの項目からなくしたいということですね。 ちょっと研究してみます。
conron_murakawa

2024/11/27 07:14

ありがとうございます。こちら挿入してみましたところスライサーのキャッシュの削除には成功しましたが、なぜか印刷に移ったところで恐らくキャッシュ分の印刷までしているようです。 なかなか難しいですね。。。研究します!
mattuwan

2024/11/27 08:10

あれー?サンプルデータがないので、ちょっと苦戦かもです。 頑張ってサンプルデータ作ってみます。
mattuwan

2024/11/27 09:29

回答の方に追記しました。
conron_murakawa

2024/11/28 01:12

度々のご対応ありがとうございました 多少エラーが出ましたが根本のエクセルの修正等行い改善出来ました。 学びが多かったです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.34%

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

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

質問する

関連した質問