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 :

Macro utilisable sur toutes les feuilles d'un projet


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2023
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2023
    Messages : 10
    Points : 5
    Points
    5
    Par défaut Macro utilisable sur toutes les feuilles d'un projet
    Bonjour,

    Je dois analyser des données provenant de l'insee et ce pour plusieurs villes (une feuille = une ville) . Je voulais créer une macro permettant de créer un tableau croisé dynamique à partir des données comprise sur la feuilles (les colonnes sont toujours les mêmes, le nombre de ligne change). Je souhaite définir moi même le nom de la feuille de calcul. J'ai créer une macro sur une première feuille que j'ai ensuite copiée et renommée avant d'y coller les nouvelles données.
    -Problème 1: le tableau fait toujours référence à la première feuille
    -la plage de données correspond à celle de la première feuille.

    Range("A2").Select
    Application.CutCopyMode = False
    Application.CutCopyMode = False
    ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
    "Données!R1C1:R8317C32", Version:=8).CreatePivotTable TableDestination:= _
    "Données!R5C34", TableName:="Tableau croisé dynamique4", DefaultVersion:=8
    Sheets("Données").Select
    Cells(5, 34).Select
    With ActiveSheet.PivotTables("Tableau croisé dynamique4")
    [...]

    Comment faire de cette "macro" une vraie macro qui d'adapte a la feuille sur laquelle je travaille?

  2. #2
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2022
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Octobre 2022
    Messages : 685
    Points : 1 156
    Points
    1 156
    Par défaut
    Bonjour

    Il faut plutôt garder un TCD modèle (tu n'auras pas à refaire tout ce qui est après le with pour dessiner ton TCD) et le copier, puis changer sa source.

    Tu as donc un onglet VilleModele, qui contient un exemple de données, et un onglet TCDModele qui contient ton TCD complètement défini.

    Tu veux le copier pour exploiter un onglet "Paris" qui contient des données au même format : tu as juste à copier l'onglet, et changer la source du TCD

    Ça pourrait ressembler à :

    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
    Option Explicit
     
    Sub InitTCD(MaVille As String)
     
    Dim NomTCD As String
    Dim PlageTCD As String
     
    With ThisWorkbook
     
        'nom de la nouvelle feuille
        NomTCD = "TCD" & MaVille
     
        'plage de données
        PlageTCD = MaVille & "!" & .Sheets(MaVille).UsedRange.Address
     
        ' suppression onglet si existe
        On Error Resume Next
        ThisWorkbook.Sheets(NomTCD).Delete
        On Error GoTo 0
     
        ' création de la copie du TCD modele
        .Sheets("TCDModele").Copy before:=ThisWorkbook.Sheets(1)
     
        ' mise en musique
        With ThisWorkbook.Sheets(1)
            .Name = NomTCD 'rename
            .PivotTables(1).ChangePivotCache .Parent.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=PlageTCD, Version:=8)
        End With ' MonTCD
     
    End With 'thisWorkBook
     
    End Sub
     
    Sub Test()
    InitTCD "Paris"
    End Sub

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2023
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2023
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    merci pour votre réponse!

    J'ai malheureusement encore un problème, quand je copie TCDModele et que le lance la macro (j'ai créé un onglet Paris) j'obtient l'erreur d'exécution 9 "l'indice n'appartient pas à la sélection sur la ligne "PlageTCD = MaVille & "!" & .Sheets(MaVille).UsedRange.Address"

    Aussi, si j'ai bien compris votre fonction test envoie systématiquement "Paris" comme paramètre pour InitTCD, comment faire pour choisir le nom d'un autre onglet?

  4. #4
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2022
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Octobre 2022
    Messages : 685
    Points : 1 156
    Points
    1 156
    Par défaut
    Bonjour,

    j'obtient l'erreur d'exécution 9 "l'indice n'appartient pas à la sélection sur la ligne "PlageTCD = MaVille & "!" & .Sheets(MaVille).UsedRange.Address"
    Ça tendrait à dire que MaVille ne contient pas un nom d'onglet donc, si MaVille contient bien "Paris", que l'onglet que tu a renommé "Paris" n'est pas dans le même classeur que les code, ou s'appelle en vérité " Paris" ou "Paris " ou ... mais pas pas "Paris"

    si j'ai bien compris votre fonction test envoie systématiquement "Paris" comme paramètre pour InitTCD, comment faire pour choisir le nom d'un autre onglet?
    Remplacer
    par exemple par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    InitTCD "Saint-Julien-Chapteuil"
    mais je suppose que ça ne répond pas complétement à la question...
    Il faut commencer par préciser l'ergonomie que tu attends... Comment tu désignes l'onglet concerné (ou tous les onglets qui n'on pas de TCD associé ?) comment tu lances la macro (Alt F8, bouton ...)

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2023
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2023
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Merci, pour votre réponse.

    Pourtant en survolant "MaVille" dans le debogeur j'obtient bien MaVille="Paris" sans espaces cachés.

    Pour l'instant je lance la macro depuis la liste des macro; Mais j'ai modifié ton code pour que je puisse taper le nom de l'onglet souhaité et le passer a InitTDC. Je ne pense pas que le problème vienne de là puisque de base l'exécution plantait sur la définition de PlageTCD avant mes modifs. Tout est dans le même classeur et j'ai vérifié le nom de l'onglet "Paris".

    Avez vous une autre idée de la provenance de l'erreur?

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2023
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2023
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    J'ai l'impression que le problème vient de: with ThisWorkbook, si je le retire, je peux aller plus dans l'exécution du programme.

  7. #7
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2022
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Octobre 2022
    Messages : 685
    Points : 1 156
    Points
    1 156
    Par défaut
    Re,

    J'ai l'impression que le problème vient de: with ThisWorkbook, si je le retire, je peux aller plus dans l'exécution du programme.
    Si tu le retires et que le programme tourne toujours (ou tourne mieux) , c'est que tu n'a pas gardé les "." devant les ".sheets" ce qui pourrait expliquer bien des choses...

    Tu peux peut-être copier ton code ici qu'on regarde un peu ce qui se passe...

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2023
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2023
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Je te remercie pour ton aide! j'ai copié collé ton code tel quel, puis en faisant des essais j'ai réussi a le faire fonctionner sans le ThisWorkbook. Je te joint le code fonctionnant.

    Option Explicit

    Sub InitTCD(MaVille As String)

    Dim NomTCD As String
    Dim PlageTCD As String
    Dim Test As String


    'nom de la nouvelle feuille
    NomTCD = "TCD" & MaVille

    'plage de données


    PlageTCD = MaVille & "!" & Sheets(MaVille).UsedRange.Address



    ' suppression onglet si existe
    On Error Resume Next
    ThisWorkbook.Sheets(NomTCD).Delete
    On Error GoTo 0

    ' création de la copie du TCD modele
    Sheets("TCDModele").Copy before:=Sheets(1)

    ' mise en musique
    With Sheets(1)
    .Name = NomTCD 'rename
    .PivotTables(1).ChangePivotCache .Parent.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=PlageTCD, Version:=8)
    .Move after:=Sheets(Sheets.Count)

    End With ' MonTCD



    End Sub

    Sub CreerTDC()
    Dim MyValue, Message, Titre, Defaut As String

    Titre = "entrer nom"
    Message = "entrer le nom de la ville"
    Defaut = "paris"

    MyValue = InputBox(Message, Titre, Defaut)

    InitTCD (MyValue)
    End Sub


    Je trouve ça effectivement étrange que cela ne marche pas avec le Thisworkbook, d'autant que le code fais moins propre comme ça. tu as une idée de l'origine du problème?

  9. #9
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2022
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Octobre 2022
    Messages : 685
    Points : 1 156
    Points
    1 156
    Par défaut
    Bonjour,

    je ne comprends pas pourquoi/comment tu as eu des pb en copiant le code plus haut, qui fonctionne très bien chez moi.
    Possible que tu aies viré des . qui te semblaient suspects sans savoir à quoi il servaient ?

    En supprimant le thisworkbook et en repassant sur des références implicites (sheets au lieu de .sheets) tu as introduit une fragilité puisque ça va piocher dans activeWorkbook, donc le classeur courant, au lieu de thisWorkbook, celui qui contient le code.

    En passant quand tu écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim MyValue, Message, Titre, Defaut As String
    tu as écrit en fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim MyValue as Variant, Message as Variant, Titre as Variant, Defaut As String
    alors que tu voulais sans doute écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim MyValue as String, Message as String, Titre as String, Defaut As String

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2023
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2023
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Non vraiment je n'avais rien modifié Est ce peut être du a un paramètre du logiciel? Le classeur courant c'est bien le classeur ouvert sur lequel je travaille?

    Merci de corriger mes erreurs de débutant

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2023
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2023
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    AH, j'ai enregistrer mes macros dans "PERSONAL.XLSB" et non "ce classeur", penses tu que cela est source de l'erreur?

  12. #12
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2022
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Octobre 2022
    Messages : 685
    Points : 1 156
    Points
    1 156
    Par défaut
    Re,

    AH, j'ai enregistré mes macros dans "PERSONAL.XLSB" et non "ce classeur", penses tu que cela est source de l'erreur ?
    je me cite :
    activeWorkbook, donc le classeur courant, au lieu de thisWorkbook, celui qui contient le code
    Donc effectivement...

    Comme je n'aime pas les références implicites (même quand on travaille sur activeworkbook, ça va toujours mieux en le disant...) je ferais :

    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
    Option Explicit
     
    Sub InitTCD(MaVille As String)
     
    Dim NomTCD As String
    Dim PlageTCD As String
     
    With ActiveWorkbook
     
        'nom de la nouvelle feuille
        NomTCD = "TCD" & MaVille
     
        'plage de données
        PlageTCD = MaVille & "!" & .Sheets(MaVille).UsedRange.Address
     
        ' suppression onglet si existe
        On Error Resume Next
        .Sheets(NomTCD).Delete
        On Error GoTo 0
     
        ' création de la copie du TCD modele
        .Sheets("TCDModele").Copy before:= .Sheets(1)
     
        ' mise en musique
        With .Sheets(1)
            .Name = NomTCD 'rename
            .PivotTables(1).ChangePivotCache .Parent.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=PlageTCD, Version:=8)
        End With ' MonTCD
     
    End With 'ActiveWorkBook
     
    End Sub
    (pas testé )

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2023
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2023
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Super merci pour ces réponses! J'ai finalement codé la macro dans le module associé au classeur donc ton code initial avec "with ThisWorkbook" fonctionne correctement!

    voila ma première macro VBA fonctionne officiellement

    Bonne fin de journée!

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 21/11/2019, 09h14
  2. [XL-2016] Macro pour convertir tableaux en plages sur toutes les feuilles
    Par nico38rugby dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 14/09/2019, 20h29
  3. macro rechercher/remplacer sur toutes les feuilles
    Par gti64 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 03/03/2015, 11h25
  4. [XL-2003] macro impossible sur toutes les feuilles
    Par alucard_xs dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 04/06/2012, 22h23
  5. Action sur toutes les feuilles d'un classeur
    Par beurnoir dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 23/12/2005, 15h11

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