VBA - fonction à enrichir, avec boucle imbriquée et else if
Bonjour,
Le but est d'enrichir une fonction VBA existante (merci encore à BrunoM45 !), en intégrant une nouvelle composante, la composante Génération. Les résultats de la fonction VBA actuelle sont faux (par exemple, je trouve 50 au lieu de 68 quand je sélectionne le critère A et le code tarif 3-1). Ci-joint un fichier Excel avec le code VBA incomplet. Je suis débutant en VBA et je galère, merci pour votre aide!
Pour résumer ce que doit faire la fonction :
J'ai une table de paramètres (que je ne peux pas modifier) , avec 5 colonnes : version, génération, code tarif, critère, résultat.
Code tarif = Version - Génération
Pour un critère donné, on va lire dans la table le résultat correspondant au code tarif du contrat.
1) Si pas de correspondance, on décrémente la génération de 1 jusqu’à en trouver une. Si on n’en trouve toujours pas lorsque la génération vaut 1, on passe à l’étape 2)
2) On décrémente la version de 1 et on recommence l’étape 1) en repartant de la génération du contrat.
Par exemple, si je cherche le code tarif 3-2 du critère A, alors je cherche le code tarif 3-2 sinon 3-1 sinon 2-2 sinon 2-1 sinon 1-2 sinon 1-1.
Par exemple, si je cherche le code tarif 3-3 du critère A, alors je cherche le code tarif 3-3 sinon 3-2 sinon 3-1 sinon 2-3 sinon 2-2 sinon 2-1 sinon 1-3 sinon 1-2 sinon 1-1.
Merci pour votre aide!
Thibault
Bonjour thiblight
Il faudra nous expliquer pourquoi dans un cas :
"résultat du critère A pour le code tarif 3-1 = 68 <- on cherche le code tarif 3-1 sinon 2-1 sinon 1-1 ; on retient le résultat du code tarif 2-1"
Et dans un autre cas
"résultat du critère B pour le code tarif 2-2 = 56 <- on cherche le code tarif 2-2 sinon 2-1 sinon 1-2 sinon 1-1 ; on retient le résultat du code tarif 1-1"
De 3-1 on cherche 2-1, alors pourquoi pas dans le cas 2-2 ne pas chercher 1-2
@+
Bonjour BrunoM45,
La réponse est que lorsqu'on décrémente de version, on repart de la génération du contrat.
Par exemple, soit code tarif du contrat = 3-1 (version 3 et génération 1) ; si 3-1 n'existe pas, vu que la génération est 1 on ne peut pas décrémenter la génération, donc on passe à l'étape 2 en décrémentant la version et en repartant de la génération du contrat soit 2-1.
Pour un critère donné, on va lire dans la table le résultat correspondant au code tarif du contrat.
1) Si pas de correspondance, on décrémente la génération de 1 jusqu’à en trouver une. Si on n’en trouve toujours pas lorsque la génération vaut 1, on passe à l’étape 2)
2) On décrémente la version de 1 et on recommence l’étape 1) en repartant de la génération du contrat.
Ainsi, si code tarif = 3-1 (génération de mon contrat est 1), je n'irai jamais chercher les codes tarifs 2-3, 2-2, 1-3, 1-2.
Merci!
Bonjour,
Help plz
Function GetResult(Version As Integer, Generation As Integer, Crit As String, RngParam As Range)
Dim Ind As Long, VarTab() As Variant
Application.Volatile
' Définir le tableau
VarTab = RngParam
' Parcourir les éléments du tableau afin de trouver la valeur
For Ind = UBound(VarTab) To 1 Step -1
If VarTab(Ind, 1) = Version Then
If VarTab(Ind, 4) = Crit Then
GetResult = VarTab(Ind, 5)
Exit For
End If
' Si la version ligne de dessus est inférieure à l'actuelle
' et que la solution n'a pas été trouvée, on passe à cette version
ElseIf VarTab(Ind - 1, 1) < Version Then
Version = VarTab(Ind - 1, 1)
End If
Next Ind
End FunctionMerci!
Bonjour thiblight
Merci d'être patient SVP, si cela vous semble simple, il n'en est rien ou sinon faite le vous même
De plus merci de ne pas faire de CROSS POSTING
@+
Bonjour,
Je clôture le sujet, j'ai trouvé la solution grâce au code fourni par BrunoM45.
Merci encore pour votre aide.
Function GetResult(Version As Integer, Generation As Integer, Crit As String, RngParam As Range)
Dim Ind As Long, i As Integer, j As Integer, iOK As Integer, VarTab() As Variant
Application.Volatile
iOK = 0
' Définir le tableau
VarTab = RngParam
' Parcourir les éléments du tableau afin de trouver la valeur, en cherchant la version et la génération ; si on ne trouve pas, alors parcourir à nouveau tableau en décrémentant génération, puis la version
For i = Version To 1 Step -1
For j = Generation To 1 Step -1
For Ind = UBound(VarTab) To 1 Step -1
If VarTab(Ind, 1) = i Then
If VarTab(Ind, 2) = j Then
If VarTab(Ind, 4) = Crit Then
GetResult = VarTab(Ind, 5)
iOK = 1
Exit For
End If
End If
End If
Next Ind
If iOK = 1 Then Exit For
Next j
If iOK = 1 Then Exit For
Next i
End Function
Thibault