VBA - une macro pour lancer toutes les autres ?

thomas4530

XLDnaute Junior
Bonjour,

Débutant en VBA, je suis confronté à un problème qui m'empêche de progresser.

En quelques mots:
Mon classeur excel comprend 3 feuilles actuellement.
Sur la feuille 1 se trouvent l'ensemble de mes données.
Sur la feuille 2 se trouvent uniquement les données pour la personne A (elles sont issues de la feuille 1). Les données sont obtenues grâce à l'activation de la macro feuille_2
Sur la feuille 3 se trouvent uniquement les données pour la personne B (elles sont issues de la feuille 1). Les données sont obtenues grâce à l'activation de la macro feuille_3

Mon classeur finalisé contiendra plus de 100 feuilles. Afin de ne pas devoir passer en revue toutes les feuilles et de ne pas devoir activer une à une les macros, je souhaiterais automatiser les macros à partir soit d'un bouton d'action soit d'une macro insérer dans la feuille 1.

Malheureusement, il ne semble pas possible d'affecter plusieurs macros à un seul bouton.

Est-il envisageable de développer une macro (appelons toutes_macros) qui serait intégrée sur la feuille 1 et qui lancerait les macros feuille_2 et feuille_3 ?

Un grand merci pour votre aide,

Thomas
 

thomas4530

XLDnaute Junior
Re : VBA - une macro pour lancer toutes les autres ?

Voici,

L'idée serait donc d'intégrer sur la feuille 1, un bouton d'action qui exécute chacune des macros contenues sur les différentes feuilles c'est-à-dire la macro Herremans puis la macro Lebichot.

Un tout grand merci,

Thomas
 

Pièces jointes

  • 2014-06-17 - forum.xlsm
    818 KB · Affichages: 37

STephane

XLDnaute Occasionnel
Re : VBA - une macro pour lancer toutes les autres ?

Tes macros sont présentes dans la feuille de code liée aux feuilles de calcul "Herremans" et "Lebichot".
Pourquoi ne mets-tu pas tes macros dans une feuille de code de type "module" ?

Si tu veux pas changer cette structure, tu peux appeler tes macros comme suit :
Call Feuil2.Herremans
Call Feuil4.Lebichot
 

thomas4530

XLDnaute Junior
Re : VBA - une macro pour lancer toutes les autres ?

Un tout grand merci STephane.

Deux dernières questions...
- Est-il possible que la feuille Lebichot devienne la feuille 3 et non plus 4 ? Si oui, comment ?

- Autre chose (mais il faudrait peut-être une autre discussion), comment copier la feuille de Herremans dans un autre fichier excel sur la feuille Herremans (qui préexiste) ?

Encore merci !!!
 

STephane

XLDnaute Occasionnel
Re : VBA - une macro pour lancer toutes les autres ?

- Est-il possible que la feuille Lebichot devienne la feuille 3 et non plus 4 ? Si oui, comment ?
dans l'explorateur de code Visual Basic Editor, tu dois afficher l'explorateur de projet VBA et éditer les propriétés des feuilles, tu peux alors le nom de code des feuilles

- Autre chose (mais il faudrait peut-être une autre discussion), comment copier la feuille de Herremans dans un autre fichier excel sur la feuille Herremans (qui préexiste) ?
il y a plein d'exemples sur le forum.
 

Yakou

XLDnaute Nouveau
Re : VBA - une macro pour lancer toutes les autres ?

Bonjour,

Je note que tu as 100 feuilles a préparer de cette façon.
Pour t'évité un travail fastidieux de copier collé.

Je t'invite à déplacer ta macro sur un module.
et de mettre quelque paramètre sur les champs qui se modifier (exemple les noms de feuille).

exemple:

code sur ta feuilles:

Code:
Sub Herremans()

'en appelant ta macro tu met en paramètre la valeur "Herremans"
Call module1.ma_macro("Herremans")

end sub


Code sur ton module1:

Code:
'lors de l'appel de la macro la valeur "Herremans" s'incrémente dans nom_feuille
sub ma_macro(byval nom_feuille as string)

<ton code>
exemple:
If Not IsEmpty(Cells(a, 4)) And Cells(a, 4) <> nom_feuille Then Cells(a, 3).Resize(, 3).ClearContents

end sub



quand tu écriras ton code sur la feuille Lebichot, tu pourras le faire de cette façon:

Code:
Sub Lebichot()

'en appelant ta macro tu met en paramètre la valeur "Lebichot"
Call module1.ma_macro("Lebichot")

end sub

c'est moin compliqué à géré et tu n'aura qu'une fonction pour piloté ton projet.
 

thomas4530

XLDnaute Junior
Re : VBA - une macro pour lancer toutes les autres ?

Salut Yakou,

C'est exceptionnel, j'adore... mais je dois avoir fait une petite erreur.

Dans mon module1, j'ai inscrit ceci:

Sub macro_1(ByVal nom_feuille As String)
' Copie de la feuille de données
Sheets("Données").Range("A83:BN2131").copy Sheets("nom_feuille").Range("A83:BN2131")
' Nettoyage - ne garder que ce qui concerne le professeur
Dim a As Long
For a = 86 To 2131
If Not IsEmpty(Cells(a, 4)) And Cells(a, 4) <> "nom_feuille" Then Cells(a, 3).Resize(, 3).ClearContents
If Not IsEmpty(Cells(a, 7)) And Cells(a, 7) <> "nom_feuille" Then Cells(a, 6).Resize(, 3).ClearContents
If Not IsEmpty(Cells(a, 10)) And Cells(a, 10) <> "nom_feuille" Then Cells(a, 9).Resize(, 3).ClearContents
If Not IsEmpty(Cells(a, 13)) And Cells(a, 13) <> "nom_feuille" Then Cells(a, 12).Resize(, 3).ClearContents
If Not IsEmpty(Cells(a, 17)) And Cells(a, 17) <> "nom_feuille" Then Cells(a, 16).Resize(, 3).ClearContents
If Not IsEmpty(Cells(a, 20)) And Cells(a, 20) <> "nom_feuille" Then Cells(a, 19).Resize(, 3).ClearContents
If Not IsEmpty(Cells(a, 23)) And Cells(a, 23) <> "nom_feuille" Then Cells(a, 22).Resize(, 3).ClearContents
If Not IsEmpty(Cells(a, 26)) And Cells(a, 26) <> "nom_feuille" Then Cells(a, 25).Resize(, 3).ClearContents
If Not IsEmpty(Cells(a, 30)) And Cells(a, 30) <> "nom_feuille" Then Cells(a, 29).Resize(, 3).ClearContents
If Not IsEmpty(Cells(a, 33)) And Cells(a, 33) <> "nom_feuille" Then Cells(a, 32).Resize(, 3).ClearContents
If Not IsEmpty(Cells(a, 36)) And Cells(a, 36) <> "nom_feuille" Then Cells(a, 35).Resize(, 3).ClearContents
If Not IsEmpty(Cells(a, 39)) And Cells(a, 39) <> "nom_feuille" Then Cells(a, 38).Resize(, 3).ClearContents
If Not IsEmpty(Cells(a, 43)) And Cells(a, 43) <> "nom_feuille" Then Cells(a, 42).Resize(, 3).ClearContents
If Not IsEmpty(Cells(a, 46)) And Cells(a, 46) <> "nom_feuille" Then Cells(a, 45).Resize(, 3).ClearContents
If Not IsEmpty(Cells(a, 49)) And Cells(a, 49) <> "nom_feuille" Then Cells(a, 48).Resize(, 3).ClearContents
If Not IsEmpty(Cells(a, 52)) And Cells(a, 52) <> "nom_feuille" Then Cells(a, 51).Resize(, 3).ClearContents
If Not IsEmpty(Cells(a, 56)) And Cells(a, 56) <> "nom_feuille" Then Cells(a, 55).Resize(, 3).ClearContents
If Not IsEmpty(Cells(a, 59)) And Cells(a, 59) <> "nom_feuille" Then Cells(a, 58).Resize(, 3).ClearContents
If Not IsEmpty(Cells(a, 62)) And Cells(a, 62) <> "nom_feuille" Then Cells(a, 61).Resize(, 3).ClearContents
If Not IsEmpty(Cells(a, 65)) And Cells(a, 65) <> "nom_feuille" Then Cells(a, 64).Resize(, 3).ClearContents
Next
'Construction Horaire - Synthèse du professeur
Range("O45:O2131").ClearContents
Range("AB45:AB2131").ClearContents
Range("AO45:AO2131").ClearContents
Range("BB45:BB2131").ClearContents
Dim deb As Integer, fin As Integer, k As Integer, J As Integer, truc As String
For i = 3 To 66
deb = 45
fin = 2131
For k = 4 To 40
For J = deb To fin Step 41
truc = truc + Cells(J, i)
Next J
Cells(k, i) = truc
deb = deb + 1
fin = fin + 1
truc = ""
Next k
Next i
Worksheets("Données").Range("O1:O2131").copy Worksheets("nom_feuille").Range("O1")
Worksheets("Données").Range("AB1:AB2131").copy Worksheets("nom_feuille").Range("AB1")
Worksheets("Données").Range("AO1:AO2131").copy Worksheets("nom_feuille").Range("AO1")
Worksheets("Données").Range("BB1:BB2131").copy Worksheets("nom_feuille").Range("BB1")
End Sub

Dans ma feuille "Herremans", j'ai écrit cela:
Sub macro_1()
'en appelant ta macro tu mets en paramètre la valeur "Herremans"
Call Module1.macro_1("Herremans")
End Sub

Lorsque je lance la macro de la feuille, cela me donne: Erreur d'exécution 9 - L'indice n'appartient pas à la sélection.

Tu sais m'aider ?

Thomas
 

Yakou

XLDnaute Nouveau
Re : VBA - une macro pour lancer toutes les autres ?

nom_feuille est une variable.
Il ne faut pas lui mettre de guillemet sinon il lira "nom_feuille" en valeur texte et non le nom de ta feuille.


je t'invite à donner un autre nom à ta macro sur la feuille.
Pour une meilleur lisibilité et aussi pour éviter de les confondre.


-----------------
Sub macro_1()
'en appelant ta macro tu mets en paramètre la valeur "Herremans"
Call Module1.macro_1("Herremans")
End Sub
-----------------



Si tu veux t'éclater un peu plus tu peux même réduire ton code beaucoup plus:

tu peux supprimer ça:

Code:
Dim a As Long
For a = 86 To 2131
If Not IsEmpty(Cells(a, 4)) And Cells(a, 4) <> "nom_feuille" Then Cells(a, 3).Resize(, 3).ClearContents
If Not IsEmpty(Cells(a, 7)) And Cells(a, 7) <> "nom_feuille" Then Cells(a, 6).Resize(, 3).ClearContents
If Not IsEmpty(Cells(a, 10)) And Cells(a, 10) <> "nom_feuille" Then Cells(a, 9).Resize(, 3).ClearContents
If Not IsEmpty(Cells(a, 13)) And Cells(a, 13) <> "nom_feuille" Then Cells(a, 12).Resize(, 3).ClearContents
If Not IsEmpty(Cells(a, 17)) And Cells(a, 17) <> "nom_feuille" Then Cells(a, 16).Resize(, 3).ClearContents
If Not IsEmpty(Cells(a, 20)) And Cells(a, 20) <> "nom_feuille" Then Cells(a, 19).Resize(, 3).ClearContents
If Not IsEmpty(Cells(a, 23)) And Cells(a, 23) <> "nom_feuille" Then Cells(a, 22).Resize(, 3).ClearContents
If Not IsEmpty(Cells(a, 26)) And Cells(a, 26) <> "nom_feuille" Then Cells(a, 25).Resize(, 3).ClearContents
If Not IsEmpty(Cells(a, 30)) And Cells(a, 30) <> "nom_feuille" Then Cells(a, 29).Resize(, 3).ClearContents
If Not IsEmpty(Cells(a, 33)) And Cells(a, 33) <> "nom_feuille" Then Cells(a, 32).Resize(, 3).ClearContents
If Not IsEmpty(Cells(a, 36)) And Cells(a, 36) <> "nom_feuille" Then Cells(a, 35).Resize(, 3).ClearContents
If Not IsEmpty(Cells(a, 39)) And Cells(a, 39) <> "nom_feuille" Then Cells(a, 38).Resize(, 3).ClearContents
If Not IsEmpty(Cells(a, 43)) And Cells(a, 43) <> "nom_feuille" Then Cells(a, 42).Resize(, 3).ClearContents
If Not IsEmpty(Cells(a, 46)) And Cells(a, 46) <> "nom_feuille" Then Cells(a, 45).Resize(, 3).ClearContents
If Not IsEmpty(Cells(a, 49)) And Cells(a, 49) <> "nom_feuille" Then Cells(a, 48).Resize(, 3).ClearContents
If Not IsEmpty(Cells(a, 52)) And Cells(a, 52) <> "nom_feuille" Then Cells(a, 51).Resize(, 3).ClearContents
If Not IsEmpty(Cells(a, 56)) And Cells(a, 56) <> "nom_feuille" Then Cells(a, 55).Resize(, 3).ClearContents
If Not IsEmpty(Cells(a, 59)) And Cells(a, 59) <> "nom_feuille" Then Cells(a, 58).Resize(, 3).ClearContents
If Not IsEmpty(Cells(a, 62)) And Cells(a, 62) <> "nom_feuille" Then Cells(a, 61).Resize(, 3).ClearContents
If Not IsEmpty(Cells(a, 65)) And Cells(a, 65) <> "nom_feuille" Then Cells(a, 64).Resize(, 3).ClearContents
Next

et le remplacer par ça:

Code:
Dim ligne As Long
Dim colone as byte

For ligne = 86 To 2131: For colone = 4 To 65 Step 3
Call Cells_redimention(ligne, colone, nom_feuille)
Next colone, ligne

Puis ajouter la macro Cells_redimention dans ton module1

Code:
Sub Cells_redimention(ByRef ligne As Long, ByRef colone As Byte, ByVal nom_feuille As String)
If Not IsEmpty(Cells(ligne, colone)) And Cells(ligne, colone) <> nom_feuille Then Cells(ligne, colone - 1).Resize(, 3).ClearContents
End Sub

Et tu vas voir que très vite ton code se rétréci et est plus lisible.
Tu peux encore rétrécir d'autre partie de ton code.
Je te laisse y réfléchir.
 
Dernière édition:

thomas4530

XLDnaute Junior
Re : VBA - une macro pour lancer toutes les autres ?

Bonsoir Yakou,

je pense que tout fonctionne parfaitement.

J'ai juste du ajouter: Worksheets(nom_feuille).Activate sinon il travaillait sur la feuille "Données".

Il me reste à trouver comment exporter les feuilles vers un autre classeur. Je cherche, je cherche...

Un tout grand merci à toi,

Thomas
 

thomas4530

XLDnaute Junior
Re : VBA - une macro pour lancer toutes les autres ?

Bonjour tout le monde,

La nuit porte conseils... ou pas.

Hier STephane m'avait livré la solution pour lancer toutes mes macros via un seul bouton d'action (celui-ci appelant les différentes macros qui étaient contenues sur les différentes feuilles)- lire ci-dessus. Malheureusement, avec le déplacement de la macro sur le module, le code fourni (ci-dessous) ne fonctionne plus.

Call Feuil2.Herremans
Call Feuil4.Lebichot

Pourriez-vous m'aider ?

Belle journée à tous,

Thomas
 

Yakou

XLDnaute Nouveau
Re : VBA - une macro pour lancer toutes les autres ?

ça devrai fonctionner car dans ton module_1 tu incorpores:


Code:
Sub Toutes_macros() 

Call Feuil2.Herremans
Call Feuil4.Lebichot 

End Sub

et dans ta feuille 2 tu as la macro:

Code:
Sub Herremans()
Call module1.ma_macro("Herremans")
end sub

et la feuille 4

Code:
Sub Lebichot ()
Call module1.ma_macro("Lebichot ")
end sub


voir tu pourrais même faire ça ce qui t'éviterait de faire des macros sur tes feuilles:

Code:
Sub Toutes_macros() 

Call module1.ma_macro("Herremans")
Call module1.ma_macro("Lebichot ")

End Sub
 

Discussions similaires

Statistiques des forums

Discussions
311 721
Messages
2 081 927
Membres
101 842
dernier inscrit
seb0390