VÉRIFIE LA PRÉSENCE D'UN MOT DANS UN COMBOBOX (OU UNE LISTBOX)

cs_PROGRAMMIX Messages postés 1133 Date d'inscription mercredi 2 octobre 2002 Statut Membre Dernière intervention 24 juillet 2011 - 5 avril 2003 à 19:10
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 - 29 avril 2003 à 18:01
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/6641-verifie-la-presence-d-un-mot-dans-un-combobox-ou-une-listbox

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
29 avril 2003 à 18:01
oui , tu met 5 , ca ignorera les items situés avant....
cs_PROGRAMMIX Messages postés 1133 Date d'inscription mercredi 2 octobre 2002 Statut Membre Dernière intervention 24 juillet 2011 2
29 avril 2003 à 17:40
Si je suis ton message, il serait possible de rechercher une valeur située dans un mot en remplaçant le -1 par autre chose ?
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
29 avril 2003 à 17:31
lol , tu m'as pris de vitesse, PROGRAMMIX !!
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
29 avril 2003 à 17:30
ok , merci, désole !!

pour info , le parametre -1 dans le sendmessage permet de definir l'indice de depart de la recherche (-1 pour tout rechercher).......

il existe deux autres messages similaires :

const LB_FINDSTRING = &h18F
const CB_FINDSTRING = &h14C

leur fonctionnement est identique , mais ils permettent de rechercher les items qui commencent par la chaine passee en parametre....
cs_PROGRAMMIX Messages postés 1133 Date d'inscription mercredi 2 octobre 2002 Statut Membre Dernière intervention 24 juillet 2011 2
29 avril 2003 à 17:28
Et si on utilise la const suivante, il est possible de faire une recherche sur le début des mots : Const LB_FINDSTRING = &H18F
cs_PROGRAMMIX Messages postés 1133 Date d'inscription mercredi 2 octobre 2002 Statut Membre Dernière intervention 24 juillet 2011 2
29 avril 2003 à 17:12
Merci Renfield, je ne connaissais pas cette méthode et je la trouve bien pratique ; d'autant que la casse n'intervient pas.

Mais que ceux qui veulent utilise le copier-coller (comme toi et moi) fassent gaffe, car ta fonction pour un listbox comporte une erreur... une petite erreur... une distraction causée par le copier-coller...

ChercherListBox= SendMessage... et non ChercheCombo=...
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
29 avril 2003 à 11:42
j'ai une autre version de la chose.......


Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const LB_FINDSTRINGEXACT = &H1A2
Private Const CB_FINDSTRINGEXACT = &H158

Private Sub CmdOk_Click()
If -1 = ChercheCombo(Combo1.hwnd, Combo1.Text) Then
Combo1.AddItem Combo1.Text
End If
End Sub

'Renvoie le premier indice du mot dans le combo , -1 si non trouvé
Function ChercheCombo(ListHWnd As Long, Item As String) As Integer
ChercheCombo = SendMessage(ListHWnd, CB_FINDSTRINGEXACT, -1, ByVal Item)
End Function

'Pareil , pour une listbox
Function ChercheListbox(ListHWnd As Long, Item As String) As Integer
ChercheCombo = SendMessage(ListHWnd, LB_FINDSTRINGEXACT, -1, ByVal Item)
End Function
NewSky Messages postés 86 Date d'inscription dimanche 27 janvier 2002 Statut Membre Dernière intervention 20 février 2009
6 avril 2003 à 14:03
Oui, je suppose qu'il y a des simplifications à faire. J'ai réalisé ce code rapidement car j'en avais besoin. Mais vérifie qd m^ s'il n'est pas rajouté plusieur fois le mot (j'avais ce pb au début).

N'hésitez pas à commenter ma source. Merci
cs_PROGRAMMIX Messages postés 1133 Date d'inscription mercredi 2 octobre 2002 Statut Membre Dernière intervention 24 juillet 2011 2
5 avril 2003 à 19:10
Personnellement, je limiterais le nombre de variables utilisées en réduisant le code à ceci :

Private Sub CmdOk_Click()

Dim SaveTxt As String 'Variable sauvagardant le texte tel qu'il est écrit
Dim i As Integer 'i est la variable destinée à gérer la boucle for-next

SaveTxt = Combo1.Text

For i = 0 To Combo1.ListCount - 1
If UCase(Combo1.List(i)) = UCase(SaveTxt) Then 'Le mot est déjà dans le combo
MsgBox "Déjà présent dans le combo !!!", vbCritical + vbOKOnly, "Déjà"
Exit Sub 'Puisqu'il y est, je quitte la procédure
End If
Next i

'Comme le dirait Lapalisse, "si j'arrive ici, c'est que je n'ai pas quitté"...
'Donc comme le mot n'est pas dans la liste, je l'y ajoute
Combo1.AddItem SaveTxt

End Sub
Rejoignez-nous