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 :

Dupliquer une macro sur plusieurs onglets


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 20
    Points : 6
    Points
    6
    Par défaut Dupliquer une macro sur plusieurs onglets
    Bonjour,

    J'aimerais à partir d'une même macro la dupliquer sur les différents onglets de mon fichier excel.

    En sachant que seules les sources changeront sensiblement:

    En effet au lieu de 0610, il faut s'attendre à avoir 0710, 0810, 0910 etc...

    Je vous joins une partie de mon code :

    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
    'Filtre élaboré pour obtenir matricules selon centre de coût sélectionné
        Workbooks("Ctrl Gestion -SG- analyse par postes -0610.xls").Sheets("RUB2"). _
            Columns("A:S").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _
            "A1:A2"), CopyToRange:=Range(activecell, Cells(a, 2)), Unique:=False
     
     
     
        '1ère ligne formules 2010
        activecell.Offset(1, 1).Select
        activecell.Formula = Application.VLookup(activecell.Offset(0, -2), Workbooks("Ctrl Gestion -SG- analyse par postes -0610.xls").Sheets("RUB2").Columns("A:S"), 2, False)
     
        activecell.Offset(0, 1).Select
        activecell.Formula = Application.VLookup(activecell.Offset(0, -2), Workbooks("Ctrl Gestion -SG- analyse par postes -0610.xls").Sheets("RUB2").Columns("A:S"), 3, False)
     
        activecell.Offset(0, 1).Select
        activecell.Formula = Application.VLookup(activecell.Offset(0, -3), Workbooks("Ctrl Gestion -SG- analyse par postes -0610.xls").Sheets("RUB2").Columns("A:S"), 5, False)
     
        activecell.Offset(0, 1).Select
        Selection = ""
     
        activecell.Offset(0, 1).Select
        activecell.Formula = Application.VLookup(activecell.Offset(0, -5), Workbooks("Ctrl Gestion -SG- analyse par postes -0610.xls").Sheets("RUB2").Columns("A:S"), 11, False)
    En partant du principe que je pourrais lier une cellule à la période souhaitée dans chaque onglet, comment puis-je spécifier cela dans mon code?

    Vous remerciant par avance pour votre aide,
    Très bonne journée

    Magali

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour Mag555,

    Au lieu de dupliquer une macro ce qui allourdi le fichier,
    il suffit de la mettre dans ThisWorkbook ... tout dépend de l'utilisation que l'on veut en faire

    A+

  3. #3
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonsoir,

    Généralement on ne duplique jamais une macro, on crée une fonction ou une procédure et on lui passe différentes valeurs en arguments.

    Hervé.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 20
    Points : 6
    Points
    6
    Par défaut
    Peux-tu m'expliquer rapidement à quoi sert le Workbook? C'est un fichier qui stocke les fichiers sources?

    Exemple: Si j'ai 20 sources utilisées au total dans mes différents onglets mais que dans la feuille actuelle, je n'en utilise que 3, lesquelles vais-je mettre dans le Workbook? Et comment se fera la liaison entre les fichiers dans le Workbook et mes codes?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 141
    Points : 414
    Points
    414
    Par défaut Procédure de filtre avec paramètre du .xls en VBA
    Citation Envoyé par Mag555 Voir le message
    à quoi sert le Workbook ?
    A faire des traitements de niveau Workbook
    Exemple : à l'ouverture du classeur .xls dans Workbook_Open().
    __________________

    Il vaut mieux définir les procédures communes dans un module.

    Ouvrir Excel.
    Dans le classeur souhaité, ouvrir le Visual Basic Editeur par Alt+F11, c-a-d :
    Cliquez sur l'Excel menu "Outils" > "Macro" > "Visual Basic Editeur" (VBE)
    Cliquez sur le VBE menu "Insérer" > "Module".

    Citation Envoyé par Mag555 Voir le message
    Et comment se fera la liaison entre les fichiers et mes codes?
    Citation Envoyé par Mag555 Voir le message
    En effet au lieu de 0610, il faut s'attendre à avoir 0710, 0810, 0910 etc...
    Dans la procédure FilterXls(), on passe en paramètre le suffixe du .xls tel que "0710" ou "0610" défini par la constante correspondante filenameSuffix610.

    Dans la fenêtre d'Edition de Module1, copier-coller :
    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
    Option Explicit ' Filtre selon classeur
    Public Const filenamePrefix = "Ctrl Gestion -SG- analyse par postes -"
    Public Const filenameSuffix610 = "0610", filenameSuffix710 = "0710"
    Public Const nameSheetRub = "RUB2" ' Commentez ...
     
    ' Ajoute un filtre sur le classeur filenamePrefix + filenameSuffix610
    Sub FilterXls(ByVal strSuffix As String)
    Dim wkBook As Workbook, strPath As String, rngTarget As Range
    Dim a As Integer
     
        Stop ' Déboguer en pas à pas puis enlever l'instruction Stop quand la procédère est au point.
        strPath = filenamePrefix + strSuffix + ".xls"
        On Error Resume Next
        Set wkBook = Workbooks(strPath)
        If Err.Number <> 0 Then Warning "1000: Impossible d'accéder au classeur " + vbCrLf + _
                                        strPath: Exit Sub
        On Error GoTo 0
     
        a = 123 ' Définir la valeur de a et renommez le nom de la variable sur au moins cinq lettres.
        Set rngTarget = Range(ActiveCell, Cells(a, 2)) ' Cible pour CopyToRange
        'Filtre élaboré pour obtenir matricules selon centre de coût sélectionné
        wkBook.Sheets(nameSheetRub).Columns("A:S").AdvancedFilter Action:=xlFilterCopy, _
            CriteriaRange:=Range("A1:A2"), CopyToRange:=rngTarget, Unique:=False
        '...
    End Sub
     
    ' Common error management
    Sub Warning(ByVal strMsg As String)
    Const lenErr = 4 ' Number of digits of the error code beginning the message
        If Err.Number <> 0 Then
            strMsg = strMsg + vbCrLf + "Error " + Str(Err.Number) + ": " + Err.Description
        End If
        MsgBox Mid(strMsg, lenErr + 3), vbExclamation, "Filter warning " + Left(strMsg, lenErr)
    End Sub
    Dans la fenêtre d'Exécution immédiate (Ctrl+G) du VBE (Visual Basic Editeur) d'Excel, copier-coller et valider par ENTER :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FilterXls filenameSuffix610
    ___________

    Si la discussion est résolue, vous pouvez cliquer sur le bouton

    En bas de ce message s'il vous a apporté des éléments de réponse pertinents, pensez également à voter en cliquant sur le bouton vert ci-dessous.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 20
    Points : 6
    Points
    6
    Par défaut
    Merci mille fois pour cette réponse très etoffée MattChess.

    Si j'ai bien compris, cela n'est pas gênant en soit que tout mon code soit contenu dans le userform de ma feuille ?

    Pour permettre à mes fichiers sources notamment d'être "variabilisés" sur les différentes feuilles, il me suffit d'entrer les codes ci-dessous dans un module de chaque feuille.

    La seule chose qui changera devrait être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Const filenameSuffix610 = "0610"
    Mais je me pose encore une question, dans mon Userform où je spécifie encore mes chemins d'accès aux fichiers en toutes lettres, comment vba va-t-il faire le lien entre mon module et mon userform?

    Je m'explique : Que deviendraient les lignes de sources de fichiers comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    'Filtre élaboré pour obtenir matricules selon centre de coût sélectionné
        Workbooks("Ctrl Gestion -SG- analyse par postes -0610.xls").Sheets("RUB2"). _
            Columns("A:S").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _
            "A1:A2"), CopyToRange:=Range(activecell, Cells(a, 2)), Unique:=False
    Et je suppose que pour des feuilles nommées dans l'onglet, il faut simplement les remplacer par Activesheet ?

    Désolée pour les questions qui fusent, mais débuter dans VBA, c'est pas une mince affaire !

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 141
    Points : 414
    Points
    414
    Par défaut Appel de la procédure paramétrée selon le .xls
    Citation Envoyé par Mag555 Voir le message
    ... dans un module de chaque feuille.
    Un module est global. Il n'est pas lié à une feuille particulière. C'est pourquoi on peut mettre dans un module des procédures communes pour toutes les feuilles qu'elles les utilisent ou non.

    Citation Envoyé par Mag555 Voir le message
    La seule chose qui changera devrait être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Const filenameSuffix610 = "0610"
    Oui, en fait ce qui changera c'est l'appel de la fonction commune telle que FilterXls() grâce à son paramètre qui indique une partie du nom du .xls à traiter.

    Citation Envoyé par Mag555 Voir le message
    dans mon Userform où je spécifie mes chemins d'accès aux fichiers en toutes lettres, comment vba va-t-il faire le lien entre mon module et mon userform?
    Au moment de la validation de l'Userform en cliquant sur le bouton "OK", on récupère par exemple dans un TextBox un chemin de classeur .xls.
    Si on veut ensuite appeler la procédure commune FilterXls() du module, il faut extraire le suffixe du chemin saisi dans l'Userform.

    Dans la fenêtre d'Exécution immédiate (Ctrl+G) du VBE (Visual Basic Editeur) d'Excel, copier-coller et valider par ENTER :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ? Left(Right("Ctrl Gestion -SG- analyse par postes -0910.xls", 8), 4)
    0910

    On a extrait le suffixe "0910" du nom du classeur en composant les fonctions d'extraction de chaînes Left() et Right().

    Citation Envoyé par Mag555 Voir le message
    Que deviendraient les lignes de sources de fichiers comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    'Filtre élaboré pour obtenir matricules selon centre de coût sélectionné
        Workbooks("Ctrl Gestion -SG- analyse par postes -0610.xls").Sheets("RUB2"). _
    La mise en place du filtre a été découpée sur plusieurs lignes pour rendre variable le suffixe "0610" du classeur en paramètre de la procédure FilterXls() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Set wkBook = Workbooks(strPath) ' Voir ligne 14 
    '...
    wkBook.Sheets(nameSheetRub).Columns("A:S").AdvancedFilter '... ligne 22
    Suivre avec le débogueur le contexte d'appel dans les lignes 12 à 23 de FilterXls().
    ___________

    En bas de ce message s'il vous a apporté des éléments de réponse pertinents, pensez également à voter en cliquant sur le bouton vert ci-dessous.

Discussions similaires

  1. [PPT-2003] Faire agir une macros sur plusieurs slides
    Par yvespi dans le forum VBA PowerPoint
    Réponses: 8
    Dernier message: 22/04/2010, 16h20
  2. Répéter une macro sur plusieurs cellules
    Par arkorrigan dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 08/03/2010, 17h28
  3. utiliser une macro sur plusieurs fichiers
    Par papimcha dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 25/04/2008, 16h23
  4. Installer une macro sur plusieurs postes
    Par titeZ dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 28/02/2008, 15h27
  5. [VBA-E] Comment appliquer une macro sur plusieurs cellules
    Par jeanpierreco dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 25/01/2007, 10h54

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