A voir également:
- Répétition d'une partie de programme
- Programme demarrage windows 10 - Guide
- Extraire une partie de video - Guide
- Désinstaller programme windows 10 - Guide
- Comment faire une recherche à partir d'une photo - Guide
10 réponses
Oui, ce que tu veux faire, c'est une maccro. Il faut que tu la mettes dans la partie modules. un truc genre sub maccro1 ... end sub.
Et ensuite tu l'appelleras avec le lien genre module1/maccro1(les paramètres)
Et ensuite tu l'appelleras avec le lien genre module1/maccro1(les paramètres)
Je suis déjà dans une macro.
Ce que je souhaiterais c'est pouvoir appeler un module dans un autre module. Je n'ai pas de paramètres, parce que je ne sais pas bien m'en servir donc je ne sais pas quoi mettre.
Pour le moment j'ai un truc du genre :
Sub ...()
Dim...
Set...
If mois.Value = "Janvier" Then
m = 3
'Sexe
Set fem = Resultats.Range("C" & m)
Set hom = Resultats.Range("B" & m)
If Sexe.Value = "F" Then
fem.Value = fem.Value + 1
Else
If Sexe.Value = "M" Then
hom.Value = hom.Value + 1
End If
End If
Else
If mois.Value = "Février" Then
m = 4
'Sexe
Set fem = Resultats.Range("C" & m)
Set hom = Resultats.Range("B" & m)
If Sexe.Value = "F" Then
fem.Value = fem.Value + 1
Else
If Sexe.Value = "M" Then
hom.Value = hom.Value + 1
End If
End If
Else ...
End Sub
Ce que je veux répéter c'est :
'Sexe
Set fem = Resultats.Range("C" & m)
Set hom = Resultats.Range("B" & m)
If Sexe.Value = "F" Then
fem.Value = fem.Value + 1
Else
If Sexe.Value = "M" Then
hom.Value = hom.Value + 1
End If
End If
Comment puis-je faire ?
Ce que je souhaiterais c'est pouvoir appeler un module dans un autre module. Je n'ai pas de paramètres, parce que je ne sais pas bien m'en servir donc je ne sais pas quoi mettre.
Pour le moment j'ai un truc du genre :
Sub ...()
Dim...
Set...
If mois.Value = "Janvier" Then
m = 3
'Sexe
Set fem = Resultats.Range("C" & m)
Set hom = Resultats.Range("B" & m)
If Sexe.Value = "F" Then
fem.Value = fem.Value + 1
Else
If Sexe.Value = "M" Then
hom.Value = hom.Value + 1
End If
End If
Else
If mois.Value = "Février" Then
m = 4
'Sexe
Set fem = Resultats.Range("C" & m)
Set hom = Resultats.Range("B" & m)
If Sexe.Value = "F" Then
fem.Value = fem.Value + 1
Else
If Sexe.Value = "M" Then
hom.Value = hom.Value + 1
End If
End If
Else ...
End Sub
Ce que je veux répéter c'est :
'Sexe
Set fem = Resultats.Range("C" & m)
Set hom = Resultats.Range("B" & m)
If Sexe.Value = "F" Then
fem.Value = fem.Value + 1
Else
If Sexe.Value = "M" Then
hom.Value = hom.Value + 1
End If
End If
Comment puis-je faire ?
Tu mets ta partie dans un nouveau module que tu appelleras.
Mais tu devras apparemment lui passer des paramètres, du style sexe.value, fem.value, hom.value, etc.
Mais pour un tout petit bout de code comme ça, ce n'est peut-être pas la peine..
Mais tu devras apparemment lui passer des paramètres, du style sexe.value, fem.value, hom.value, etc.
Mais pour un tout petit bout de code comme ça, ce n'est peut-être pas la peine..
Sauf qu'il y a cette partie à répéter 12 fois, et pareil pour 5 autres parties, plus longues :
'Situation familiale
For j = 1 To i
Set sitfam = Donnees.Range("E" & j)
Set nbenf = Donnees.Range("F" & j)
Set mois = Donnees.Range("B" & j)
If mois.Value = "Janvier" Then
If nbenf.Value = 0 Then
If sitfam.Value = "Seul" Then
celjanv.Value = celjanv.Value + 1
Else
If sitfam.Value = "Couple" Then
csejanv.Value = csejanv.Value + 1
End If
End If
Else
If nbenf.Value > 0 Then
If sitfam.Value = "Seul" Then
psaejanv.Value = psaejanv.Value + 1
Else
If sitfam.Value = "Couple" Then
caejanv.Value = caejanv.Value + 1
End If
End If
End If
End If
End If
Next j
'Activité
For j = 1 To i
Set mois = Donnees.Range("B" & j)
Set act1 = Donnees.Range("G" & j)
Set act2 = Donnees.Range("H" & j)
If mois.Value = "Janvier" Then
If act1.Value = "Salarié" Then
saljanv.Value = saljanv.Value + 1
Else
If act1.Value = "Invalidité" Then
invaljanv.Value = invaljanv.Value + 1
Else
If act1.Value = "Demandeur d'emploi" Then
ddempljanv.Value = ddempljanv.Value + 1
Else
If act1.Value = "Arrêt maladie" Then
ammjanv.Value = ammjanv.Value + 1
Else
If act1.Value = "Retraité" Then
retrjanv.Value = retrjanv.Value + 1
Else
autrejanv.Value = autrejanv.Value + 1
End If
End If
End If
End If
End If
If act2.Value <> "" Then
If act2.Value = "Salarié" Then
saljanv.Value = saljanv.Value + 1
Else
If act2.Value = "Invalidité" Then
invaljanv.Value = invaljanv.Value + 1
Else
If act2.Value = "Demandeur d'emploi" Then
ddempljanv.Value = ddempljanv.Value + 1
Else
If act2.Value = "Arrêt maladie" Then
ammjanv.Value = ammjanv.Value + 1
Else
If act2.Value = "Retraité" Then
retrjanv.Value = retrjanv.Value + 1
Else
autrejanv.Value = autrejanv.Value + 1
End If
End If
End If
End If
End If
End If
End If
Next j
End Sub
'Situation familiale
For j = 1 To i
Set sitfam = Donnees.Range("E" & j)
Set nbenf = Donnees.Range("F" & j)
Set mois = Donnees.Range("B" & j)
If mois.Value = "Janvier" Then
If nbenf.Value = 0 Then
If sitfam.Value = "Seul" Then
celjanv.Value = celjanv.Value + 1
Else
If sitfam.Value = "Couple" Then
csejanv.Value = csejanv.Value + 1
End If
End If
Else
If nbenf.Value > 0 Then
If sitfam.Value = "Seul" Then
psaejanv.Value = psaejanv.Value + 1
Else
If sitfam.Value = "Couple" Then
caejanv.Value = caejanv.Value + 1
End If
End If
End If
End If
End If
Next j
'Activité
For j = 1 To i
Set mois = Donnees.Range("B" & j)
Set act1 = Donnees.Range("G" & j)
Set act2 = Donnees.Range("H" & j)
If mois.Value = "Janvier" Then
If act1.Value = "Salarié" Then
saljanv.Value = saljanv.Value + 1
Else
If act1.Value = "Invalidité" Then
invaljanv.Value = invaljanv.Value + 1
Else
If act1.Value = "Demandeur d'emploi" Then
ddempljanv.Value = ddempljanv.Value + 1
Else
If act1.Value = "Arrêt maladie" Then
ammjanv.Value = ammjanv.Value + 1
Else
If act1.Value = "Retraité" Then
retrjanv.Value = retrjanv.Value + 1
Else
autrejanv.Value = autrejanv.Value + 1
End If
End If
End If
End If
End If
If act2.Value <> "" Then
If act2.Value = "Salarié" Then
saljanv.Value = saljanv.Value + 1
Else
If act2.Value = "Invalidité" Then
invaljanv.Value = invaljanv.Value + 1
Else
If act2.Value = "Demandeur d'emploi" Then
ddempljanv.Value = ddempljanv.Value + 1
Else
If act2.Value = "Arrêt maladie" Then
ammjanv.Value = ammjanv.Value + 1
Else
If act2.Value = "Retraité" Then
retrjanv.Value = retrjanv.Value + 1
Else
autrejanv.Value = autrejanv.Value + 1
End If
End If
End If
End If
End If
End If
End If
Next j
End Sub
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Ben... ^^'
Si tu ne peux pas faire de boucle, soit tu la répètes, soit tu fais une maccro de plus, mais il faudra lui passer des paramètres.
Si tu ne peux pas faire de boucle, soit tu la répètes, soit tu fais une maccro de plus, mais il faudra lui passer des paramètres.
salut,
tu peux simplement utiliser "Call" : dans ton sub principal, tu fais appel à d'autres sub dans d'autres modules (ça rend la programmation plus lisible à mon sens).
exemple :
'---------------------------------------------------
Sub Principal ()
...
Call Macro_autre_module
...
End Sub
'---------------------------------------------------
quand le code dans "Macro_autre_module" s'est exécuté, le sub "Principal" continue de s'exécuter à la suite du Call.
il faudra cependant que tu déclares toutes tes variables comme "Public" (-> "Public mois as String") et dans un module à part.
ça te va ?
tu peux simplement utiliser "Call" : dans ton sub principal, tu fais appel à d'autres sub dans d'autres modules (ça rend la programmation plus lisible à mon sens).
exemple :
'---------------------------------------------------
Sub Principal ()
...
Call Macro_autre_module
...
End Sub
'---------------------------------------------------
quand le code dans "Macro_autre_module" s'est exécuté, le sub "Principal" continue de s'exécuter à la suite du Call.
il faudra cependant que tu déclares toutes tes variables comme "Public" (-> "Public mois as String") et dans un module à part.
ça te va ?
Le problème c'est que pour faire un autre module, il faudrait que j'ai des variables indépendantes du module principal et c'est pas le cas =$
ccm81
Messages postés
10904
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
24 décembre 2024
2 428
Modifié par ccm81 le 12/05/2011 à 15:24
Modifié par ccm81 le 12/05/2011 à 15:24
re
la procedure TraiteSexe peut etre appelée autant de fois que tu veux dans ta procedure
MAIS
TraiteSexe modifie les variables fem et hom, utilise la variable Sexe sans la modifier
pour ces variables le plus simple est de les déclarer en variables globales (declarées en début de module)
Si d'autres procedures les utilisent, elles seront dans l'état où la dernière qui les a utilisé les aura laissé
Cette solution n'est pas tellement jolie mais ça permet à toute autre procedure de les utiliser (en l'état) sans avoir a les re-declarer
Dans la mesure ou ton but est de decouper ta procedure Resultats, celà ne devrait pas avoir d'incidence
ATTENTION. Je répète > TraiteSexe MODIFIE la valeur de fem et de hom
ATTENTION. Travailler sur une copie du fichier
RQ1. Au passage, comme je te l'ai conseillé dans l'autre topic, il vaut mieux un select case même s'il n'y a que 2 cas
RQ2. Tu peux evidemment faire la même chose pour d'autres parties de ton programme en gardant bien dans l''idée que (je me ré-répète) ces procedures modifient des variables
RQ3. Ta procedure Resultat va faire de sérieux progrès dans lisibilité
Concrètement ça se présentera comme ça
bonne suite
la procedure TraiteSexe peut etre appelée autant de fois que tu veux dans ta procedure
MAIS
TraiteSexe modifie les variables fem et hom, utilise la variable Sexe sans la modifier
pour ces variables le plus simple est de les déclarer en variables globales (declarées en début de module)
Si d'autres procedures les utilisent, elles seront dans l'état où la dernière qui les a utilisé les aura laissé
Cette solution n'est pas tellement jolie mais ça permet à toute autre procedure de les utiliser (en l'état) sans avoir a les re-declarer
Dans la mesure ou ton but est de decouper ta procedure Resultats, celà ne devrait pas avoir d'incidence
ATTENTION. Je répète > TraiteSexe MODIFIE la valeur de fem et de hom
ATTENTION. Travailler sur une copie du fichier
RQ1. Au passage, comme je te l'ai conseillé dans l'autre topic, il vaut mieux un select case même s'il n'y a que 2 cas
RQ2. Tu peux evidemment faire la même chose pour d'autres parties de ton programme en gardant bien dans l''idée que (je me ré-répète) ces procedures modifient des variables
RQ3. Ta procedure Resultat va faire de sérieux progrès dans lisibilité
Concrètement ça se présentera comme ça
Option Explicit Dim fem as Range, hom as Range, Sexe as Range public sub TraiteSexe() Set fem = Resultats.Range("C" & m) Set hom = Resultats.Range("B" & m) If Sexe.Value = "F" Then fem.Value = fem.Value + 1 Else If Sexe.Value = "M" Then hom.Value = hom.Value + 1 End If End If End Sub Public Sub Resultats() . . set Sexe = expression1 Call TraiteSexe . . . set Sexe = expression2 Call TraiteSexe . . . End Sub
bonne suite
ccm81
Messages postés
10904
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
24 décembre 2024
2 428
Modifié par ccm81 le 12/05/2011 à 16:10
Modifié par ccm81 le 12/05/2011 à 16:10
re
si plusieurs modules doivent uriliser les mêmes variables, tu les déclares dans un module géréral (pas module de feuille) sous la forme
Public fem as Range
Public hom as Range
Public Sexe as Range
ces variables seront alors visibles dans tout autre module (y compris module de feuille)
si plusieurs modules doivent uriliser les mêmes variables, tu les déclares dans un module géréral (pas module de feuille) sous la forme
Public fem as Range
Public hom as Range
Public Sexe as Range
ces variables seront alors visibles dans tout autre module (y compris module de feuille)
Zoul67
Messages postés
1959
Date d'inscription
lundi 3 mai 2010
Statut
Membre
Dernière intervention
30 janvier 2023
149
12 mai 2011 à 23:48
12 mai 2011 à 23:48
Bonsoir,
J'ai un esprit de contradiction assez développé...
As-tu vraiment besoin de faire du VBA. C'est bien de l'exploitation et de la remise en forme de données figurant dans des tableaux ?
Les tableaux croisés dynamiques ne seraient-ils pas plus appropriés ?
A+
J'ai un esprit de contradiction assez développé...
As-tu vraiment besoin de faire du VBA. C'est bien de l'exploitation et de la remise en forme de données figurant dans des tableaux ?
Les tableaux croisés dynamiques ne seraient-ils pas plus appropriés ?
A+
Le problème du tableau croisé dynamique c'est que ca ne me mettra pas les valeurs où je veux. J'ai déjà un tableau de résultats et le programme permet de mettre directement les chiffres au bon endroit.
Sinon j'ai fais un select case et j'arrive à obtenir les résultats que je veux
Sinon j'ai fais un select case et j'arrive à obtenir les résultats que je veux
En fait j'ai juste fait en sorte de définir m (chiffre qui définit la ligne correspondant à chaque mois) avant de calculer les chiffres.
'Sélection du mois
Select Case mois.Value
Case "Janvier"
m = 3
Case "Février"
m = 4
Case "Mars"
m = 5
Case "Avril"
m = 6
Case "Mai"
m = 7
Case "Juin"
m = 8
Case "Juillet"
m = 9
Case "Août"
m = 10
Case "Septembre"
m = 11
Case "Octobre"
m = 12
Case "Novembre"
m = 13
Case "Décembre"
m = 14
End Select
Et après j'ai mis une seule fois les calculs des valeurs :
'Sexe
Set fem = Resultats.Range("C" & m)
Set hom = Resultats.Range("B" & m)
Select Case sexe.Value
Case "F"
fem.Value = fem.Value + 1
Case "M"
hom.Value = hom.Value + 1
End Select
'Situation familiale
...
'Sélection du mois
Select Case mois.Value
Case "Janvier"
m = 3
Case "Février"
m = 4
Case "Mars"
m = 5
Case "Avril"
m = 6
Case "Mai"
m = 7
Case "Juin"
m = 8
Case "Juillet"
m = 9
Case "Août"
m = 10
Case "Septembre"
m = 11
Case "Octobre"
m = 12
Case "Novembre"
m = 13
Case "Décembre"
m = 14
End Select
Et après j'ai mis une seule fois les calculs des valeurs :
'Sexe
Set fem = Resultats.Range("C" & m)
Set hom = Resultats.Range("B" & m)
Select Case sexe.Value
Case "F"
fem.Value = fem.Value + 1
Case "M"
hom.Value = hom.Value + 1
End Select
'Situation familiale
...