Filtro tabella pivot di Excel con VBA

Ho provato a copiare e incollare le soluzioni da internet per sempre ora per cercare di filtrare una tabella pivot in Excel con VBA. Il codice riportato di seguito non funziona.

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

Voglio filtro così vedo tutte le righe che hanno SavedFamilyCode K123223. Non ho voglia di vedere le altre righe della tabella pivot. Voglio che questo lavoro, indipendentemente di filtri precedenti. Spero che mi può aiutare con questo. Grazie!


Basato sul tuo post sto cercando:

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

Purtroppo ottengo errore di runtime 91: variabile Oggetto o variabile del blocco with non impostata. Che cosa ha causato questo errore?

Hai provato la registrazione di una macro?
Ho qualcosa lungo le linee di Sub FilterPivotTable() Con ActiveSheet.Le Tabelle Pivot(“PivotTable2”).Campi Pivot(“SavedFamilyCode”) .PivotItems(“K010”).Visible = True .PivotItems(“K012”).Visible = False End with End Sub Ma io voglio che tutti, tranne K010 di diventare invisibile Il registratore di macro ignora il mio selezionare/deselezionare tutti i clic

OriginaleL’autore user1283776 | 2012-06-17

6 Replies
  1. 7

    Campo.Paginaattuale funziona solo per i campi di Filtro (anche chiamato campi di pagina).

    Se si desidera filtrare una riga/colonna campo, si deve scorrere i singoli elementi, in questo modo:

    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

    Quindi basta chiamare:

    FilterPivotField ActiveSheet.PivotTables("PivotTable2").PivotFields("SavedFamilyCode"), "K123223"

    Naturalmente, questo diventa più lento e più ci sono i singoli elementi diversi in campo. È inoltre possibile utilizzare SourceName invece del Nome se che si adatta alle vostre esigenze meglio.

    In risposta a @user1283776 (meglio un anno tardi che mai) — si sono probabilmente ottiene l’errore, perché si dovrebbe utilizzare Set Field = ...
    Lavorare per me, e mi risparmiare ore di tempo!

    OriginaleL’autore savyuk

  2. 3

    Configurare la tabella pivot in modo che è simile a questo:

    Filtro tabella pivot di Excel con VBA

    Il codice può semplicemente lavorare sulla range(“B1”) ora e la tabella pivot verrà filtrato per te richiesti SavedFamilyCode

    Sub FilterPivotTable()
    Application.ScreenUpdating = False
        ActiveSheet.Range("B1") = "K123224"
    Application.ScreenUpdating = True
    End Sub

    OriginaleL’autore whytheq

  3. 2

    Si potrebbe verificare questo, se volete. 🙂

    Utilizzare questo codice se SavedFamilyCode è il Filtro di Report:

     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

    Ma se il SavedFamilyCode è la Colonna o la Riga di Etichette di utilizzare questo codice:

     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

    Spero che questo ti aiuta.

    OriginaleL’autore MAF

  4. 1

    Penso di capire la tua domanda. Questo consente di filtrare le cose che sono nella colonna di etichette o etichette di riga. Le ultime 2 sezioni di codice è quello che vuoi, ma im incollare tutto in modo che si può vedere esattamente come funziona inizio alla fine con tutto quello è definita etc. Sicuramente ho prese un po ‘ di questo codice da parte di altri siti cordiali saluti.

    Vicino alla fine del codice, il “WardClinic_Category” è una colonna con i miei dati e l’etichetta di colonna della tabella pivot. Stesso per il IVUDDCIndicator (colonna i miei dati, ma nella riga dell’etichetta di tabella pivot).

    Spero che questo aiuta gli altri…ho trovato molto difficile trovare il codice che ha fatto questo “modo corretto”, piuttosto che utilizzando codice simile al registratore di macro.

    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

    OriginaleL’autore Brettvenker

  5. 1

    Versioni più recenti di Excel è un nuovo strumento chiamato Affettatrici. Utilizzo di affettatrici in VBA è in realtà più affidabile che .Paginaattuale (ci sono state segnalazioni di bug mentre scorrono numerose opzioni di filtro). Ecco un semplice esempio di come è possibile selezionare un filtro elemento (ricordatevi di deselezionare tutti non pertinenti affettatrice valori):

    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

    Ci sono anche servizi come SmartKato che potrebbe aiutarti con la creazione di cruscotti o segnalazioni e/o correggere il codice.

    OriginaleL’autore user3357094

  6. 1

    In Excel 2007 in poi, è possibile utilizzare il molto più semplice di codice come segue:

    dim pvt as PivotTable
    dim pvtField as PivotField
    
    set pvt = ActiveSheet.PivotTables("PivotTable2")
    set pvtField = pvt.PivotFiles("SavedFamilyCode")
    
    pvtField.PivotFilters.Add xlCaptionEquals, Value1:= "K123223"

    OriginaleL’autore ghostJago

Lascia un commento