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 Function

Merci!

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

Rechercher des sujets similaires à "vba fonction enrichir boucle imbriquee else"