Répétition d'une partie de programme

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

  • Votes
  • Date
  • Date décroissante
  1. 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)

    1. 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 ?
      1. 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..

        1. 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
          1. 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.
            1. 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 ?
              1. 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 =$
                1. 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
                  1. 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)
                  2. 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 =)
                2. 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+
                  1. 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
                    1. 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
                      ...