Condividi tramite

Codice VBA PivotFields("..").PivotItems("..").Visible = False non funzionante

Anonimo
2012-02-26T17:14:53+00:00

Non sono certo che questo sia il modo di far conoscere un codice che non funziona.

Sistema Windows XP 64 Bit Professional

In un testo di Office Excel 2007 Visual Basic for Application viene rielaborata una macro che modifica una tabella pivot esistente

Sub PivotSetLayout()

Dim pt As PivotTable

Dim pf As PivotField

Set pt = ActiveCell.PivotTable

Set pf = pt.ColumnFields("Anni")

pt.PageFields("State").CurrentPage = "Idaho"

pt.RowFields("Category").ShowAllItems = True

pf.ShowAllItems = True

pf.PivotItems(1).Visible = False

a questo punto viene la scritta: Errore Run-time '1004' impossibile trovare la proprietà PivotItems per la classe PivotField

Ho provato a registrare una macro ma il risultato non cambia

Nella guida del VBA ho trovato e provato il seguente codice per Oggetto PivotItems:

Worksheets("sheet3").PivotTables(1).PivotFields("year").PivotItems.Visible = False

Ho applicato questo codice sulla routine registrata ma facendo il debug ho ottenuto la stessa risposta.

Buona sera

Microsoft 365 e Office | Excel | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

4 risposte

Ordina per: Più utili
  1. Anonimo
    2012-03-08T14:31:16+00:00

    Scusa del ritardo, spero tu possa leggerla.

    Le routine sono tratte dal libro Passo per Passo Microsoft Office Excel 2007 Visual Basic for Applications di Reed Jacobson, edito da MONDADORI INFORMATICA

    La sequenza delle Routine è la seguente:

    Sub PivotFromExternal()

    'Crea un rapporto di Tabella Pivot da una tabella Acces esterna posta

    'nella stessa cartella documenti

    Dim wc As WorkbookConnection

    Dim pc As PivotCache

    Dim s As String

    Workbooks.Add

    'Crea una nuova cartella

    s = ThisWorkbook.Path & "\Orders.accdb" 'nella finestra immediata

    s = "OLEDB;Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & s

    'nella finestra immediata

    Set wc = ActiveWorkbook.Connections.Add("", "", s, "Orders", 3)

    'nella finestra immediata

    'Individua il percorso verso il file di Acces, modifica il seguente

    'codice:

    'Workbooks("Cartel5").Connections.Add "Orders", "", Array( _

        "OLEDB;Provider=Microsoft.ACE.OLEDB.12.0;Password="""";User ID=Admin;Data Source=C:\Documents and Settings\Administrator\My Documents\Doc" _

        , _

        "uments\Studio\Excel\Excel2007 e VBA - Passo per Passo\Orders.accdb;Mode=Share Deny Write;Extended Properties="""";Jet OLEDB:System" _

        , _

        " database="""";Jet OLEDB:Registry Path="""";Jet OLEDB:Database Password="""";Jet OLEDB:Engine Type=6;Jet OLEDB:Database Locking Mode=0" _

        , _

        ";Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="""";Jet OLEDB:Create Sy" _

        , _

        "stem Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Repl" _

        , "ica Repair=False;Jet OLEDB:SFP=False;Jet OLEDB:Support Complex Data=False"), _

        Array("Orders"), 3

    Set pc = ActiveWorkbook.PivotCaches.Create(xlExternal, wc) 'nella

    pc.CreatePivotTable ActiveCell 'nella finestra immediata

    'finestra immediata, modifica il seguente codice

    'ActiveWorkbook.PivotCaches.Create(SourceType:=xlExternal, SourceData:= _

        ActiveWorkbook.Connections("Orders"), Version:=xlPivotTableVersion12). _

        CreatePivotTable TableDestination:="Foglio1!R1C1", TableName:= _

        "Tabella_pivot2", DefaultVersion:=xlPivotTableVersion12

    End Sub

    Sub PivotSetStructure()

    'Successiva alla macro PivotFromExternal su Modulo6

    'Organizza una Tabella Pivot

    Dim pt As PivotTable

    Set pt = ActiveCell.PivotTable

    pt.PivotFields("Net").Orientation = xlDataField 'nella finesra immediata

    'Con xlDataField si converte il campo Net in un campo di dati, modifica

    'il seguente codice:

    'ActiveSheet.PivotTables("Tabella_pivot1").AddDataField ActiveSheet. _

        PivotTables("Tabella_pivot1").PivotFields("Net"), _

        "Somma di Net", xlSum

    pt.DataFields(1).Caption = "Net " 'nella finesra immediata

    'Invece di riferirci al campo specifico PivotItems("Somma di Net") si fa

    'riferimento ad esso come ad un campo dell'insieme DataFields, modifica

    'il seguente codice:

    'ActiveSheet.PivotTables("Tabella_pivot1").DataPivotField. _

        PivotItems("Somma di Net").Caption = "Net "

    pt.PivotFields("Category").Orientation = xlRowField 'nella finesra

    'immediata

    pt.PivotFields("State").Orientation = xlPageField 'nella finesra

    'immediata

    pt.PivotFields("Date").Orientation = xlColumnField 'nella finesra

    'immediata

    'Non essendo necessaria l'istruzione Position viene eliminata la

    'struttura With, modifica il seguente codice:

    'With ActiveSheet.PivotTables("Tabella_pivot1").PivotFields("Category")

        '.Orientation = xlRowField

        '.Position = 1

    'End With

    'With ActiveSheet.PivotTables("Tabella_pivot1").PivotFields("State")

        '.Orientation = xlPageField

        '.Position = 1

    'End With

    'With ActiveSheet.PivotTables("Tabella_pivot1").PivotFields("Date")

        '.Orientation = xlColumnField

        '.Position = 1

    'End With

    pt.ColumnFields("Date").DataRange.Cells(1).Group Periods:=Array(False, _

    False, False, False, False, True, True) 'nella finesra immediata

    'Si riferisce al campo Date per visualizzare i gruppi Trimestre e Anno

    ', True, True) invece d'indicare l'indirizzo, modifica il seguente codice:

    'Range("B4").Select

    'Selection.Group Start:=True, End:=True, Periods:=Array(False, _

        False, False, False, False, True, True)

    pt.DataBodyRange.Style = "Comma [0]" 'nella finesra immediata

    'Invece di registrare l'intervallo di dati con il metodo PivotSelect si

    'utilizza la proprietà DataBodyRange, modifica il seguente codice:

    'ActiveSheet.PivotTables("Tabella_pivot1").PivotSelect "", _

    'xlDataOnly, True

    'Selection.Style = "Comma [0]"

    End Sub

    Sub PivotSetLayoutProva()

    'Successiva alla macro PivotSetStructure su Modulo7

    'Che già conosci

    Dim pt As PivotTable

    Dim pf As PivotField

    Set pt = ActiveCell.PivotTable

    Set pf = pt.ColumnFields("Anni")

    pt.PageFields("State").CurrentPage = "Idaho"

    pt.RowFields("Category").ShowAllItems = True

    pf.ShowAllItems = True 'E' strano, i dati in Acces vanno dal

    '01/01/2005 al 01/10/2007, nell'elaborare la tabella questa istruzione

    'produce una colonna iniziale con il titolo <01/01/2005 e una colonna

    'finale con il titolo >02/10/2007 ovviamente senza dati. Nell'struzione

    'successiva abbiamo:

    pf.PivotItems(1).Visible = False 'che è riferita alla colonna con il

    'titolo <01/01/2005 che da l'errore, anche con la madro registrata.

    'La successiva istruzione è:

    pf.PivotItems(2).Visible = False 'che è riferita all'anno 2005 e

    'funziona, mentre l'ultima istruzione è:

    pf.PivotItems(pf.PivotItems.Count).Visible = False 'che è riferita alla

    'colonna con il titolo >02/10/2007 che da l'errore, anche nella versione

    'registrata. A questo punto sembrerebbe evidente che il problema risiede

    'nell'istruzione pf.ShowAllItems = True che pruduce due colonne inutili

    'che non possono essere nascostecon una routine.

    pt.RowGrand = False

    pt.HasAutoFormat = False

    pt.PageFields("State").CurrentPage = "(All)"

    pt.DataBodyRange.Columns(2).AutoFit

    pt.DataBodyRange.ColumnWidth = pt.DataBodyRange.Columns(2). _

        ColumnWidth + 1

    pt.DisplayFieldCaptions = False

    pt.ShowDrillIndicators = False

    End Sub

    Cordiali saluti

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2012-02-28T07:55:30+00:00

    Buona sera

    Scusami ma non ho capito dove devo postare il file di esempio nel sito indicato, comunque, in merito al codice suddetto ho fatto alcune prove ed ho scoperto che c'è effettivamente un limite nel programma-. Questo è il codice con le spiegazioni:

    <cut>

     

    Mah, le istruzioni sul sito Skydrive sono abbastanza chiare.

    Per le tue osservazioni.

    Importo in molte situazioni dati da vari db (fra i quali Access) in Excel via codice, quindi, sempre via codice creo tabelle pivot. A me non succede di avere colonne con titoli strani o cose inaspettate. Ma senza vedere il tuo codice e la struttura dei dati di origine della pivot, diventa difficile dare una risposta.

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2012-02-27T18:48:28+00:00

    Buona sera

    Scusami ma non ho capito dove devo postare il file di esempio nel sito indicato, comunque, in merito al codice suddetto ho fatto alcune prove ed ho scoperto che c'è effettivamente un limite nel programma-. Questo è il codice con le spiegazioni:

    Sub PivotSetLayoutProva()

    'Dati caricati in memoria da file Acces 2007 e trasformati in Tabella

    'Pivot con due routine non presenti

    Dim pt As PivotTable

    Dim pf As PivotField

    Set pt = ActiveCell.PivotTable

    Set pf = pt.ColumnFields("Anni")

    pt.PageFields("State").CurrentPage = "Idaho"

    pt.RowFields("Category").ShowAllItems = True

    pf.ShowAllItems = True 'E' strano, i dati in Acces vanno dal

    '01/01/2005 al 01/10/2007, nell'elaborare la tabella questa istruzione

    'produce una colonna iniziale con il titolo <01/01/2005 e una colonna

    'finale con il titolo >02/10/2007 ovviamente senza dati. Nell'struzione

    'successiva abbiamo:

    pf.PivotItems(1).Visible = False 'che è riferita alla colonna con il

    'titolo <01/01/2005 che da l'errore, anche con la madro registrata.

    'La successiva istruzione è:

    pf.PivotItems(2).Visible = False 'che è riferita all'anno 2005 e

    'funziona, mentre l'ultima istruzione è:

    pf.PivotItems(pf.PivotItems.Count).Visible = False 'che è riferita alla

    'colonna con il titolo >02/10/2007 che da l'errore, anche nella versione

    'registrata. A questo punto sembrerebbe evidente che il problema risiede

    'nell'istruzione pf.ShowAllItems = True che pruduce due colonne inutili

    'che non possono essere nascostecon una routine.

    pt.RowGrand = False

    pt.HasAutoFormat = False

    pt.PageFields("State").CurrentPage = "(All)"

    pt.DataBodyRange.Columns(2).AutoFit

    pt.DataBodyRange.ColumnWidth = pt.DataBodyRange.Columns(2). _

        ColumnWidth + 1

    pt.DisplayFieldCaptions = False

    pt.ShowDrillIndicators = False

    End Sub

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2012-02-27T08:56:35+00:00

    Non sono certo che questo sia il modo di far conoscere un codice che non funziona.

    Sistema Windows XP 64 Bit Professional

    In un testo di Office Excel 2007 Visual Basic for Application viene rielaborata una macro che modifica una tabella pivot esistente

    Sub PivotSetLayout()

    Dim pt As PivotTable

    Dim pf As PivotField

    Set pt = ActiveCell.PivotTable

    Set pf = pt.ColumnFields("Anni")

    pt.PageFields("State").CurrentPage = "Idaho"

    pt.RowFields("Category").ShowAllItems = True

    pf.ShowAllItems = True

    pf.PivotItems(1).Visible = False

    a questo punto viene la scritta: Errore Run-time '1004' impossibile trovare la proprietà PivotItems per la classe PivotField

    Ho provato a registrare una macro ma il risultato non cambia

    Nella guida del VBA ho trovato e provato il seguente codice per Oggetto PivotItems:

    Worksheets("sheet3").PivotTables(1).PivotFields("year").PivotItems.Visible = False

    Ho applicato questo codice sulla routine registrata ma facendo il debug ho ottenuto la stessa risposta.

    Buona sera

     

    Vediamo di capire.

    Queste due macro fanno esattamente quanto mi aspetto, visualizzando o nascondendo i valori relativi al 2010:

    Public Sub mMostra2010()

    Worksheets("Foglio4").PivotTables(1) _

        .PivotFields("Dato3").PivotItems("2010").Visible = True

    End Sub

    Public Sub mNascondi2010()

    Worksheets("Foglio4").PivotTables(1) _

        .PivotFields("Dato3").PivotItems("2010").Visible = False

    End Sub

    Con il tuo codice, cosa vuoi fare esattamente?

    Come è composta la tua pivot?

    Puoi, per favore, inserire un file di esempio e condividerlo qui: http://explore.live.com/skydrive , postando poi il link?

    Grazie.

    La risposta è stata utile?

    0 commenti Nessun commento