こんなのでどうでしょう。
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/06 10:20