Conditionnel multiple [Excel VBA] - VB/VBA/VBS - Programmation
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.
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...
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+
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+
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é?
Merci d'avance