Appeler macro dans une macro

Bonjour à tous et à toutes !

Je suis un utilisateur occasionnel de VBA, mais là je me retrouve face à une impasse...

J'ai un dossier contenant plusieurs feuilles (que je ne peux pas transmettre car confidentiel...) et dans chaque feuille, il y a des données, que je peux choisir en fonction d'une semaine choisie (j'ai donc créer une macro qui affiches les données en fonction de la semaine choisie). Et j'aimerai avoir une feuille affichant toutes les données des différentes feuilles pour pouvoir faire un tableau comparatif.

Pour ce faire, dans ma feuille de globalisation, j'aimerai créer une macro qui lancerait la première macro dans toutes les pages en même temps !

J'espère avoir été clair,je vais voir si il n'y aurait pas moyen d'insérer un doc ou quoi, mais ça va être compliqué...

Merci d'avance !

Bonjour,

pas sûr que cela réponde ... mais essaie l'instructioncall MaMcro

Bonjour !

Alors j'ai utilisé la fonction Application.Run "Macro"

Le problème c'est que j'aimerai que ça lance la macro dans les 5 pages concernées ...

Bonjour,

Tu es en train de faire un joyeux mélange...

Une macro ne se crée pas dans une feuille de calcul.

C'est du texte, écrit dans des pages spéciales appelées Modules, texte qu'on appelle lui-même code, composées de mot-clés agencés selon une syntaxe permettant d'interpréter et d'exécuter ce code sur ta machine.

Dans une macro, on peut écrire une instruction lançant une macro !

Rien de plus simple : une ligne de code indiquant son nom suffit :

NomMacro

Si la macro est dotée d'arguments : NomMacro arg1, arg2

les arguments prennent place à la suite, après une espace et séparés par des virgules.

Tu peux utiliser l'instruction Call pour appeler une macro, cela n'ajoute rien, sauf un mot de plus à écrire, mais si tu utilises Call, les arguments s'il y en a doivent être mis entre parenthèses : Call NomMacro(arg1, arg2)

Application.Run sert surtout à utiliser d'anciennes macros non écrites en VBA. Si ça marche aussi, cela ne fait qu'ajouter du texte supplémentaire... mais pourquoi faire simple !!

Si tu veux être aidé, il faut fournir un modèle précisant le résultat à obtenir. Cela ne s'invente pas et une macro ne s'écrit pas dans le vide.

Cordialement.

Bonjour !

Merci pour l'explication, je ne vais donc pas utiliser Application.Run, mais Call ! Le seul problème c'est que je ne comprends pas ce que sont les arguments... ! Mais on va chercher ^^

Pour le modèle, je vais voir si je peux arriver à en faire un (pas sûr) !

En tout cas, merci beaucoup, je vais pouvoir avancer un peu je pense !

Après le soucis n'est pas d'appeler en soit cette macro, mais de faire en sorte qu'elle se lance dans toutes les feuilles !

Un argument est une donnée ou un paramètre dont la macro a besoin pour faire ce que tu lui demandes.

Même chose quand tu utilises une fonction dans une feuille de calcul : si tu tapes =SOMME(, à la suite de la parenthèse ouvrante tu vas indiquer ce qu'il y a lieu d'additionner, c'est l'argument de la fonction SOMME.

Dans ton cas, on peut concevoir une macro qui s'exécute sur 5 feuilles si celles-ci sont prédéfinies, mais on peut aussi la concevoir pour s'exécuter sur une feuille, non prédéfinie, et dans ce cas on prévoit que la macro soit lancée en lui fournissant en argument le nom de la feuille sur laquelle s'exécuter.

Cela te paraît-il plus clair ?

Un peu plus clair en effet, on avance !!

La macro que je dois créer doit simplement lancer une macro existante sur des feuilles déjà prédéfinies !

Bon j'ai réduit au minimum du minimum mon classeur, que j'ai mis en pj !

En gros, il est censé y avoir plusieurs pages du même type que celle A330, genre 5 pages de plus, qui sont structurées de la même manière ! Quand je suis sur cette page, je peux cliquer sur le bouton semaine qui affichera dans les camemberts les résultats de la semaine souhaitée ! Maintenant, j'aimerai que dans ma feuille global, lorsque je clique sur le bouton semaine, ça lance la macro semaine dans toutes les pages et que ca m'affiche la synthèse de tout !

C'est plus clair comme ça?

340macro-dans-macro.xlsm (59.26 Ko)

Bon ! Pas question que je me lance dans le décodage de ton fichier... 5 modules (un seul suffirait amplement) et du code pas indenté ou mal...

Alors, si tu indiques quelle macro est à exécuter sur 5 feuilles : son nom et où on la trouve, je veux la regarder, et voir comment compléter son action. Mais pas question que je la cherche.

Hop pardon !

Ca serait la macro nommée MacroSemaine que j'aimerai lancer grâce à la macro MacroGlobalSemaine !

Et pour les différents modules, me aculpa, j'essaie de me débrouiller ! Du coup ça veut dire que c'est la macro SynthèseSemaine dans le module MacroSemaine et la macro GlobalSemaine dans le module MacroGlobalSemaine !! Enfin je pense être bon là !!

Merci beaucoup en tout cas !

La macro SyntheseSemaine est conçue si j'ai bien vue pour s'exécuter sur la feuille active.

Pour éviter de la reprendre en entier, il te faut activer la feuille à chaque fois et la lancer.

Pour ça : ajouter une variable dans GlobalSemaine, feuilles par exemple, à cet endroit :

Dim i As Integer, feuilles

(Pas de type, c'est une variable de type Variant)

En fin de macro tu mets le bout de code suivant :

    feuilles = Split("nomfeuille1;nomfeuille2;nomfeuille3;nomfeuille4;nomfeuille5", ";")
    For i = 0 To 4
        Worksheets(feuilles(i)).Activate
        SyntheseSemaine
    Next i

Tu remplaces évidemment les "nomfeuille..." par le nom de chaque feuille à traiter (une seule chaîne, les noms étant séparés par des points-virgules).

Chacune des 5 feuilles sera tour à tour activée et la macro se lancera 5 fois.

Cordialement.

Yes de mieux en mieux !!!

Merci beaucoup pour ton aide !

Un dernière question cependant (vraiment la dernière je pense !) : Quand je suis dans la feuille global, et que je clique sur le bouton semaine, j'aimerai que ça me pose la question du choix de semaine/année à ce moment là et que ça lance les autres macro en conséquence !

Là avec cette modif', ça ouvre toutes les pages une par une, et je dois rentrer à chaque fois la semaine et l'année concernée... C'est possible d'automatiser la chose ou ça devient trop compliqué?

Et j'aimerai que quand tout est fini, ça revienne sur la page global !!

En tout cas encore merci pour ton aide !

C'est la même semaine pour les 5 ?

Oui chef !

Dans ce cas, tu as déjà fait la sélection dans GlobalSemaine, il suffit de l'utiliser :

tu mets des arguments à SynthesSemaine :

Sub SyntheseSemaine(SemaineChoisie As Integer, AnneeChoisie As Integer)

Tu supprimes les déclarations de variables et le code correspondant à la sélection :

Code à supprimer:

Dim SemaineChoisie As Integer
Dim AnneeChoisie As Integer

Do
SemaineChoisie = InputBox("Semaine concernée (de 1 à 52):", "Choix de la semaine", 1)
Loop Until SemaineChoisie > 0 And SemaineChoisie < 53

Do
AnneeChoisie = InputBox("Année concernée (de 2015 à 2099):", "Choix de l'année", 2016)
Loop Until AnneeChoisie > 2014 And AnneeChoisie < 2100

Et le code précédemment vu devient :

    feuilles = Split("nomfeuille1;nomfeuille2;nomfeuille3;nomfeuille4;nomfeuille5", ";")
    For i = 0 To 4
        Worksheets(feuilles(i)).Activate
        SyntheseSemaine SemaineChoisie, AnneeChoisie
    Next i

Cordialement.

C'EST PARFAIT !!!!!!!!!!!!!!

Merci beaucoup pour tout !!!!

(juste, il y aurait un moyen qu'à la fin de la macro globale, on retourne sur la page globale? Pck ça me laisse sur la page 5 en fait :/)

Parce que tu finis ton travail sur la 5 ! Dans la mesure où l'on active les feuilles une à une pour éviter de reprendre la macro.

Mais il suffit à la fin de réactiver la feuille Global pour y revenir :

Worksheets("Global").Activate

Ecoute merci beaucoup, c'est parfait, j'ai pu faire exactement ce que je voulais !!

Rechercher des sujets similaires à "appeler macro"