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 :

Un bouton qui active plusieurs macros [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juin 2017
    Messages : 10
    Par défaut Un bouton qui active plusieurs macros
    bonjour

    je débute en développement, j'ai fait le tableau en pièce jointe sur la feuille 1 un tableau avec la possibilité de rentrer 100 données par cases lundi midi, lundi soir, mardi midi etc...
    la macro 1 prend les données de la colonne intéressé sur la feuille 1 , elle ne prend que celle ou il y a du texte dedans et le colle dan la feuille fin
    idem pour la macro 2
    idem pour la macro 3

    si je le fais sur les 3 séparément cela fonctionne

    Le problème c'est que j'ai fait le bouton macrotoutes qui est censé effectuer les macros 1, 2 et 3 en une fois , plutot que de le faire séparement et la je ne comprend pas mon erreur car il ne me copie que la macro1 , enfin il ne copie que la 1ere macro de celle ci .

    Est il possible que ce bouton macrotoutes regroupe toutes les autres macros ?

    Pouvez vous me guider svp

    cordialement

    Cauvin

    Classeur1.xlsmClasseur1.xlsm

  2. #2
    Membre Expert
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 706
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 706
    Par défaut
    Bonjour,
    Pour des raisons de sécurité, je n'ai pas ouvert ton classeur, mais voici ce que je peux te dire :
    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
    Sub premiereMacro()
        'Cette macro écrit toto en A1
        Range("A1").Value = "toto"
    End Sub
     
    Sub deuxiemeMacro()
        'Cette macro écrit titi en A2
        Range("A2").Value = "titi"
    End Sub
     
    Sub macroPrincipale()
        'cette macro écrit toto en A1 et titi en A2
        Call premiereMacro
        Call deuxiemeMacro
    End Sub
    Et le bouton appelle la macroPrincipale.

    Si tu as toujours des problèmes, écris-nous le code concerné entre balises code (bouton #). Donne-nous le message d'erreur et dis-nous où il se déclenche.
    A bientôt

  3. #3
    Membre habitué
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juin 2017
    Messages : 10
    Par défaut
    Bonjour merci pour votre reponse j'ai essayer dans mon classeur precedement la macro "call" et je crois que je sait pas l'utiliser parce que ca fonctionne pas

  4. #4
    Membre Expert
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 706
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 706
    Par défaut
    Peux-tu nous montrer comment tu l'utilises, stp ? Ecris-nous le code en question (méthode que tu appelles et méthode où tu utilises Call).

  5. #5
    Membre habitué
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juin 2017
    Messages : 10
    Par défaut
    Je pense que c'est ce que vous voulez :

    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
    Sub macro1()
     
    Dim Plg As Range
    Dim Cel As Range
    Dim Cmpt As Variant
     
    Set Plg = Range("C5:C104")
     
    For Each Cel In Plg
     
        If Cel.Formula <> "" Then
        Sheets("fin").Activate
        Range("C5").Offset(Cmpt).Formula = Cel
        Cmpt = Cmpt + 1
        Else: End If
        Next Cel
     
    End Sub
    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
    Sub macro2()
     
    Dim Plg As Range
    Dim Cel As Range
    Dim Cmpt As Variant
     
    Set Plg = Range("D5:D104")
     
    For Each Cel In Plg
     
        If Cel.Formula <> "" Then
        Sheets("fin").Activate
        Range("D5").Offset(Cmpt).Formula = Cel
        Cmpt = Cmpt + 1
        Else: End If
        Next Cel
     
    End Sub
    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
    Sub macro3()
     
    Dim Plg As Range
    Dim Cel As Range
    Dim Cmpt As Variant
     
    Set Plg = Range("E5:E104")
     
    For Each Cel In Plg
     
        If Cel.Formula <> "" Then
        Sheets("fin").Activate
        Range("E5").Offset(Cmpt).Formula = Cel
        Cmpt = Cmpt + 1
        Else: End If
        Next Cel
     
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub macrotoutes()
    Call macro1
    Call macro2
    Call macro3
    End Sub

  6. #6
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    écriture à la volée de la factorisation de tes trois procédures, qui sont identiques avec une seule variable : le numéro de la colonne (3 - 4 - 5)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub macroGLOBALE()
    Dim Cel As Range
        For i = 3 To 5
            For Each Cel In Range(Cells(5, i), Cells(104, i))
                If Cel.Formula <> "" Then Sheets("fin").Cells(Rows.Count, i).End(xlUp)(2).Formula = Cel.Formula
            Next Cel
        Next i
    End Sub

  7. #7
    Membre Expert
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 706
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 706
    Par défaut
    Tu utilises correctement Call, là n'est pas le problème.
    Es-tu sûr que chaque macro indépendamment marche ?

    J'observe la chose suivante : tu utilises Cmpt, mais tu ne l'initialises jamais. En gros, à un moment dans ta macro tu dis ajouter un à Cmpt, mais tu ne dis pas ce que vaut Cmpt avant de lui ajouter 1.

    Quand tu utilises une condition If, tu n'es pas obligé de mettre un Else. Ceci est OK :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If ma condition Then
        je fais qqc
    End If
    Il y a un problème de feuille active dans ton code. Quand tu utilises Range sans feuille avant, tu supposes que tu regarde la feuille active. Mais plus tard tu écris Sheets("fin").Activate. Donc tu changes de feuille active. Du coup, quand tu passes à ta deuximème macro, ta feuille active est la feuille "fin" et ta plage Plg est sur la feuille "fin". Comment résout-on cela ? On utilise le moins possible Select/Selection/Activate/ActiveSheet... !!! Au lieu d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Sheets("fin").Activate
     Range("C5").Offset(Cmpt).Formula = Cel

    Ecris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("fin").Range("C5").Offset(Cmpt).Formula = Cel
    En fait, tu pourrais te passer de Cmpt et Plg si tu fais une boucle For plutôt qu'une boucle For Each :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub macro1()
     Dim i As Long
     For i = 5 To 104
         If Range("C" & i).Formula <> "" Then
             Sheets("fin").Range("C" & i - 4).Formula = Range("C" & i)
         End If
     Next i
     End Sub
    Enfin, tu écris 3 macro, qui en fait font la même chose sur des colonnes différentes. Tu pourrais en écrire une seule avec un paramètre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub macro1(col As String)
     Dim i As Long
     For i = 5 To 104
         If Range(col & i).Formula <> "" Then
             Sheets("fin").Range(col & i - 4).Formula = Range(col & i)
         End If
     Next i
     End Sub
    Puis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub macroToutes()
        Call macro1("C")
        Call macro1("D")
        Call macro1("E")
    End Sub
    Et peut-être encore mieux, tu pourrais n'écrire qu'une seule macro avec une boucle imbriquée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub macro1()
     Dim i As Long        'n° ligne
     Dim j As Long        'n° colonne
     For i = 5 To 104
         For j = 3 To 5
             If Cells(i, j).Formula <> "" Then
                 Sheets("fin").Cells(i, j).Formula = Cells(i, j)
             End If
         Next j
     Next i
     End Sub

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 04/08/2016, 13h14
  2. [XL-2010] Cliquer sur un bouton qui lance une macro XLA
    Par Kutoh dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 29/09/2014, 17h39
  3. Boutons de commandes=>plusieurs macros
    Par clorion91 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 09/06/2013, 20h08
  4. Réponses: 1
    Dernier message: 03/08/2012, 16h25
  5. Créer un bouton et qui lance une macro
    Par malabarbe dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 10/09/2007, 15h13

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