Impossibile aggiungere CubeField / PivotField come campo dati in VBA


0

Sto lavorando a una Macro molto lunga per il mio lavoro e ho appena finito, ma questa è l'ultima parte e non importa cosa faccio, non riesco a capire la correzione. In questa tabella pivot, ho bisogno di avere "manager" come le colonne e tutto il resto (vale a dire tutti i mesi) nella sezione valori, con "valori" come le righe. Dopo aver armeggiato, sembra che tutti i campi registrati come CubeFields invece di PivotFields. Quando lo eseguo, non appena arriva a .Orientation = xlDataField, genera un "Errore di run-time 5 ... Call o argomento della procedura non valido." Devo anche assicurarmi che quei DataField siano mediati e in un formato numerico specifico. Niente di ciò che faccio funziona e qualsiasi consiglio / soluzione / soluzione alternativa sarebbe molto apprezzata! Di seguito sono riportati la macro e un link per il download del file per armeggiare.

Dim pvtTable As PivotTable
Dim cubField As CubeField
Dim i As Long
Dim cubName As String

Set pvtTable = ActiveSheet.PivotTables(1)
For Each cubField In pvtTable.CubeFields
    For i = 1 To pvtTable.CubeFields.Count
        With pvtTable.CubeFields(i)
            If .Name = "[effRent_perBed].[Manager]" Then
                .Orientation = xlColumnField
           Else:
                .Orientation = xlDataField
                'has to be averaged
                'has to have number format of ##0.00
            End If

        End With
    Next
Next

Questa è una modifica che ho provato a fare in base al registratore di macro. Mette il campo nel campo dei valori, ma non c'è modo di cambiarlo in una media. Elenca semplicemente tutti i valori come "1 (Controlla l'immagine per un visual) . Quando arrivo a .Function = xlAverage, si dice Errore 1004: Impossibile impostare la proprietà Function della classe PivotField.

                If Name = "[effRent_perBed].[Manager]" Then
                    .Orientation = xlColumnField
                Else:
                    With ActiveSheet.PivotTables(1)
                        .AddDataField ActiveSheet.PivotTables(1) _
                        CubeFields(cubName), _
                        "Average of " & cubName
                    End With

                    With ActiveSheet.PivotTables(1).PivotFields(cubName)
                        .Caption = "Average of " & cubName
                        .Function = xlAverage
                    End With

Quando uso il registratore di macro per aggiungere qualcosa al campo dati, ottengo questo:

ActiveSheet.PivotTables("effRent_perBed_Pivot").CubeFields.GetMeasure _
    "[effRent_perBed].[Jan-16]", xlSum, "Sum of Jan-16"
ActiveSheet.PivotTables("effRent_perBed_Pivot").AddDataField ActiveSheet. _
    PivotTables("effRent_perBed_Pivot").CubeFields("[Measures].[Sum of Jan-16]"), _
    "Sum of Jan-16"
With ActiveSheet.PivotTables("effRent_perBed_Pivot").PivotFields( _
    "[Measures].[Sum of Jan-16]")
    .Caption = "Average of Jan-16"
    .Function = xlAverage
End With

Questa è una copia del file su cui sto lavorando. Mostra la tabella pivot non elaborata e quindi il prodotto finito. Devo farlo per 3 fogli, quindi devo passare in rassegna ciascuno di essi. https://drive.google.com/uc?export=download&id=1NLGg8DVEMHnB2Ad7NAKWySevq8naqFjr

Questo è anche pubblicato su altri forum (ho bisogno di avere più occhi su questo al più presto possibile) https://www.excelforum.com/excel-programming-vba-macros/1222588-unable-to-add-cubefield-pivotfield-as-a-data-field-in-vba.html#post4856940

https://www.mrexcel.com/forum/excel-questions/1046038-unable-add-cubefield-pivotfield-data-field-vba.html

https://www.ozgrid.com/forum/node/1200403


Ti ho downvoted perché hai postato questo in più forum. Sì, lo hai sottolineato, ma non è ancora accettabile al punto che la maggior parte delle persone non si preoccupi di rispondere alla tua domanda. Perché? Perché mentre puoi desiderare di avere il maggior numero di occhi su questo al più presto, se viene risposto in più posti da più persone, avrai perso il tempo di alcuni di quegli occhi. Si prega di scegliere un solo forum. Si prega di leggere excelguru.ca/content.php?184 per il motivo per cui questo è un problema.
jeffreyweir

Per quanto riguarda la tua domanda, il modo più semplice per risolvere problemi come questo è accendere il registratore di macro, cambiare l'orientamento di un codice manualmente, arrestare il registratore e vedere quale codice sputa il registratore di macro. Probabilmente ti darà la sintassi corretta di cui hai bisogno. Se sei ancora perso, inserisci quel codice nella tua domanda originale.
jeffreyweir

@jeffreyweir Questa è la mia prima pubblicazione, non sapevo che il cross-posting fosse un grande tabù. Ho provato a utilizzare il registratore e più volte e quando si tenta di replicare e scalare quel codice, non funziona mai correttamente.
Andrew Stahl

Capisco che non puoi far funzionare il registratore di macro. Ma pubblicare il codice generato dalla macro nella tua domanda è di grande aiuto per i rispondenti come me, perché di solito possiamo capire cosa non va facendo semplicemente guardando quel codice e confrontandolo con ciò che hai fatto. In caso contrario, dobbiamo creare una tabella pivot di esempio ed eseguire autonomamente questo passaggio, che è un vero PITA.
jeffreyweir

Ho appena fatto l'aggiornamento!
Andrew Stahl

Risposte:


0

La tua domanda potrebbe ancora essere approfondita. Ad esempio, non si dice se si sta creando una tabella pivot da zero e quindi aggiungendo campi o se questa viene eseguita su una tabella pivot esistente che potrebbe contenere già dei campi.

Qualcuno mi ha appena indicato il Rubber Duck Problem Solving / blog post e ti indicherò anche questo, perché aiuta le persone a rispondere se sanno tutto ciò che è rilevante.

A https://msdn.microsoft.com/en-us/vba/excel-vba/articles/pivottable-adddatafield-method-excel dice che la sintassi per .adddatafield è AddDataField (Field, Caption, Function) con la funzione opzionale.

Quindi cosa succede se provi questo?

If Name = "[effRent_perBed].[Manager]" Then
    .Orientation = xlColumnField
 Else:
    With ActiveSheet.PivotTables(1)
        .AddDataField ActiveSheet.PivotTables(1) _
            CubeFields(cubName), _
            "Average of " & cubName, _
            xlAverage
    End With
End if

Ci sono alcuni problemi con il tuo blocco di codice originale. Non capisco perché stai entrambi iterando attraverso la collezione CubeFields e anche iterando attraverso un numero di cubi. cioè questo bit:

For Each cubField In pvtTable.CubeFields
    For i = 1 To pvtTable.CubeFields.Count

Non sta andando semplicemente a scorrere tutto dal quadrato di Cubefields.count? Dovresti essere in grado di eliminare quello For i = 1 A pvtTable.CubeFields.Count bit e utilizzare semplicemente il riferimento cubField direttamente.

Penso che il motivo per cui il codice non è riuscito a impostare la ricapitolazione su XLAverage è perché una volta aggiunto un campo all'area Dati, il nome cambia in modo efficace. Puoi vedere questo se lasci DataField sul posto ed esegui questo codice:

Sub Macro1()
'
' Macro1 Macro
'
Dim pvtTable As PivotTable
Dim cubField As CubeField
Dim i As Long
Dim cubName As String

Set pvtTable = ActiveSheet.PivotTables(1)
For Each cubField In pvtTable.CubeFields
    Debug.Print cubField.Name
Next

End Sub

Questo stamperà i nomi di tutti i campi nella finestra immediata (supponendo che tu abbia aperto), a quel punto vedrai che mentre avrai un risultato per [effRent_perBed]. [Manager], questo NON è il campo di dati. Il DataField sarà qualcosa come [Misure]. [Media di effRent_perBed]

Ed è per questo che il tuo codice ha fallito: ti stavi ancora riferendo al campo di interesse come se fosse ancora un CubeField. Ma non appena lo provi, aggiungilo all'area DataFields, viene creato un nuovo DataField e quello è quello di cui avevi bisogno per modificare l'aggregazione per.

Come ho detto sopra però, puoi farlo nel momento in cui crei il DataField.


Quest'ultima parte ha molto senso. Ad un certo punto stavo controllando i nomi nella finestra locale e ho notato che dopo tutti i campi diceva "[Measures]. [XlAverage ...]" Ora vedo dopo aver controllato il registratore di macro che aggiungiamo il campo di misura . A questo punto devo capire come fare in modo che questa dinamica funzioni in un loop, così posso aggiungere campi multipli. Purtroppo il disco rigido del mio computer è morto, quindi sto cercando di salvare ciò che posso. Grazie ancora per tutto il tuo aiuto @jeffreyweir!
Andrew Stahl

Nessun problema ... questa roba è fonte di confusione per gli iniziati, per non parlare dei non iniziati :-) Non dimenticare di contrassegnare la mia risposta come accettata se risolve il problema per te.
jeffreyweir
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.