Utilisation de fonctions et conditions &/Or
Bonsoir,
J'ai un tableau dans lequel j'ai des entiers (de 11 à 99) qui traduisent des comportements.
Je veux aller chercher ces comportements qui déclenchent certains type d'actions. Par exemple, si j'ai la case 11 qui correspond à un trajet en voiture, je vais associer une quantité d'essence consommée. Le fait est que je veux associer plusieurs comportements à une même fonction je fais :
For NoLig = 2 To DerLig
For NoCol = 3 To DerCol + 1 ' Début à 3 car condition initiale à 1
' Tri en fonction de l'emploi du temps de la personne
If Worksheets("PPP").Cells(NoLig, NoCol - 1) = 11 Then
Worksheets("SOC").Cells(NoLig, NoCol) = DO1(NoLig, NoCol)
ElseIf Worksheets("PPP").Cells(NoLig, NoCol - 1) = 12 Or 13 Then
Worksheets("SOC").Cells(NoLig, NoCol) = DO2(NoLig, NoCol)
Else
Worksheets("PPP").Cells(NoLig, NoCol) = DO3(NoLig, NoCol)
End If
Next NoCol
Next NoLigCela marche bien, mais comme je multiplie ce module dans mon code, j'aimerai pouvoir remplacer 12 or 13 par une fonction (de sorte à quand je veux modifier un chiffre, je n'ai pas à tous les changer, ce qui comporte des risques d'oublies) ... et là réside le drame.
J'ai donc remplacé par :
For NoLig = 2 To DerLig
For NoCol = 3 To DerCol + 1 ' Début à 3 car condition initiale à 1
' Tri en fonction de l'emploi du temps de la personne (0, 1, 2)
If Worksheets("PPP").Cells(NoLig, NoCol - 1) = APPL1() Then
Worksheets("SOC").Cells(NoLig, NoCol) = DO1(NoLig, NoCol)
ElseIf Worksheets("PPP").Cells(NoLig, NoCol - 1) = APPL2() Then
Worksheets("SOC").Cells(NoLig, NoCol) = DO2(NoLig, NoCol)
Else
Worksheets("SOC").Cells(NoLig, NoCol) = DO3(NoLig, NoCol)
End If
Next NoCol
Next NoLigAvec,
Function APPL2()
APPL2 = 12 Or 13
End Function
Function APPL1()
APPL1= 11
End FunctionEst-ce que quelqu'un peut m'expliquer ce qui ne fonctionne pas ? et éventuellement ce qu'il faut faire ?
Merci d'avance et je reste à votre disposition si je n'ai pas été clair !
Bonsoir,
et si vous fesiez comme ci-dessous, cela vous conviendrai ?
Dim var1, var2, var3
' une seul zone pour modifier les valeurs de test
var1 = 11
var2 = 12
var3 = 13
' module pouvant être répété plusieurs fois
For NoLig = 2 To DerLig
For NoCol = 3 To DerCol + 1 ' Début à 3 car condition initiale à 1
' Tri en fonction de l'emploi du temps de la personne
If Worksheets("PPP").Cells(NoLig, NoCol - 1) = var1 Then
Worksheets("SOC").Cells(NoLig, NoCol) = DO1(NoLig, NoCol)
ElseIf Worksheets("PPP").Cells(NoLig, NoCol - 1) = var2 Or Worksheets("PPP").Cells(NoLig, NoCol - 1) = var3 Then
Worksheets("SOC").Cells(NoLig, NoCol) = DO2(NoLig, NoCol)
Else
Worksheets("PPP").Cells(NoLig, NoCol) = DO3(NoLig, NoCol)
End If
Next NoCol
Next NoLig
' les valeurs peuvent même être modifiées entre deux modules !
var1 = 9
var2 = 15
var3 = 16
' module pouvant être répété plusieurs fois
For NoLig = 2 To DerLig
For NoCol = 3 To DerCol + 1 ' Début à 3 car condition initiale à 1
' Tri en fonction de l'emploi du temps de la personne
If Worksheets("PPP").Cells(NoLig, NoCol - 1) = var1 Then
Worksheets("SOC").Cells(NoLig, NoCol) = DO1(NoLig, NoCol)
ElseIf Worksheets("PPP").Cells(NoLig, NoCol - 1) = var2 Or Worksheets("PPP").Cells(NoLig, NoCol - 1) = var3 Then
Worksheets("SOC").Cells(NoLig, NoCol) = DO2(NoLig, NoCol)
Else
Worksheets("PPP").Cells(NoLig, NoCol) = DO3(NoLig, NoCol)
End If
Next NoCol
Next NoLig@ bientôt
LouReeD
Bonjour,
Le fait est que l'occurrence de ces conditions est d'une vingtaine dans mes différents modules. Et que parfois c’est 11... parfois 11 & 12, ou parfois 11 or 12 etc. Ce qui nécessite j'ai l'impression quelques ajustements systématiques. Je me demande si une approche par liste/tableau ne le ferait pas ?
Du style, ma variable c'est [11] [11, 12] et après je fais une condition d'inclusion. Cela se fait-il en VBA ?
Merci en tout cas !
Bonjour,
ceci dit je suis peut être le seul, mais sans fichier en support j'ai quelque fois du mal à saisir la mécanique de la question...
@ bientôt
LouReeD
Pour ce qui était votre question :
Pourquoi ça ne marche pas ? :
Function APPL2()
APPL2 = 12 Or 13
End Function
Function APPL1()
APPL1= 11
End FunctionParce que une fonction sous VBA renvoie en son propre nom le résultat d'un code.
Votre Appl1() doit fonctionner car il y a bien une valeur APPL1= 11
Mais votre fonction APPL2() ne fonctionne certainement pas car vous lui demandez de renvoyer soit 12 soit 13 !
En gros c'est à elle de choisir, or en VBA le code ne choisi pas (si ce n'est RND...)
A moins que APPL2() soit déclarée comme un STRING et que vous arriviez à intégrez dans votre IF le fait de prendre en compte le OR de cette variable STRING.
Deuxième difficulté : en VBA on ne peut écrire (je crois) "Si variable égale à 8 ou 10 alors..."
IF Variable = 8 OR 10 THEN
il faut coder :
IF Variable = 8 OR Variable = 10 THEN
Non je crois le mieux est d'avoir un fichier support pour visualiser ce que vous voulez faire, et peut-être qu'en codant différemment on arrivera à votre demande...
@ bientôt
LouReeD
Bonsoir,
Au passage, pour renforcer les explications de LouReed (salut !) cette ligne :
ElseIf Worksheets("PPP").Cells(NoLig, NoCol - 1) = 12 Or 13 Thenrenverra toujours VRAI quelle que soit la valeur de la cellule indiquée, car 13 ne réfère pas à la valeur de ladite cellule, est un nombre différent de 0 qui se convertit donc en valeur logique VRAI...
De même (en ce qui concerne ton utilisation du code) j'espère que ton indication "& ou OR" n'est qu'une simplification d'écriture dans ton post, et que tu ne confonds pas & et And qui sont des opérateurs différents, l'un étant un opérateur de concaténation de chaînes, l'autre un opérateur logique.
Cordialement
NB- LouReed est loin d'être le seul à estimer nécessaire un fichier en support dans la plupart des cas...
Bonsoir,
Merci pour vos réponses qui me sont très instructives. Je comprends qu'il est plus simple de comprendre un problème avec l'ensemble du code, mais là n'est pas l'objectif. C'est à moi de comprendre d'où vient le problème et de le résorber
En fait, les deux fonctions tournent, mais le problème et que je n'obtenais pas le bon résultat.
Merci !
Bonsoir,
c'est aussi ce que j'essaye de faire : orienté la recherche sans pour autant "tout faire"...
@ bientôt et merci à vous pour vos mercis
LouReeD