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 :

Changer la source de données dans plusieurs TCD [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juillet 2009
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 54
    Points : 35
    Points
    35
    Par défaut Changer la source de données dans plusieurs TCD
    Bnjour tout le monde,

    Je travaille avec un fichier dans lequel j'ai une vingtaine de de TCD.
    Chaque mois, ma source de données change et je dois donc faire un update des TCD une par une.

    Je me doute qu'il y a moyen de faire cela à l'aide d'une macro, mais je ne sais absolument pas coder cela.

    Pourriez-vous m'aider svp?? (et me faire gagner des heures entières chaque mois )

    Merci mille fois,

    Cordialement

    Jenna

  2. #2
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    Bonjour,

    Le problème, c'est que ça dépend de l'emplacement de la plage de données. Pour mes tests, j'ai fait un exemple simple avec des données en colonne A et B de Feuil1. Copie cette macro dans le module de la feuille contenant les données source. J'ai fait les tests avec XL2010, aussi il faudra peut-être changer "xlPivotTableVersion14" en "xlPivotTableVersion12" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    Private Sub Worksheet_Change(ByVal Target As Range)
        Dim PlageSource As Range, Sh As Worksheet, Pt As PivotTable
        With Sheets("Feuil1")
            Set PlageSource = .Range(.[A1], .Cells(.Rows.Count, 2).End(xlUp))
            If Not Intersect(PlageSource, Target) Is Nothing Or _
            (PlageSource.Cells.Rows.Count + 1 = Target.Row And _
            Target.Column <= PlageSource.Cells.Columns.Count) Then
                Application.EnableEvents = False
                Set PlageSource = .Range(.[A1], .Cells(.Rows.Count, 2).End(xlUp))
                For Each Sh In Worksheets
                    For Each Pt In Sh.PivotTables
                        Pt.ChangePivotCache _
                            ThisWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
                            "Feuil1!" & PlageSource.Address, Version:=xlPivotTableVersion14)
                        Pt.RefreshTable
                    Next Pt
                Next Sh
                Application.EnableEvents = True
            End If
        End With
    End Sub

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juillet 2009
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 54
    Points : 35
    Points
    35
    Par défaut
    Bonjour Daniel,

    J'ai essayé ton code, il a partiellement fonctionné, ça a changé les deux premières colonnes dans mon TCD, (tout le reste était blanc vu que ça n'a pas tenu compte des autres colonnes je suppose). Malheureusement excel a planté et depuis, j'ai beau essayer de nouveau maintenant plus moyen de faire fonctionner.

    Voici un fichier excel, un exemple très simplifié de ce que j'utilise en général, çàd:
    - Une feuille de donnée que j'actualise chaque avec un nombre variable de lignes en plus (le nombre de colonne restant toujours le même)
    - Plusieurs autres feuilles contenant chacune plusieurs TCD.

    Les feuilles que j'appelle "current 1 et 2" sont les feuilles avant que je n'ajoute mes données.

    Les feuilles after: sont en fait celle que je voudrais avoir automatiquement. C'est à dire, lorsque je rajoute les données en gras ( c'est à dire mes données mensuelles qui ne sont pas toujours un nombre fixe de lignes), j'aimerais que mes TCD changent automatiquement pour me donner ce résultat sans que je ne doive à chaque fois aller sur chaque TCD, changer la source de donnés pour chacun d'eux, etc...

    Est-ce que je suis assez claire dans mes explications??

    Merci de ton aide,

    Bien à toi,

    Jenna
    Fichiers attachés Fichiers attachés

  4. #4
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    Je ne suis pas sûr de bien comprendre :

    Les feuilles after: sont en fait celle que je voudrais avoir automatiquement. C'est à dire, lorsque je rajoute les données en gras
    Est-ce qu'il ne faut tenir compte que des données ajoutées en gras ? Le tableau de données sert-il à alimenter tous les TCD et la plage source est-elle la même pour tous les TCD (même nombre de colonnes par exemple ? Je pourrais vérifier moi-même, mais, si tu as la réponse, on gagnera du temps.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Juillet 2009
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 54
    Points : 35
    Points
    35
    Par défaut
    J'ai mis les tables after 1 et 2 juste pour donner un aperçu de ce que je voulais, mais en temps normal, mon fichier se composerait des data, current 1 et current 2.

    Est-ce qu'il ne faut tenir compte que des données ajoutées en gras ?
    Pour les tables after 1 et 2 il faut tenir compte de toutes les données de la feuille data: les anciennes données + les nouvelles données. (j'ai mis du gras afin de distinguer les anciennes, des nouvelles données).

    Le tableau de données sert-il à alimenter tous les TCD et la plage source est-elle la même pour tous les TCD (même nombre de colonnes par exemple ?
    Le tableau de données sert en effet à alimenter tous les TCD et la plage source est la même pour tous les TCD.

    Lorsque je change ma feuille data en faisant une mise à jour des données, j'ajoute des lignes, mais le nombre de colonnes reste le même.
    Et les TCD se baseront toutes sur la nouvelle plage de donnée.

    Est-ce plus claire?

  6. #6
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    Mets la macro suivante dans le module de la feuille "data" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    Private Sub Worksheet_Change(ByVal Target As Range)
        Dim PlageSource As Range, Sh As Worksheet, Pt As PivotTable
        With Sheets("data")
            Set PlageSource = .Range(.[A1], .Cells(.Rows.Count, 6).End(xlUp))
            If Not Intersect(PlageSource, Target) Is Nothing Or _
            (PlageSource.Cells.Rows.Count + 1 = Target.Row And _
            Target.Column <= PlageSource.Cells.Columns.Count) Then
                Application.EnableEvents = False
                Set PlageSource = .Range(.[A1], .Cells(.Rows.Count, 6).End(xlUp))
                For Each Sh In Worksheets
                    For Each Pt In Sh.PivotTables
                        Pt.ChangePivotCache _
                            ThisWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
                            "data!" & PlageSource.Address, Version:=xlPivotTableVersion14)
                        Pt.RefreshTable
                    Next Pt
                Next Sh
                Application.EnableEvents = True
            End If
        End With
    End Sub

  7. #7
    Nouveau membre du Club
    Inscrit en
    Juillet 2009
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 54
    Points : 35
    Points
    35
    Par défaut
    Je vais essayer cela merci
    Encore juste une petite question, si jamais j'ai plus de colonnes il suffit de changer le '6'?

    Bien à toi,

    Jenna

  8. #8
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    Exact.

  9. #9
    Nouveau membre du Club
    Inscrit en
    Juillet 2009
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 54
    Points : 35
    Points
    35
    Par défaut
    Merci mille fois Daniel. Au fait, encore une petite question, (hum oui j'ai l'art de faire des fichiers excel compliqués) Si dans mon fichier, j'ai des TCD qui se bases sur d'autres sources de données que la feuille data, mais dans le même fichier. Je suppose que cela posera problème pour la macro.
    Y a t il un moyen simple de résoudre cela?

    Encore merci merci merci!!

    Jenna

  10. #10
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    Il faut que je connaisse le nom des feuilles contenant les datas.

  11. #11
    Nouveau membre du Club
    Inscrit en
    Juillet 2009
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 54
    Points : 35
    Points
    35
    Par défaut
    MT price
    (à préciser, cette feuille sera aussi à mettre à jour et entraînera la mise à jour automatique des TCDs qui lui sont liés--> traitement identique que data)

  12. #12
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    Je vais te mettre à contribution, car ça devient complexe. Donc tu vas définir pour chaque source de données une plage dynamique. Avec ton exemple, la plage de la feuille "data sera définie par le nom :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =DECALER('data'!$A$1:$F$1;;;NBVAL('data'!$A:$A))
    Tu pourrais aussi utiliser les nouveaux tableaux XL2007 (Insertion, tableau).

    Une fois que tu as défini les plages sources, tu cliques dans un tableau, sur l'onglet "Options", sur "changer la source de données" et tu remplaces la plage par le nom que tu viens de définir. Ces plages sont dites dynamiques car elles se dimensionnent selon que tu ajoutes ou retranches des données. Dans le module "thisworkbook", ajoute :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
        Dim Plage As String, Pt As PivotTable
        Application.EnableEvents = False
        If Sh.Name = "MT Price" Or Sh.Name = "data" Then
            ThisWorkbook.RefreshAll
        End If
        Application.EnableEvents = True
     
    End Sub

  13. #13
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    Bizarrement, ta dernière réponse n'apparaît pas. Peux-tu mettre ton classeur en pièce jointe ?

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 10/04/2012, 12h06
  2. Changer la source de données d'un TCD
    Par mat75019 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 10/06/2009, 12h23
  3. Réponses: 1
    Dernier message: 11/12/2008, 10h39
  4. Réponses: 5
    Dernier message: 23/02/2007, 15h56
  5. Réponses: 6
    Dernier message: 15/04/2004, 11h04

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