IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Code VBA actualise plusieurs TCD [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Conseiller en pilotage
    Inscrit en
    Décembre 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Conseiller en pilotage
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2017
    Messages : 3
    Par défaut Code VBA actualise plusieurs TCD
    Bonjour, je viens vers vous après 3 heures de recherche... Je souhaite actualiser plusieurs TCD par code VBA... Alors c'est très curieux car le premier TCD se met bien à jour mais cela plante à partir du deuxième. Voilà le code :

    Sheets("EJ_Agences").Select
    ActiveSheet.PivotTables("TCD1").PivotCache.SourceData = Worksheets("Donnees").Range("A1:Z" & DerLi_Donnees2).Address(, , xlR1C1, True)
    ActiveSheet.PivotTables("TCD1").PivotCache.Refresh
    Sheets("EJ_Volumes").Select
    ActiveSheet.PivotTables("TCD2").PivotCache.SourceData = Worksheets("Donnees").Range("A1:Z" & DerLi_Donnees2).Address(, , xlR1C1, True)
    ActiveSheet.PivotTables("TCD2").PivotCache.Refresh
    Sheets("EJ_GV").Select
    ActiveSheet.PivotTables("TCD3").PivotCache.SourceData = Worksheets("Donnees").Range("A1:Z" & DerLi_Donnees2).Address(, , xlR1C1, True)
    ActiveSheet.PivotTables("TCD3").PivotCache.Refresh
    Sheets("EJ_DRL").Select
    ActiveSheet.PivotTables("TCD4").PivotCache.SourceData = Worksheets("Donnees").Range("A1:Z" & DerLi_Donnees2).Address(, , xlR1C1, True)
    ActiveSheet.PivotTables("TCD4").PivotCache.Refresh
    Sheets("40pc").Select
    ActiveSheet.PivotTables("TCD5").PivotCache.SourceData = Worksheets("Donnees").Range("A1:Z" & DerLi_Donnees2).Address(, , xlR1C1, True)
    ActiveSheet.PivotTables("TCD5").PivotCache.Refresh

    Chaque TCD porte bien le nom entre guillemet et chaque TCD a la même source de données.

    Le code plante donc à partir du TCD2

    Avez-vous des solutions ?

    Merci

  2. #2
    Expert éminent

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 564
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 564
    Par défaut
    Bonjour

    Tous les TCD basés sur une même source partagent le même cache donc inutile de l’actualiser plus d'une fois ! L'actualisation de l'un actualise tous les TCD utilisant ce cache

    Inutile de sélectionner une feuille pour actualiser le cache...

    Un TCD doit être construit sur un tableau structuré de préférence, pas une plage...

  3. #3
    Expert confirmé Avatar de hyperion13
    Homme Profil pro
    Webplanneur
    Inscrit en
    Octobre 2007
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Réunion

    Informations professionnelles :
    Activité : Webplanneur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 288
    Par défaut
    A tester:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub RefreshTCDs()
    Dim Tcd As PivotTable
    Dim Ws As Worksheet
        For Each Ws In ThisWorkbook.Worksheets
            For Each Tcd In Ws.PivotTables
                Tcd.RefreshTable
            Next Tcd
        Next Ws
    End Sub

  4. #4
    Expert éminent

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 564
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 564
    Par défaut
    RE

    INUTILE !

    Si la source a un grand nombre de lignes la répétition inutile de l'actualisation du même cache sature sans doute...

  5. #5
    Candidat au Club
    Homme Profil pro
    Conseiller en pilotage
    Inscrit en
    Décembre 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Conseiller en pilotage
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2017
    Messages : 3
    Par défaut ... suite...
    Merci pour vos réponses... en effet j'avais lu que le TCD est alimenté par un cache...
    J'imagine qu'il s'agit d'une formule dans le gestionnaire de nom... je vais donc tenter d'actualiser la plage de ce nom avec mon code et ensuite je vais donner comme source de données ce nom à mon TCD.
    Sinon oui j'ai choisi cette méthode car au départ j'avais bien créé un tableau et je n'avais en effet pas à m'embêter à modifier la plage de donnée du TCD, celui-ci étant basé sur le tableau directement.
    Le problème est que mon fichier contient 50 000 lignes de la colonne A à Z et que la mise à jour des données et leur actualisation en vba, ou pas d'ailleurs, prend un temps fou sur mon ordi.
    Ce temps est divisé par 10, sérieusement, lorsque le tableau est supprimé et le TCD basé une plage fixe.
    Voilà pour les explications.
    Je tente mon code demain, je n'ai pas mon ordi ce soir.
    Merci en tous cas.
    Je reviens vers vous si je ne trouve pas de solution.
    Cordialement
    David

  6. #6
    Expert éminent

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 564
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 564
    Par défaut
    RE

    Le cache est automatiquement créé et n'est référencé nulle part sauf en VBA .

    N'aurais tu pas défini le tableau au delà de la plage remplie ? Un tableau ne doit JAMAIS contenir de lignes vides : il s'adapte automatiquement...

    On peut éventuellement utiliser l'ancienne méthode avec une formule nommée à base de DECALER.

    En relisant ton code, je pense qu'il démultiplie en fait les caches en redéfinissant un cache pour chaque TCD...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WD-2010] Partager du code VBA entre plusieurs modèles
    Par flopflop78 dans le forum VBA Word
    Réponses: 5
    Dernier message: 31/01/2014, 11h25
  2. Insérer un seul code vba dans plusieurs classeurs férmés
    Par jakoubi dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 26/02/2013, 23h35
  3. [XL-2007] Partager du code VBA entre plusieurs fichiers
    Par blumea dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 06/03/2012, 16h30
  4. [Toutes versions] Partager du code VBA entre plusieurs bases
    Par guidav dans le forum VBA Access
    Réponses: 5
    Dernier message: 02/03/2012, 23h25
  5. [PPT-2007] Utiliser du code VBA sur plusieurs objets et pas qu'un seul
    Par beegees dans le forum VBA PowerPoint
    Réponses: 1
    Dernier message: 25/03/2010, 09h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo