Répétition d'une partie de programme

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

10 réponses

  1. Profil bloqué
     
    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
  2. Chtitmiss
     
    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
  3. Profil bloqué
     
    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
  4. Chtitmiss
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Profil bloqué
     
    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
  7. ed
     
    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
  8. Chtitmiss
     
    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
  9. ccm81 Messages postés 11033 Statut Membre 2 434
     
    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
    1. ccm81 Messages postés 11033 Statut Membre 2 434
       
      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
    2. Chtitmiss
       
      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
  10. Zoul67 Messages postés 2001 Statut Membre 149
     
    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
  11. Chtitmiss
     
    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
    1. Chtitmiss
       
      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