11
votes

Recréer les données source du cache à pivottage

J'essaie d'extraire les données source d'une pivottable qui utilise un cache pivottable et placez-le dans une feuille de calcul vierge. J'ai essayé ce qui suit mais cela renvoie une erreur définie par l'application ou définie par l'application. xxx

Documentation indique que pivotcache.recordset est un type ADO, donc cela devrait donc fonctionner. J'ai la bibliothèque ADO activée dans les références.

Toute suggestion sur la manière de y parvenir?


4 commentaires

Quelle est la valeur au moment de l'exécution de ceworkbook.pivotcaches (1) .Recordset ?


C'est un jeu d'enregistrements avec recordcount = 49, mais si j'essaie de faire ce qui suit, je reçois aussi une erreur définie par l'application ou une erreur définie par l'application: DIM objrecordset comme adodb.recordset Set objrecordset = ceworkbook.pivotcaches (1) .Recordset


Mettez the thewworkbook.pivotcaches (1) .Recordset dans la fenêtre de la montre pour voir quel type est exact. Cela devrait aider.


Au moment de l'exécution, le type de variable est entier / variante. Bien sûr objrecordset est un enregistrement de type. Dès que l'application est exécutée à ce document.pivotcaches (1) .Recordset affiche une erreur définie par l'application ou définie par objet dans la fenêtre de surveillance. Me conduit à croire que peut-être que j'oublie une référence. Peut-être quelque chose de spécifique à PivotCache? Merci de votre aide.


3 Réponses :


4
votes

Aller à la fenêtre immédiate et tapez

? Ceworkbook.pivotcaches (1) .Querytype

Si vous obtenez autre chose que 7 (xladorecordset), la propriété Recordset ne s'applique pas à ce type. de pivotcache et retournera cette erreur.

Si vous obtenez une erreur sur cette ligne, votre pivotcache n'est pas basé sur des données externes du tout.

Si vos données sources vient de ce travail (c.-à-d. Données Excel), alors vous pouvez utiliser

? Ceworkbook.pivotcaches (1) .Sourcedata

Pour créer un objet de plage et une boucle à travers elle.

Si votre QueryType est 1 (xlodbcquerie), alors SourceData contiendra la chaîne de connexion et le commandement de commandement à créer et de créer un enregistrement ADO, comme celui-ci: xxx

Vous avez besoin de la référence ADO, Mais vous avez dit que vous avez déjà cet ensemble.


2 commentaires

Debug.Print Ceworkbook.PivotCaches (1) .Querytype jette une erreur. Pivotcaches (1) .Sourcedata renvoie le chemin d'accès au classeur externe sur lequel les données source ont été stockées. La table pivot a été créée à l'aide de données à partir d'un classeur externe (pivottable (1) .SaveData est vrai) qui a depuis été supprimé. Je souhaite recréer les données source d'origine du cache pivot. Lorsque vous dites "Créer un objet de gamme de SourceData et boucle à travers elle", je suppose que vous voulez dire une plage d'utilisation (SOURCEDATA) pour référencer l'objet de la plage spécifié par SourceData, mais qui n'est pas disponible pour moi. Merci de votre aide.


Si vous double-cliquez sur une cellule dans une table pivot ou cliquez avec le bouton droit de la souris et sélectionnez «Afficher les détails» Excel exporte les données source pour ce calcul sur une nouvelle feuille de calcul dans le même classeur. Vous ne pouvez faire que cette cellule à la fois. Je dois le faire pour toute la table de pivot, puis automatiser le processus.



15
votes

Malheureusement, il semble y avoir aucun moyen de manipuler directement PivotCache dans Excel.

J'ai trouvé un travail autour. Le code suivant extrait le cache pivot de chaque table de pivotement trouvé dans un classeur, la place dans une nouvelle table de pivot et ne crée qu'un seul champ de pivotements (pour vous assurer que toutes les lignes du cache pivot sont incorporées au total), puis des incendies ShowDetail, qui crée une nouvelle feuille avec toutes les données de la table pivot. P>

J'aimerais toujours trouver un moyen de travailler directement avec Pivotcache, mais cela obtient le travail effectué. P>

Public Sub ExtractPivotTableData()

    Dim objActiveBook As Workbook
    Dim objSheet As Worksheet
    Dim objPivotTable As PivotTable
    Dim objTempSheet As Worksheet
    Dim objTempPivot As PivotTable

    If TypeName(Application.Selection) <> "Range" Then
        Beep
        Exit Sub
    ElseIf WorksheetFunction.CountA(Cells) = 0 Then
        Beep
        Exit Sub
    Else
        Set objActiveBook = ActiveWorkbook
    End If

    With Application
        .ScreenUpdating = False
        .DisplayAlerts = False
    End With

    For Each objSheet In objActiveBook.Sheets
        For Each objPivotTable In objSheet.PivotTables
            With objActiveBook.Sheets.Add(, objSheet)
                With objPivotTable.PivotCache.CreatePivotTable(.Range("A1"))
                    .AddDataField .PivotFields(1)
                End With
                .Range("B2").ShowDetail = True
                objActiveBook.Sheets(.Index - 1).Name = "SOURCE DATA FOR SHEET " & objSheet.Index
                objActiveBook.Sheets(.Index - 1).Tab.Color = 255
                .Delete
            End With
        Next
    Next

    With Application
        .ScreenUpdating = True
        .DisplayAlerts = True
    End With

End Sub


2 commentaires

C'est une excellente solution de contournement, merci de la publier. Je viens d'essayer cela dans Excel 2010 et pour une raison quelconque a eu une erreur sur la ligne .Showdetail. Cependant, je pourrais alors faire manuellement manuellement (via le menu contextuel d'interface utilisateur) sur la table pivot de pivot cellulaire, ce code généré et obtenir une nouvelle feuille créée de cette façon.


Sous Excel 2010 au moins, la ligne: ".Range (" B2 "). ShowDetail = True" devrait réellement être: ".Range (" A2 "). ShowDetail = vrai" (A2 plutôt que b2)



0
votes

Je me suis retrouvé avoir le même problème, avoir besoin de gratter des données par programmation à provenir de différentes excelles avec des données pivotes en cache. Bien que le sujet soit un peu vieux, il n'ya toujours aucun moyen direct d'accéder aux données.

ci-dessous Vous pouvez trouver mon code, ce qui est un raffinement plus généralisé de la solution déjà affichée.

La différence majeure est la élimination du filtre des champs , car parfois pivot est livré avec des filtres sur, et si vous appelez .Showdetail, il manquera des données filtrées.

Je l'utilise pour gratter format de fichier différent sans avoir à les ouvrir, il me servant assez bien jusqu'à présent.

espère que c'est utile.

crédit à la feuille de calcul du filtreGuru.com (bien que je Ne vous souvenez pas à quel point est l'original et combien est le mien d'être honnête) xxx


0 commentaires