[Excel VBA] Conditionnel multiple

Conditionnel multiple [Excel VBA] - VB/VBA/VBS - Programmation

Marsh Posté le 28-11-2006 à 11:32:25    

Salut à tous
 
Je suis confronté à un petit problème de conditionnelles. J'ai 5 variables, si elles sont nulles je n'ai rien à faire, par contre si une est positive alors elle doit lancer une macro. Le problème réside dans le fait que avec des If (un If par variable) si il y en a une positive alors elle lance sa macro et c'est la fin du programme alors que j'aimerai qu'il fasse les test sur les autres variables.
 
J'ai trouvé un solution bien lourde (ci-dessous), mais j'imagine (j'espère) qu'il y a un moyen de faire ca plus légèrement. Quelqu'un pourrait-il me guider vers la voie de la simplicité?  :jap:  
 
Merci d'avance
 

Code :
  1. Sub TestSecteur()
  2. Workbooks.Open FileName:="C:\blabla.xls"
  3. Windows("blabla.xls" ).Activate
  4. Resid = Cells(20, 7).Value + Cells(21, 7).Value
  5. Terti = Cells(22, 7).Value + Cells(23, 7).Value
  6. Indus = Cells(24, 7).Value
  7. Trans = Cells(25, 7).Value
  8. Reseaux = Cells(26, 7).Value
  9. If Resid <> 0 And Terti = 0 And Indus = 0 And Trans = 0 And Reseaux = 0 Then
  10. ExtractionDonneesResid
  11. ElseIf Resid <> 0 And Terti <> 0 And Indus = 0 And Trans = 0 And Reseaux = 0 Then
  12. ExtractionDonneesResid
  13. ExtractionDonneesTerti
  14. ElseIf Resid <> 0 And Terti <> 0 And Indus <> 0 And Trans = 0 And Reseaux = 0 Then
  15. ExtractionDonneesResid
  16. ExtractionDonneesTerti
  17. ExtractionDonneesIndus
  18. ElseIf Resid <> 0 And Terti <> 0 And Indus <> 0 And Trans <> 0 And Reseaux = 0 Then
  19. ExtractionDonneesResid
  20. ExtractionDonneesTerti
  21. ExtractionDonneesIndus
  22. ExtractionDonneesTrans
  23. ElseIf Resid <> 0 And Terti <> 0 And Indus <> 0 And Trans = 0 And Reseaux <> 0 Then
  24. ExtractionDonneesResid
  25. ExtractionDonneesTerti
  26. ExtractionDonneesIndus
  27. ExtractionDonneesReseaux
  28. ElseIf Resid <> 0 And Terti <> 0 And Indus = 0 And Trans <> 0 And Reseaux <> 0 Then
  29. ExtractionDonneesResid
  30. ExtractionDonneesTerti
  31. ExtractionDonneesReseaux
  32. ExtractionDonneesTrans
  33. ElseIf Resid <> 0 And Terti <> 0 And Indus <> 0 And Trans <> 0 And Reseaux <> 0 Then
  34. ExtractionDonneesResid
  35. ExtractionDonneesTerti
  36. ExtractionDonneesIndus
  37. ExtractionDonneesTrans
  38. ExtractionDonneesReseaux
  39. 'etc... j'ai pas écrit toutes les combinaisons possibles, il y en a trop
  40. End Sub

Reply

Marsh Posté le 28-11-2006 à 11:32:25   

Reply

Marsh Posté le 28-11-2006 à 11:38:56    

Bonjour,
Tu fais  
if <ton test1> then
 blablabla1
end if
if <ton test2> then
 blablabla2
end if
 
et ainsi de suite.

Reply

Marsh Posté le 28-11-2006 à 11:46:16    

merci Paul Hood, ca marche impec!
je suis débutant mais j'ai un peu honte quand même... :D


Message édité par daboos le 28-11-2006 à 11:47:28
Reply

Marsh Posté le 03-12-2006 à 15:48:51    

Si je peux me permettre une petite remarque, l'emploi d'une telle quantité de fonctions If prend énormément de temps machine pour être traité. Je sais, à l'écran, ça ne se voit pas, mais s'il y a une dizaine de fois un tel test, alors ça va commencer à se remarquer.
 
Il aurait été plus judicieux de traiter ceci avec l'outil "Select case".
Dans un premier temps, tu dois "hiérarchiser" les variables :traiter d'abord Resi, ensuite Terti, ensuite ...
 
Tu tries ensuite le teste effectué sur chaque variable : = 0 et <> 0 .
 
Puis tu crée ta fonction :
 
Select case Resid
     case = 0
     case <> 0
EndSelect   'Resid
 
Maintenant, on va programmer le second test, celui de de Terti. Ici aussi, il y a deux tests effectués : =0 et <> 0.
Notre fonction devient
 
Select case Resid
     Case = 0
          Select case Terti
               Case = 0
               case <> 0
          EndSelect   'Terti
     case <> 0
          Select case Terti
               Case = 0
               case <> 0
          EndSelect   'Terti
EndSelect   'Resid
 
et ainsi de suite pour chacune des deux autres variables.
 
Lorsque tout est traité, dans la dernière option case de cahque groupe, on peut y introduire l'opération à effectuer.
 En supposant qu'il n'y a que 2 testes à effectuer, (je reprends la fonction ci-dessus) on aurait, en final :
 
Select case Resid
     Case = 0
          Select case Terti
               Case = 0
                    Ici l'opération à effectuer si Resid = 0 ET Terti = 0
                    exit Select
               case <> 0
                    Ici l'opération à effectuer si Resid = 0 ET Terti <> 0
                    exit Select
          EndSelect   'Terti
     case <> 0
          Select case Terti
               Case = 0
                    Ici l'opération à effectuer si Resid <> 0 ET Terti = 0
                    exit Select
               case <> 0
                    Ici l'opération à effectuer si Resid <> 0 ET Terti <> 0
                    exit Select
          EndSelect   'Terti
EndSelect   'Resid
 
 
L'avantage de ce système de programmation ?
Le gain de temps en fonction du résultat de chaque test.
En effet, dès qu'une série de test aura été effectuée sur la PREMIERE valeur (ici, Resid) et s'il n'y a pas de correspondance avec une action envisagée, la boucle de tests s'interromp immédiatement.
Dans le cas des boucles If, elles sont toutes testées à chaque fois, même si c'est inutile !
 
De plus, ce type de programmation est plus clair à lire qu'une série interminable de boucles If.
 
Pour rendre ton code plus "accessible", tu pourrais également créer des procédures qui contiennent chacune un "groupe d'opérations" que tu utilises, par exemple :  
 ProcédureUn va contenir les instructions
     ExtractionDonneesResid
     ExtractionDonneesTerti
 
Sub ProcédureUn
     ExtractionDonneesResid
     ExtractionDonneesTerti
End Sub
 
Sub ProcédureDeux
     ExtractionDonneesResid
     ExtractionDonneesTerti
     ExtractionDonneesIndus
End Sub
 
Dans ton code, tu supprime les différents appel répétés par un seul appel à la procédure voulue. Au lieu d'avoir à écrire et écrire et encore écrire toujours le même code d'instruction, avec le risque d'oublier une ligne ou de faire une fautre de frappe, tu n'as qu'à appeler la procédure.
 
Par exemple, le code
 Select case Terti
               Case = 0
                    Ici l'opération à effectuer si Resid = 0 ET Terti = 0
                    exit Select
               case <> 0
                    Ici l'opération à effectuer si Resid = 0 ET Terti <> 0
 
devient :
Select case Terti
               Case = 0
                    ProcedureUn
                    exit Select
               case <> 0
                    ProcedureDeux
 
Crois-moi, ça vaut vraiment la peine de travailler comme ça, quand tu devras relire, voire modifier ton code dans quelques jours ou quelques mois, tu te rendras vite compte des difficultés que ton code actuel présente.
 
A+


Message édité par Papy Octet le 03-12-2006 à 15:57:29
Reply

Marsh Posté le 29-01-2007 à 15:48:17    

Merci beaucoup pour le conseil Papy Octet, et le détail de ta réponse.
Je n'ai pas encore pu tester sur ma macro car je le programme a été finalisé mais je retiens l'idée.
Merci d'avoir pris le temps de faire partager tes connaissances :)
 
a+

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed