Barre de recherche VBA, comment ne pas dissocier majuscules et minuscules ?
Bonjour à tous,
dans le cadre d'une mission de stage je dois développer un fichier clients sur Excel.
Pour rendre la recherche d'un client sur la feuille plus facile, j'ai fais une barre de recherche avec VBA mais la recherche prends en compte les majuscules et les minuscules en fonction de ce qui est tapé dans la barre de recherche (si on cherche le client "Cazaux", il faut obligatoirement taper "Cazaux" dans la barre de recherche, ça ne marchera pas avec les termes "cazaux" ou "CAZAUX").
Là est mon problème,
je voudrais savoir si il existait une fonction spécifique (comme la fonction sansAccent par exemple) qui permettrait de rechercher tout les termes présents dans le fichier sans prendre en compte les caractères en majuscule ou en majuscule ?
Merci pour votre aide.
Bonjour,
Pour chercher une valeur sans respecter la casse (sans se soucier des majuscules et minuscules), tu peux procéder de 4 façons, dont 2 qui sont quasi identiques, les voici:
- Range.Find, la fonction Range.find permet de chercher une valeur dans une plage de cellules données, par défaut, cette fonction ne respecte pas la casse, elle trouvera "CAZAUX" même si tu cherches "cazaux", le respect de la casse est bien sûr paramétrable.
- LCase : fonction qui fait partie de la classe "Strings", classe qui permet de manipuler des chaînes de caractères, LCase prend du texte et renvoie l'équivalent en minuscule, ainsi, "CAZAUX" donnerait "cazaux"
- UCase : pareil que LCase, mais passe tout en majuscules
- StrComp : Fait aussi partie de la classe "Strings", permet de comparer 2 chaînes de texte suivant différentes méthodes, voici la documentation de la fonction: https://docs.microsoft.com/fr-fr/office/vba/language/reference/user-interface-help/strcomp-function
Tu as peut-être d'autres méthodes, mais avec ces 4 solutions tu devrais déjà t'en sortir
Bonsoir, malgré mes efforts je n'arrive pas à intégrer les formules à ma macro
Sub Chercher()
Dim tab_mots() As String
Dim compteur As Byte
Dim ligne As Integer: Dim ligne_ext As Integer
Dim valider As Boolean
Dim entreprise As String: Dim nom_du_contact As String
Dim adresse_mail As String: Dim adresse_mail_2 As String
Dim telephone_bureau As String: Dim telephone_mobile As String
Dim fax As String: Dim telephone_domicile_contact_autres As String
Dim adresse As String: Dim cp As String
Dim ville As String: Dim pays As String
Dim chaine As String
purger
tab_mots = Split(Range("B4").Value, "")
ligne = 12: ligne_ext = 12
While Sheets("Importation").Cells(ligne, 1).Value <> ""
valider = True
entreprise = Sheets("Importation").Cells(ligne, 1).Value
nom_du_contact = Sheets("Importation").Cells(ligne, 2).Value
adresse_mail = Sheets("Importation").Cells(ligne, 3).Value
adresse_mail_2 = Sheets("Importation").Cells(ligne, 4).Value
telephone_bureau = Sheets("Importation").Cells(ligne, 5).Value
telephone_mobile = Sheets("Importation").Cells(ligne, 6).Value
fax = Sheets("Importation").Cells(ligne, 7).Value
telephone_domicile_contact_autres = Sheets("Importation").Cells(ligne, 8).Value
adresse = Sheets("Importation").Cells(ligne, 9).Value
cp = Sheets("Importation").Cells(ligne, 10).Value
ville = Sheets("Importation").Cells(ligne, 11).Value
pays = Sheets("Importation").Cells(ligne, 12).Value
chaine = entreprise & "-" & nom_du_contact & "-" & adresse_mail & "-" & adresse_mail_2 & "-" & telephone_bureau & "-" & telephone_mobile & "-" & fax & "-" & telephone_domicile_contact_autres & "-" & adresse & "-" & cp & "-" & ville & "-" & pays
For compteur = 0 To UBound(tab_mots())
If (Len(tab_mots(compteur)) > 1) Then
If (InStr(1, sansAccent(chaine), sansAccent(tab_mots(compteur)), vbtexcompare) = 0) Then
valider = False
Exit For
End If
End If
Next compteur
If (valider = True) Then
Cells(ligne_ext, 1).Value = entreprise
Cells(ligne_ext, 2).Value = nom_du_contact
Cells(ligne_ext, 3).Value = adresse_mail
Cells(ligne_ext, 4).Value = adresse_mail_2
Cells(ligne_ext, 5).Value = telephone_bureau
Cells(ligne_ext, 6).Value = telephone_mobile
Cells(ligne_ext, 7).Value = fax
Cells(ligne_ext, 8).Value = telephone_domicile_contact_autres
Cells(ligne_ext, 9).Value = adresse
Cells(ligne_ext, 10).Value = cp
Cells(ligne_ext, 11).Value = ville
Cells(ligne_ext, 12).Value = pays
ligne_ext = ligne_ext + 1
End If
ligne = ligne + 1
Wend
Cells(1, 1).Select
End Sub
Sub purger()
Dim ligne As Integer: Dim colonne As Byte
Dim image As Object
ligne = 12
For Each image In ActiveSheet.Pictures
image.Delete
Next image
While (Cells(ligne, 1).Value <> "")
For colonne = 1 To 12
Cells(ligne, colonne).Value = ""
Next colonne
ligne = ligne + 1
Wend
End Sub
Function sansAccent(chaine As String) As String
Dim ch_avec As String: Dim ch_sans As String
Dim tampon As String: Dim i As Byte: Dim position As Byte
ch_avec = "ÀÂÄÉÈÊËÎÏÔÖÇÛÜÙàâäéèêëîïôöçûüùÿ"
ch_sans = "AAAEEEEIIOOCUUUaaaeeeeiioocuuuy"
tampon = chaine
For i = 1 To Len(tampon)
position = InStr(ch_avec, Mid(tampon, i, 1))
If position > 0 Then Mid(tampon, i, 1) = Mid(ch_sans, position, 1)
Next
sansAccent = tampon
End FunctionBonjour,
Je ne vois pas à quel endroit ton code ne fonctionne pas, pas évident sans le fichier en même temps
Le code fonctionne, seulement il prends en compte la casse, et la recherche est biaisée quand on utilise la barre de recherche.
Je pourrais formater l'utilisation du fichier en obligeant les employés à saisir les nouvelles données en majuscules dans la feuille 🤷♂️ mais le but est plutôt d'avoir quelque chose de souple qui permettrait aux employés d'entrer des données majuscules ou minuscules sans soucis.
Re,
Je sais pourquoi...
regarde attentivement:
If (InStr(1, sansAccent(chaine), sansAccent(tab_mots(compteur)), vbtexcompare) = 0) Then
valider = False
Exit For
End IfTu ne vois toujours rien?
Et là?
If (InStr(1, sansAccent(chaine), sansAccent(tab_mots(compteur)), vbtexcompare) = 0) Then
La variable s'appelle vbTextCompare, comme VBA ne l'a pas reconnue car il manque le T de texT, il n'a pas mis les majuscules où il fallait, c'est pour ça que ta recherche ne marche pas bien, rajoute le T et tu devrais pouvoir rechercher sans regarder la casse.
Effectivement ça marche beaucoup mieux
Merci beaucoup
Re,
De rien!
J'ai fais essayé le fichier Excel à des collègues et la recherche se limite à 1 seul mot seulement, si l'on tape par exemple "cazaux paris" la recherche ne marche pas et affiche des lignes vides. Pourtant l'entreprise à "cazaux" dans la colonne "NOM" et "paris" dans la colonne "ADRESSE".
Dans ce cas là je ne sais absolument pas comment faire pour que la recherche fonctionne avec plusieurs termes différents séparés par un espace ?
Bonjour,
Débuguer un programme sans fichier c'est difficile... Je ne sais pas à quoi ressemble ton fichier, mais normalement tu ne devrais pas mettre deux informations différentes au même endroit, si tu cherches un nom et une adresse, ça devrait être stocké à deux endroits différents, et non au même endroit, séparés par un espace...
Bonjour à tous
Je plussoie.
Si tu as des entreprises et/ou des villes avec des noms composés, on découperait comment ?
Et puis ensuite ils vont demander une recherche sur n'importe quelle association de colonnes...
Si on veut chercher sur plusieurs champs, il faut prévoir la saisie de plusieurs champs de critères de recherche...