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 en VB des classeurs contenant des tableaux croisés sur la base d'un modèle [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Juillet 2011
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2011
    Messages : 82
    Par défaut Créer en VB des classeurs contenant des tableaux croisés sur la base d'un modèle
    Bonjour à tous,

    J'ai un classeur avec plusieurs clients.

    Dans le classeur, se trouve un tableau croisé dynamique (Feuil1) qui utilise la Base de donnée (Feuil2).

    Je voudrais créer un classeur pour chacun des clients avec le meme tableau croisé mais en utilisant seulement les Données le concernant.

    J'ai utilisé plusieurs méthodes mais je n'abouti pas.

    Si qq un a déjà vu ce genre de code merci de m'aider.

    A+

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    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 208
    Par défaut
    Bonjour,

    Regarde la macro ci-dessous :

    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
    40
    41
    42
    43
    44
    45
    46
    Sub test()
    'Réf. 111101.xlsm mikeactuaire
    Dim Dico As Object, c As Range, Plage As Range
    Set Dico = CreateObject("Scripting.Dictionary")
    'le classeur "source.xlsm" doit être ouvert au démarrage de la macro
    'c'est le classeur qui contient les données à copier
    Workbooks("source.xlsm").Activate
    'la feuille Feuil2 contient les données du TCD
    With Sheets("Feuil2")
        'on élimine les doublons en utilisant un dictionnaire
        For Each c In .Range(.[A2], .Cells(.Rows.Count, 1).End(xlUp))
            If Not Dico.exists(c.Value) Then
                Dico.Add c.Value, c.Value
            End If
        Next c
    End With
        'boucle sur chaque nom de client
        For Each Item In Dico.items
            'on copie les deux feuilles (données et TCD) dans un classeur vierge
            Sheets(Array("Feuil1", "Feuil2")).Copy
            'on travaille sur le nouveau classeur
            With Sheets("Feuil2")
                'Plage représente les données du TCD. J'ai utilisé les colonnes A et B...
                'à modifier
                Set Plage = .Range(.[A1], .Cells(.Rows.Count, 2).End(xlUp)) 'j'utilise les colonnes A et B
                .[H1] = .[A1]
                .[H2] = Item
                'filtre élaboré en colonne I sur le nom de client
                Plage.AdvancedFilter xlFilterCopy, .[H1:H2], .[I1]
                .[A:B].ClearContents
                'copie du résultat du filtre en colonne A et B
                .[I:J].Cut .[A:B]
                .[H1:H2].ClearContents
                'Plage d=représente les nouvelles données du TCD correspondant au nom de client
                Set Plage = .Range(.[A1], .Cells(.Rows.Count, 2).End(xlUp))
                'on ajuste le TCD à la nouvelle plage de données
                Sheets("Feuil1").PivotTables(1).ChangePivotCache _
                    ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
                    "Feuil2!" & Plage.Address, Version:=xlPivotTableVersion12)
                'enregistrement du classeur (au format XL97-2003)
                ActiveWorkbook.SaveAs "c:\temp\" & Item, xlExcel8
                ActiveWorkbook.Close
            End With
        Next Item
    Set Dico = Nothing
    End Sub

  3. #3
    Membre confirmé
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Juillet 2011
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2011
    Messages : 82
    Par défaut
    Bonjour Daniel,

    Merci pour ton aide.
    En fait, j'ai M colonnes mais j'ai pu adapter ceci.

    Par contre j'ai une erreur dans ce bout de code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    'on ajuste le TCD à la nouvelle plage de données
                Sheets("Feuil1").PivotTables(1).ChangePivotCache _
                    ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
                    "Feuil2!" & Plage.Address, Version:=xlPivotTableVersion12)
    Voici la boite d'erreur:
    Run-time error ......
    The pivot Table field name is not valid. To create a Pivot Table report, you must use data that is organized as a list with labeled columns. If you are changing the name of a pivot Table field, you must type a new name for the field.

    Et en passant au Debug,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    'on ajuste le TCD à la nouvelle plage de données
                Sheets("Feuil1").PivotTables(1).ChangePivotCache _
                    ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase,(xlDatabase=1) SourceData:= _
                    "Feuil2!" & Plage.Address (Plage.Address= c'est la bonne plage) , Version:=xlPivotTableVersion12 (xlPivotTableVersion12=3) )

    Merci,

  4. #4
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    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 208
    Par défaut
    Si tes données occupent les colonnes A à M, la ligne 35 devient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Plage = .Range(.[A1], .Cells(.Rows.Count, 13).End(xlUp))
    Sinon, quelle est ta version d'Excel, c'est important avec les TCD. Confirme-moi aussi que tu n'as qu'un TCD sur la feuille ou donne-moi son nom.

  5. #5
    Membre confirmé
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Juillet 2011
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2011
    Messages : 82
    Par défaut
    OK,

    J'ai Excel 2007, et sur cette feuille je n'ai qu'un seul TCD qui est "PivotTable1".

    Pour la modification que tu m'as apporté au sujet des colonnes, devrais-je aussi modifier les parties ou se trouvent :.[H1:H2], .[I1] car ils se retrouveront dans les champs?

  6. #6
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    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 208
    Par défaut
    Affirmatif, décale le tout à partir de la colonne N.

  7. #7
    Membre confirmé
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Juillet 2011
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2011
    Messages : 82
    Par défaut
    Voici la réponse à ma derniere question:

    Avant la ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       'enregistrement du classeur (au format XL03)
     
    ActiveWorkbook.SaveAs "C:\Documents and Settings....." & Left(Item, 4), xlExcel8
    écrire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.DisplayAlerts = False
    Ceci évite à Excel de poser la question si on veut continuer ou non...


    A+


    Ps: Mettez des points!!!

  8. #8
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    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 208
    Par défaut
    Je n'avais pas vu la question...

    Mais, avec XL2007, tu ne peux pas enregistrer des classeurs au format XL2003 sauf si tu travailles en mode compatibilité. Autre chose, je viens de faire un test avec XL2003, justement, en me servant de l'enregistreur de macros et l'erreur ne se produit pas.

  9. #9
    Membre confirmé
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Juillet 2011
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2011
    Messages : 82
    Par défaut
    Et voila, j'ai trouvé le dernier detail:

    Voici la commande qui permet de garder les TCD à jour :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("TX DTL By Dr & Acc").PivotTables("PivotTable2").SaveData = True

  10. #10
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    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 208
    Par défaut
    Bravo ! je me coucherai moins idiot. Je ne connaissais pas.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 24/03/2010, 11h49
  2. Réponses: 2
    Dernier message: 27/10/2009, 10h36
  3. [XL-2003] Instabilité des classeurs avec des Tableaux Croisés Dynamiques
    Par oohcalme dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 04/08/2009, 11h45
  4. Réponses: 8
    Dernier message: 16/07/2008, 09h08
  5. JTable contenant des JComboBox contenant des Images
    Par lex13 dans le forum Composants
    Réponses: 4
    Dernier message: 31/07/2007, 15h57

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