Pb d'arrêt de fonction en VBA

Clark Devlin -  
 Clark Devlin -
Bonjour!

Je voudrais savoir ce qui ne va pas dans cette fonction qui est supposée retourner false à la fin de la boucle ou true si p appartient bien à tableau

Function Appartient(p As Variant, tableau() As Variant)

Dim i As Integer

i = 1
Do Until IsEmpty(tableau())

If tableau(i) = p Then
GoTo fin

Else
i = i + 1

End If

Appartient = False

Loop

fin:
Appartient = True

End Function

Je ne sais pas comment arrêter le programme une fois qu'il a trouvé l'élément dans le tableau.

Je vous remercie.

12 réponses

  1. maily Messages postés 7560 Statut Contributeur 453
     
    Bonjour!!!
    moi je l'écrirais comme ça:

    
    
    If tableau(i) = p Then 
       Appartient = True 
       end function
    Else 
      i = i + 1 
    End If 
    
    
    Loop 
    
    
    
    
    End Function 
    


    Bonne journée
    Maily   :-))))
    0
  2. Clark Devlin
     
    Ben, c'est exactement comme ça que je l'ai écrit après mais ça ne marche toujours pas; je sais pas pourquoi, lorque le compilateur exécute la fonction, le i dépasse du tableau testé
    0
  3. maily Messages postés 7560 Statut Contributeur 453
     
    Je crois que c'est parce que tu ne vides jamais ton tableau! Donc ton test d'arret est mauvais!
    non?

    Maily   :-))))
    0
  4. Clark Devlin
     
    Ben au final, j'ai ça:

    Function Appartient(p As Variant, ByRef tableau() As Variant)

    Dim i As Integer

    i = 1
    Do While Not (IsEmpty(tableau(i)))

    If tableau(i) = p Then

    Appartient = True

    Exit Function

    Else
    i = i + 1

    End If

    Loop

    Appartient = False

    End Function

    Dans ma fonction principale, j'ai un tableau, par ex., à 14 elts et chaque fois qu'il le parcoure et qu'il voit que l'élément n'est pas égal aux 14 elts du tableau, au lieu de retourner false, il incrémente encore et me met ce message d'erreur: "indice en dehors de la plage".
    De plus, en faisant un pas à pas détaillé ça fait ce que je veux avant ceci.
    Que dois-je faire?
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. maily Messages postés 7560 Statut Contributeur 453
     
    Tu as une boucle infinie! Ton test d'arret de ton while est faux!

    Ton test est le suivant: faire tant que le tableau n'est pas vide pour arreter la boucle! Mais tu ne vides pas ton tableau au fur et à mesure dans ton code!
    Donc, soit tu enlèves les éléments un à un de ton tableau quand l'élément a été testé, soit, tu changes le test d'arret de ton while!

    Maily   :-))))
    0
  7. Utilisateur anonyme
     
    Salut à tous,

    Au lieu d'utiliser
    Do While Not (IsEmpty(tableau(i)))

    Loop

    il faut utiliser

    Do

    Loop Until Not (IsEmpty(tableau(i)))

    EDIT1:
    Il y a quelque chose de curieux dans ton code. Si tu as créé un tableau de 14 éléments, tableau(14) <> vide et tableau(15) n'existe pas! Donc, si tu connais la taille de ton tableau, j'utiliserais plutot un
    For i = 1 To n
    Next i

    en passant éventuellement n en paramètre de ta fonction

    Rien n'est plus dangereux qu'une idée quand on a 
    qu'une idée
      :-)
    0
  8. Utilisateur anonyme
     
    Maily,
    Comme le test porte sur tableau(i), il test si l'élément tableau(i) est vide ou non. Pas si le tabeau est composé de 0 éléments.

    :-)

    Rien n'est plus dangereux qu'une idée quand on a 
    qu'une idée
      :-)
    0
  9. Clark Devlin
     
    Ok Lelaid, ça marche avec Do...Loop Until...
    Je te remercie car tu m'as bien aidé.
    Mais à propos, je ne vois pas réellement la différence textuellement, pourrais-tu me l'expliquer?
    0
  10. Clark Devlin
     
    ...de plus, la fonction a l'air de me retourner toujours False, pourquoi?
    0
  11. Utilisateur anonyme
     
    Attention, je me suis planté. Si tu tests to code, tu remarqueras qu'il ne te renvoit pas le résultat escompté!

    Je fais un essais et reviens

    Rien n'est plus dangereux qu'une idée quand on a 
    qu'une idée
      :-)
    0
  12. Utilisateur anonyme
     
    Essaye ceci:

    Function Appartient(p As Variant, ByRef tableau() As Variant) As Boolean

    Dim i As Integer
    Dim Taille As Integer

    Appartient = False
    Taille = UBound(tableau, 1)
    For i = 0 To Taille
    If tableau(i) = p Then
    Appartient = True
    End If
    Next i

    End Function

    Rien n'est plus dangereux qu'une idée quand on a 
    qu'une idée
      :-)
    0
  13. Clark Devlin
     
    OK la fonction marche et la procédure a l'air de faire ce que j'attend; je te remercie vraiment beaucoup.
    A + tard j'espère.
    0