VBAを使用してExcelでピボットテーブルをフィルター処理するために、インターネットからソリューションを永遠にコピーして貼り付けようとしました。以下のコードは機能しません。
Sub FilterPivotTable()
Application.ScreenUpdating = False
ActiveSheet.PivotTables("PivotTable2").ManualUpdate = True
ActiveSheet.PivotTables("PivotTable2").PivotFields("SavedFamilyCode").CurrentPage = "K123223"
ActiveSheet.PivotTables("PivotTable2").ManualUpdate = False
Application.ScreenUpdating = True
End Sub
SavedFamilyCode K123223を持つすべての行が表示されるようにフィルタリングしたい。ピボットテーブルに他の行を表示したくない。これは、以前のフィルターに関係なく機能します。あなたがこれで私を助けることができると思います。ありがとう!
私がしようとしているあなたの投稿に基づいて:
Sub FilterPivotField()
Dim Field As PivotField
Field = ActiveSheet.PivotTables("PivotTable2").PivotFields("SavedFamilyCode")
Value = Range("$A$2")
Application.ScreenUpdating = False
With Field
If .Orientation = xlPageField Then
.CurrentPage = Value
ElseIf .Orientation = xlRowField Or .Orientation = xlColumnField Then
Dim i As Long
On Error Resume Next ' Needed to avoid getting errors when manipulating fields that were deleted from the data source.
' Set first item to Visible to avoid getting no visible items while working
.PivotItems(1).Visible = True
For i = 2 To Field.PivotItems.Count
If .PivotItems(i).Name = Value Then _
.PivotItems(i).Visible = True Else _
.PivotItems(i).Visible = False
Next i
If .PivotItems(1).Name = Value Then _
.PivotItems(1).Visible = True Else _
.PivotItems(1).Visible = False
End If
End With
Application.ScreenUpdating = True
End Sub
残念ながら、実行時エラー91:オブジェクト変数またはWithブロック変数が設定されていません。このエラーの原因は何ですか?
Field.CurrentPageは、フィルターフィールド(ページフィールドとも呼ばれます)に対してのみ機能します。
行/列フィールドをフィルタリングする場合は、次のように個々のアイテムを循環する必要があります。
Sub FilterPivotField(Field As PivotField, Value)
Application.ScreenUpdating = False
With Field
If .Orientation = xlPageField Then
.CurrentPage = Value
ElseIf .Orientation = xlRowField Or .Orientation = xlColumnField Then
Dim i As Long
On Error Resume Next ' Needed to avoid getting errors when manipulating PivotItems that were deleted from the data source.
' Set first item to Visible to avoid getting no visible items while working
.PivotItems(1).Visible = True
For i = 2 To Field.PivotItems.Count
If .PivotItems(i).Name = Value Then _
.PivotItems(i).Visible = True Else _
.PivotItems(i).Visible = False
Next i
If .PivotItems(1).Name = Value Then _
.PivotItems(1).Visible = True Else _
.PivotItems(1).Visible = False
End If
End With
Application.ScreenUpdating = True
End Sub
それから、あなたはただ電話するでしょう:
FilterPivotField ActiveSheet.PivotTables("PivotTable2").PivotFields("SavedFamilyCode"), "K123223"
当然、これはフィールドに個々の異なるアイテムがあるほど遅くなります。必要に応じて、Nameの代わりにSourceNameを使用することもできます。
次のようにピボットテーブルを構成します。
コードは単にrange( "B1")で動作するようになり、必要なSavedFamilyCodeにピボットテーブルがフィルターされます。
Sub FilterPivotTable()
Application.ScreenUpdating = False
ActiveSheet.Range("B1") = "K123224"
Application.ScreenUpdating = True
End Sub
必要に応じてこれを確認できます。 :)
SavedFamilyCodeがレポートフィルターにある場合、このコードを使用します:
Sub FilterPivotTable()
Application.ScreenUpdating = False
ActiveSheet.PivotTables("PivotTable2").ManualUpdate = True
ActiveSheet.PivotTables("PivotTable2").PivotFields("SavedFamilyCode").ClearAllFilters
ActiveSheet.PivotTables("PivotTable2").PivotFields("SavedFamilyCode").CurrentPage = _
"K123223"
ActiveSheet.PivotTables("PivotTable2").ManualUpdate = False
Application.ScreenUpdating = True
End Sub
ただし、SavedFamilyCodeが列ラベルまたは行ラベルにある場合、このコードを使用します:
Sub FilterPivotTable()
Application.ScreenUpdating = False
ActiveSheet.PivotTables("PivotTable2").ManualUpdate = True
ActiveSheet.PivotTables("PivotTable2").PivotFields("SavedFamilyCode").ClearAllFilters
ActiveSheet.PivotTables("PivotTable2").PivotFields("SavedFamilyCode").PivotFilters. _
Add Type:=xlCaptionEquals, Value1:="K123223"
ActiveSheet.PivotTables("PivotTable2").ManualUpdate = False
Application.ScreenUpdating = True
End Sub
これがお役に立てば幸いです。
Excelの最新バージョンには、スライサーと呼ばれる新しいツールがあります。 VBAでスライサーを使用すると、実際には.CurrentPageよりも信頼性が高くなります(多数のフィルターオプションをループしているときにバグが報告されています)。スライサーアイテムを選択する方法の簡単な例を次に示します(関連のないスライサー値をすべて選択解除することを忘れないでください)。
Sub Step_Thru_SlicerItems2()
Dim slItem As SlicerItem
Dim i As Long
Dim searchName as string
Application.ScreenUpdating = False
searchName="Value1"
For Each slItem In .VisibleSlicerItems
If slItem.Name <> .SlicerItems(1).Name Then _
slItem.Selected = False
Else
slItem.Selected = True
End if
Next slItem
End Sub
SmartKatoのようなサービスもあり、ダッシュボードやレポートの設定やコードの修正に役立ちます。
Excel 2007以降では、次のようにはるかに単純なコードを使用できます。
dim pvt as PivotTable
dim pvtField as PivotField
set pvt = ActiveSheet.PivotTables("PivotTable2")
set pvtField = pvt.PivotFiles("SavedFamilyCode")
pvtField.PivotFilters.Add xlCaptionEquals, Value1:= "K123223"
私はあなたの質問を理解していると思います。これにより、列ラベルまたは行ラベルにあるものがフィルタリングされます。コードの最後の2つのセクションはあなたが望むものですが、定義されているすべてのもので実行が開始される方法を正確に見ることができるようにすべてを貼り付けています。
コードの終わり近くで、「WardClinic_Category」はデータの列であり、ピボットテーブルの列ラベルにあります。 IVUDDCIndicator(データ内の列ですが、ピボットテーブルの行ラベル内)についても同じです。
これが他の人の助けになることを願っています...マクロレコーダーに似たコードを使用するのではなく、「適切な方法」でこれを行ったコードを見つけることは非常に難しいことがわかりました。
Sub CreatingPivotTableNewData()
'Creating pivot table
Dim PvtTbl As PivotTable
Dim wsData As Worksheet
Dim rngData As Range
Dim PvtTblCache As PivotCache
Dim wsPvtTbl As Worksheet
Dim pvtFld As PivotField
'determine the worksheet which contains the source data
Set wsData = Worksheets("Raw_Data")
'determine the worksheet where the new PivotTable will be created
Set wsPvtTbl = Worksheets("3N3E")
'delete all existing Pivot Tables in the worksheet
'in the TableRange1 property, page fields are excluded; to select the entire PivotTable report, including the page fields, use the TableRange2 property.
For Each PvtTbl In wsPvtTbl.PivotTables
If MsgBox("Delete existing PivotTable!", vbYesNo) = vbYes Then
PvtTbl.TableRange2.Clear
End If
Next PvtTbl
'A Pivot Cache represents the memory cache for a PivotTable report. Each Pivot Table report has one cache only. Create a new PivotTable cache, and then create a new PivotTable report based on the cache.
'set source data range:
Worksheets("Raw_Data").Activate
Set rngData = wsData.Range(Range("A1"), Range("H1").End(xlDown))
'Creates Pivot Cache and PivotTable:
Worksheets("Raw_Data").Activate
ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=rngData.Address, Version:=xlPivotTableVersion12).CreatePivotTable TableDestination:=wsPvtTbl.Range("A1"), TableName:="PivotTable1", DefaultVersion:=xlPivotTableVersion12
Set PvtTbl = wsPvtTbl.PivotTables("PivotTable1")
'Default value of ManualUpdate property is False so a PivotTable report is recalculated automatically on each change.
'Turn this off (turn to true) to speed up code.
PvtTbl.ManualUpdate = True
'Adds row and columns for pivot table
PvtTbl.AddFields RowFields:="VerifyHr", ColumnFields:=Array("WardClinic_Category", "IVUDDCIndicator")
'Add item to the Report Filter
PvtTbl.PivotFields("DayOfWeek").Orientation = xlPageField
'set data field - specifically change orientation to a data field and set its function property:
With PvtTbl.PivotFields("TotalVerified")
.Orientation = xlDataField
.Function = xlAverage
.NumberFormat = "0.0"
.Position = 1
End With
'Removes details in the pivot table for each item
Worksheets("3N3E").PivotTables("PivotTable1").PivotFields("WardClinic_Category").ShowDetail = False
'Removes pivot items from pivot table except those cases defined below (by looping through)
For Each PivotItem In PvtTbl.PivotFields("WardClinic_Category").PivotItems
Select Case PivotItem.Name
Case "3N3E"
PivotItem.Visible = True
Case Else
PivotItem.Visible = False
End Select
Next PivotItem
'Removes pivot items from pivot table except those cases defined below (by looping through)
For Each PivotItem In PvtTbl.PivotFields("IVUDDCIndicator").PivotItems
Select Case PivotItem.Name
Case "UD", "IV"
PivotItem.Visible = True
Case Else
PivotItem.Visible = False
End Select
Next PivotItem
'turn on automatic update / calculation in the Pivot Table
PvtTbl.ManualUpdate = False
End Sub