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.
A voir également:

12 réponses

maily Messages postés 7556 Date d'inscription   Statut Contributeur Dernière intervention   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
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
maily Messages postés 7556 Date d'inscription   Statut Contributeur Dernière intervention   453
 
Je crois que c'est parce que tu ne vides jamais ton tableau! Donc ton test d'arret est mauvais!
non?

Maily   :-))))
0
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
maily Messages postés 7556 Date d'inscription   Statut Contributeur Dernière intervention   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
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
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
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
Clark Devlin
 
...de plus, la fonction a l'air de me retourner toujours False, pourquoi?
0
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
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
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