Pb d'arrêt de fonction en VBA

Fermé
Clark Devlin - 13 août 2003 à 09:44
 Clark Devlin - 13 août 2003 à 14:08
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

maily Messages postés 7556 Date d'inscription lundi 26 juin 2000 Statut Contributeur Dernière intervention 23 juin 2023 453
13 août 2003 à 10:44
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
13 août 2003 à 11:29
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 lundi 26 juin 2000 Statut Contributeur Dernière intervention 23 juin 2023 453
13 août 2003 à 11:39
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
13 août 2003 à 11:45
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 lundi 26 juin 2000 Statut Contributeur Dernière intervention 23 juin 2023 453
13 août 2003 à 11:55
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
13 août 2003 à 12:00
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
13 août 2003 à 12:07
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
13 août 2003 à 13:12
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
13 août 2003 à 13:14
...de plus, la fonction a l'air de me retourner toujours False, pourquoi?
0
Utilisateur anonyme
13 août 2003 à 13:25
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
13 août 2003 à 13:58
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
13 août 2003 à 14:08
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