2009-12-08 5 views
0

J'ai essayé d'enregistrer le code pour mettre à jour un sourcedata de pivot qui m'a donné ceci:Excel VBA: Mise à jour Pivot sourceData

ActiveSheet.PivotTableWizard SourceType:=xlExternal, _ 
    SourceData:=QueryArry1, _ 
    Connection:=Array(_ 
     Array("ODBC;DSN=MS Access Database;DBQ=" & DBDir & "\" & DBName & ";"), _ 
     Array("DefaultDir=" & DBDir & ";DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;") _ 
    ) 

Mais cela ne me permet même pas de spécifier la table pivot que je veux mettre à jour. .. ou même faire ce que je veux vraiment faire qui est de mettre à jour le pivot de sorte que tous les tableaux croisés dynamiques utilisant cette même source sont mis à jour.

Alors, quel est un bon moyen de mettre à jour le sourcedata?

Merci

EDIT:

Mais avec quelque chose d'aussi simple que je même l'erreur "application définie ou un objet défini erreur":

str = Sheets("Totals").PivotTables("PivotTable2").PivotCache.CommandText 
Sheets("Totals").PivotTables("PivotTable2").PivotCache.CommandText = str 

Et je l'ai fait deux vérifier que mon tableau croisé dynamique frappe toujours les données en direct et l'actualiser fonctionne toujours ... pourtant je ne peux pas placer la chaîne de commande à ce qu'elle est actuellement? Tellement bizarre.

Merci

Répondre

5

Les PivotCaches sont accessibles par Workbooks. Vous pouvez lister tous vos caches en cours avec les sous:

Option Explicit 

Private Sub listCaches() 
    Dim selectedCache As PivotCache 

    For Each selectedCache In ThisWorkbook.PivotCaches 
     Debug.Print selectedCache.Index 
     Debug.Print selectedCache.Connection 
    Next selectedCache 

End Sub 

Vous pouvez accéder à la connexion que vous souhaitez modifier avec:

ThisWorkbook.PivotCaches(yourIndex).Connection 

Remarque: Après avoir changé la connexion que vous devez appeler:

ThisWorkbook.PivotCaches(yourIndex).Refresh 

Modifier: Au lieu de modifier les données sources, vous pouvez modifier le texte de commande. Cela devrait avoir le même effet. Le code suivant a fonctionné pour moi:

ThisWorkbook.PivotCaches(1).CommandText = "SELECT movies.title, movies.rating, movies.comments FROM `C:\Folder\moviesDB`.movies movies" 
ThisWorkbook.PivotCaches(1).Refresh 

Ce code a également mis à jour mon SourceData.

Edit2: Changer CommandText throgh tableau croisé dynamique:

Sheets("mySheet").PivotTables("PivotTable1").PivotCache.CommandText = "SELECT movies.title as meh, movies.rating, movies.comments FROM `C:\Folder\moviesDB`.movies movies" 
Sheets("mySheet").PivotTables("PivotTable1").PivotCache.Refresh 

Note: moviesDB est un fichier .mdb et des films est la table/requête

Note2: Il peut également vous aider à Debug.Print le travail CommandText avant de le changer. Cela devrait vous donner un modèle pour votre nouveau CommandText.

+0

La connexion est bien, j'essaye de changer le SourceData ... mais j'obtiens "Erreur définie par l'application ou définie par l'objet" quand j'essaye de "ThisWorkbook.PivotCaches (2) .SourceData = QueryArry1" .. Je commence à penser que ce type de référence SourceData est en lecture seule et ne peut pas être utilisé pour définir la valeur. J'ai essayé plusieurs différentes formes de QueryArry1, y compris "QueryArry1 = ThisWorkbook.PivotCaches (2) .SourceData" ... Je reçois toujours la même erreur – Dan

+1

Je ne suis pas sûr du contenu de votre QueryArry mais je suppose que vous voulez changez la requête qui est envoyée à la base de données. Changer CommandText a fonctionné pour moi. J'ai ajouté un exemple de code dans ma réponse. – marg

+0

Les caches de Pivot continuent à changer leur index ... Donc j'essaye la commande: "Sheets (" Totals "). PivotTables (" PivotTable1 ").PivotCache.CommandText = "SELECT * FROM Totals" "mais il me donne l'erreur:" erreur définie par l'application ou définie par l'objet " – Dan