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 :

Créer un TCD par macros


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Femme Profil pro
    Responsable de compte
    Inscrit en
    Février 2016
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Février 2016
    Messages : 25
    Points : 4
    Points
    4
    Par défaut Créer un TCD par macros
    Bonjour je souhaite créer un TCD via une macros dont la longueur est inconnu
    Je m'y connais pas niveau macros

  2. #2
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Salut.

    Il est en général beaucoup plus simple de créer le TCD en Excel, puis de l'actualiser et/ou le manipuler par macro. Si en plus tu n'y connais rien en VBA...

    J'ai rarement Je n'ai jamais eu besoin de créer un TCD par macros, en plus de vingt ans de travail professionnel avec Excel
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour Jmila et Pierre,
    Oui je sui d'acore, j'ai quand même développé une classe pour les les novices du forum!

    Nous arrivons à la saison du TDC!

    Il suffit de faire un click droit sur mon module de classe el le faire glisser sur le projet de ton fichier Excel!

    Ensuite il faut adapter la sub test!

    http://www.developpez.net/forums/d14...t/#post7769955

  4. #4
    Candidat au Club
    Femme Profil pro
    Responsable de compte
    Inscrit en
    Février 2016
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Février 2016
    Messages : 25
    Points : 4
    Points
    4
    Par défaut
    Bonjour
    Je comprends que ce n'est pas compliqué mais je le fais tous les jours donc c'est pour moi répétitif alors quand j'ai vu qu'on pouvais faire des macros du coup je me suis dis pourquoi pas ....
    Merci pour le lien
    Mais j'y comprend rien du tout dsl
    Mon fichier est variable tous les jours c'est pour ça que je bloque
    J'ai excel 2010
    Je l'ai fait avec l'enregistreur mais ça ne fonctionne pas pour tous les fichers ....

    Merci pour votre réponse

  5. #5
    Expert éminent sénior

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 420
    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 420
    Points : 16 264
    Points
    16 264
    Par défaut
    Bonjour

    Comme Pierre je pense que c'est plus un problème de méthodologie de traitement des données et que le VBA n'est peut-être voir sûrement pas nécessaire.

    "Mon fichier est variable tous les jours c'est pour ça que je bloque" ne suffit pas à comprendre l'ensemble de ta problématique et te donner des pistes.

    Le module proposé par rdurupt (Apparté pour rdurupt toujours à ta dispo pour peaufiner ) te fournit tout prémâché : il y a juste à adapter...

    Donc commence par bien exposer ton contexte exact sinon on ne peut guère t'aider davantage.
    Chris
    PowerQuery existe depuis plus de 13 ans, est totalement intégré à Excel 2016 &+. Utilisez-le !

    Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson.
    Confucius

    ----------------------------------------------------------------------------------------------
    En cas de résolution, n'hésitez pas cliquer sur c'est toujours apprécié...

  6. #6
    Candidat au Club
    Femme Profil pro
    Responsable de compte
    Inscrit en
    Février 2016
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Février 2016
    Messages : 25
    Points : 4
    Points
    4
    Par défaut
    Ok
    Merci
    Je vais abandonner la macros
    Salut

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour tous et bonjour 78chris,
    Oui je n'ai pas oublié, mais je traverses une période over!

    J'ai même pas trouvé le temps de rédiger mon poste mais je comte toujours sur toi.
    Il faut que j'affute mon crayon et je m'y colle! Promis.

  8. #8
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Comme Chris, je ne comprends pas bien ton problème, en fait.

    Avec les versions XL depuis la 2007, planter le décor d'un TCD se fait en deux clics sur base d'un tableau de données. Placer les champs te prends le temps de quelques glisser-déplacer... Je suppose que chaque jour, tes données sont différentes en nombre de lignes, mais que les colonnes sont identiques. Dès lors, il suffit de mettre ton tcd à jour (clic droit>Actualiser). Je ne vois pas en quoi cela nécessite des macros.

    Au pire, on peut automatiser la mise à jour par une ligne de code dans l'événement Activate de la feuille concernée.

    Personnellement, je ne connais pas d'activités dans laquelle on doit repartir de zéro chaque jour. Je n'ai en tout cas jamais rencontré de cas pareil en plus de 20 ans d'Excel.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  9. #9
    Membre actif

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 291
    Points : 270
    Points
    270
    Par défaut
    Bonjour,

    Si tu veux te lancer dans les macros:
    • Ouvre un de tes fichiers du jour
    • Menu: Affichage / Macros / Enregistrer une macro
    • Créer ton TCD comme tous les jours
    • Menu: Affichage / Macros / Arrêter l'enregistrement
    • Touche [alt]+[F11] pour atteindre l'éditeur VBA (appelé VBE)
    • Décortique le code, supprime les lignes inutiles, adapte le par des boucles For ... Next...


    Voici ce que donne l'enregistrement de la macro à la création d'un TCD (J'ai ajouté quelques commentaires)
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    Sub Macro1()
    '
    ' Macro1 Macro
    '
     
    '
        ' Création du TCD, Source = SourceData, Position sur la feuille = TableDestination...
        ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
            "Feuil1!R1C1:R21C6", Version:=6).CreatePivotTable TableDestination:= _
            "Feuil1!R2C10", TableName:="Tableau croisé dynamique1", DefaultVersion:=6
        ' Ligne inutile
        Sheets("Feuil1").Select
        ' Ligne inutile
        Cells(2, 10).Select
        ' Feuille active / Sélection du TCD / Sélection du champ col1 (entête d'une colonne de mon tableau)
        With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("Col1")
            .Orientation = xlColumnField
            .Position = 1
        End With
        ' Idem col 2
        With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("Col2")
            .Orientation = xlRowField
            .Position = 1
        End With
        With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("Col3")
            .Orientation = xlRowField
            .Position = 2
        End With
        ' Ligne inutile
        Range("J4").Select
        ' Regrouper je crois
        ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("Col2"). _
            PivotItems("1").ShowDetail = False
        ActiveWorkbook.ShowPivotTableFieldList = False
    End Sub
    Pour avoir une idée précise du code, enregistre une macro en ne procédant qu'à une ou deux action. Par exemple déplace un champ en colonne dans le TCD:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("Col1")
            .Orientation = xlColumnField
            .Position = 1
        End With
    Si tu as besoin reviens par ici avec ton code travaillé.

    Gdal

  10. #10
    Candidat au Club
    Femme Profil pro
    Responsable de compte
    Inscrit en
    Février 2016
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Février 2016
    Messages : 25
    Points : 4
    Points
    4
    Par défaut
    Merci Gdal je test demain

    Les autres je publierais pas un post juste pour le fun
    Je veux pas actualiser un TCD car s'en est un différent chaque jours! En effet les colonnes ne change pas mais les lignes si .

    En tt cas merci bcp GDAL

  11. #11
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Citation Envoyé par Jmila Voir le message
    Merci Gdal je test demain

    Les autres je publierais pas un post juste pour le fun
    Je veux pas actualiser un TCD car s'en est un différent chaque jours! En effet les colonnes ne change pas mais les lignes si .

    En tt cas merci bcp GDAL
    Si ce que j'ai mis en gras est correct, alors, justement, tu peux actualiser ton TCD. En général, les extractions journalières ne changent pas de structure, seules les données changent, ce qui permet l'actualisation.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  12. #12
    Membre éprouvé
    Homme Profil pro
    Directeur
    Inscrit en
    Avril 2003
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Avril 2003
    Messages : 724
    Points : 1 166
    Points
    1 166
    Par défaut
    Salut,

    Le code pour créer un TCD, généré par l’enregistreur de macro est assez imbitable!

    Avec un peu de refactoring, voici une procédure un peu plus lisible:

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    Sub installerTCD2()
    'Feuille: Ventes
    ' Objectif: améliorer/simplifier la programmation en utilisant des
    ' variables objet pour stocker des références aux objets du TCD
        Dim wkb As Workbook, sh As Worksheet
        Dim rng As Range
        Dim pc As PivotCache, pt As PivotTable, pf As PivotField
        ' init
        Set wkb = ActiveWorkbook
        Set sh = wkb.Worksheets("Ventes")
        ' la zone de data sur laquelle est basée le TCD
        Set rng = Range("A1").CurrentRegion
        ' création d'un nouveau cache de TCD, sur lequel on conserve une référence pc(pivot cache)
        Set pc = wkb.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=rng)
     
        ' on ajoute un TCD au cache mémoire, sur lequel on conserve une référence pt(pivot table)
        Set pt = pc.CreatePivotTable(sh.Range("F20"), "Ventes")
        ' paramétrage du TCD
        With pt
            ' paramétrage du champ [Who]
            Set pf = .PivotFields("Who")
            With pf
                .Orientation = xlRowField
                .Position = 1
            End With
            ' paramétrage du champ [What]
            Set pf = .PivotFields("What")
            With pf
                .Orientation = xlRowField
                .Position = 2
            End With
            ' ajout d'un champ de données
            Set pf = pt.PivotFields("Amount")
            .AddDataField pf, "Total ventes", xlSum
        End With
     
        Set pc = Nothing
        pt.ClearTable
    End Sub
    Cordialement,

  13. #13
    Candidat au Club
    Femme Profil pro
    Responsable de compte
    Inscrit en
    Février 2016
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Février 2016
    Messages : 25
    Points : 4
    Points
    4
    Par défaut
    Voici ma macro automatique
    Ce qui gêne c'est : _
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            "Sheet1!R1C1:R6552C22", Version:=xlPivotTableVersion10).CreatePivotTable _
            TableDestination:="Feuil1!R3C1"


    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    ' Macro123456 Macro
    '
     
    '
        Sheets.Add
        ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
            "Sheet1!R1C1:R6552C22", Version:=xlPivotTableVersion10).CreatePivotTable _
            TableDestination:="Feuil1!R3C1", TableName:="Tableau croisé dynamique1", _
            DefaultVersion:=xlPivotTableVersion10
        Sheets("Feuil1").Select
        Cells(3, 1).Select
        With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields( _
            "Situation")
            .Orientation = xlPageField
            .Position = 1
        End With
        With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields( _
            "Mode règlement")
            .Orientation = xlRowField
            .Position = 1
        End With
        ActiveSheet.PivotTables("Tableau croisé dynamique1").AddDataField ActiveSheet. _
            PivotTables("Tableau croisé dynamique1").PivotFields("Montant"), _
            "Nombre de Montant", xlCount
        With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields( _
            "Nombre de Montant")
            .Caption = "Somme de Montant"
            .Function = xlSum
        End With
        ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("Situation"). _
            CurrentPage = "effectué"
        Columns("B:B").Select
        Selection.NumberFormat = "#,##0.00"
        Range("B8").Select
        ActiveWorkbook.Save
    End Sub
    Cette ligne je peux l'enlever elle sert à rien

  14. #14
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Tu vas avoir de gros soucis lorsque tu renommeras "Feuil1" et "Sheet1".

    Tu as intérêt à travailler avec des objest de type Worksheet pour pointer vers tes tes feuilles, c'est plus lisible comme code, et plus stable, d'une manière générale.

    Plutôt que répéter les lignes activesheet.pivotable("..., tu aurais intérêt à travailler avec un objet de type PivotTable, ce sera vachement plus simple et tu pourras te passer de sélectionner.

    Tu aurais intérêt à travailler avec un objet plage dont tu extrairas l'adresse pour créer ton tcd, car ici, ta macro va toujours créer le TCD sur base de la plage R1C1:R6552C22...

    Bref, encore pas mal de boulot pour une finalité dont je n'ai pas encore perçu l'utilité, vu mon dernier message.

    Bref, apprendre le VBA en manipulant des TCD (qui plus est via l'enregistreur de macros qui crée du code poubelle), c'est un peu comme de vouloir courir un marathon alors que l'on ne sait pas marcher... , surtout lorsque je maintiens l'idée que si tu dois reconstruire ton tcd à chaque fois, c'est qu'il y a une faille dans la préparation des données qui alimentent ton tcd. (Parfois, c'est fatigant d'essayer de partager son expérience...)
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  15. #15
    Candidat au Club
    Femme Profil pro
    Responsable de compte
    Inscrit en
    Février 2016
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Février 2016
    Messages : 25
    Points : 4
    Points
    4
    Par défaut
    Bonjour

    Je sais si qu'un va pouvoir me répondre voici mon code

    Désolé, je suis sur smartphone…

    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
    22
    23
    24
    25
    26
    27
    28
    Sub G3_TCD_Decaissements_App()
     
    ' Sélection des données
     
    ActiveWorkbook.Sheets("Sheet1").Select
    Range("A1").Select
    Set objTable = Sheet1.PivotTableWizard
    ' Création du TCD
     
     
    Set objField = objTable.PivotFields("Mode règlement")
    objField.Orientation = xlRowField
     
    Set objField = objTable.PivotFields("Situation")
    objField.Orientation = xlPageField
    CurrentPage = "effectué"
     
    Set objField = objTable.PivotFields("Montant")
    objField.Orientation = xlCount
    objField.Function = xlSum
    objField.NumberFormat = "$ #,##0"
     
    ' Actualiser
     
    Range("B6").Select
    ActiveSheet.PivotTables("Tableau croisé dynamique3").PivotCache.Refresh
     
    End sub
    Mais ca beugue

Discussions similaires

  1. [XL-2010] Changer les champs d'un TCD par macro
    Par stevenring dans le forum Excel
    Réponses: 1
    Dernier message: 21/09/2014, 14h41
  2. Créer une procédure par macro
    Par lucasgaetan dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 06/08/2014, 12h25
  3. TCD par macro et filtre
    Par ericdev67 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 02/02/2012, 10h02
  4. Créer un effet par macro?
    Par jojo86 dans le forum VBA PowerPoint
    Réponses: 0
    Dernier message: 27/11/2010, 12h07
  5. Ouvrir les résultats d'un TCD par macro
    Par illight dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 31/03/2008, 11h41

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