Répétition d'une partie de programme

Fermé
Chtitmiss - 11 mai 2011 à 10:46
 Chtitmiss - 13 mai 2011 à 08:07
Bonjour,

Je suis en train de travailler sur une procédure VBA Excel et je dois répéter une partie du programme.

Est-ce qu'il est possible de donner un nom à la partie du programme et que j'écrive juste le nom pour appeler ce que j'ai besoin ?

C'est sûrement pas très clair donc je peux ré-expliquer si besoin.

Merci d'avance
A voir également:

10 réponses

Profil bloqué
11 mai 2011 à 10:58
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)


0
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 ?
0
Profil bloqué
11 mai 2011 à 11:20
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..

0
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Profil bloqué
11 mai 2011 à 11:51
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.
0
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 ?
0
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 =$
0
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
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

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
0
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
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)
0
Ah oui ! j'avais oublié les déclarations en public hors module =$
Sinon la proposition du module TraiteSexe j'avais déjà testé un truc dans le genre mais ca fonctionnait pas. Peut-être que c'est parce que j'avais pas déclaré en public.

J'essaierai demain et je te tiens au courant =)

Merci =)
0
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
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+
0
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
0
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
...
0