Recherche avec orthographe erronée
Bonjour à tous,
Après recherche non concluant ici et là-bas, je ne trouve rien
J'ai un combobox (avec liste sans fautes d'orthographes), et un tableau de données (avec fautes d'orthographes), j'aimerai qu'il recherche et trouve dans le tableau, un critère avec orthographe similaire!
Comment mettre cela dans mon module en sachant que cela doit-être général à mon userform?
Merci encore une fois de votre aide
J'ai trouvé çà:
Option Compare TextEt j'ai remplacé cela
If C.Text Likepar
If C.Value LikeUn début ou mauvais départ???
Bonsoir,
Oui, il faut mettre "Option Compare Text" car il permet de ne pas contrôler la casse, c'est à dire que majuscule ou minuscule, aucune importance.
Par contre c'est beaucoup plus compliqué dès qu'il y a des accents ou des fautes d'orthographes, parce que s'il faut mettre une table de correspondance ou scinder la recherche d'un mot en x recherche d'extrait de mot, l'algorithme de recherche est beaucoup plus compliqué et moins fiable, car on risque de trouver des éléments non souhaités.
Regarde s'il n'est pas possible de corriger ces fautes d'orthographe avant d'utiliser la recherche.
Bonsoir Benead,
Merci de me répondre,
Ouah, franchement je ne le voyais pas comme cela, Et y-a-t-il une autre solution?
Car vu mon tableau, cela m'ai impossible de le reprendre en corrigeant toutes les fautes, beaucoup de copier/coller de données de divers sources...
Par exemple, ne peut-il pas rechercher seulement sur les 3 ou 4 premières lettres d'un mot?
A+
Bonjour,
Je reviens vers vous, car je n'ai pas eu de nouvelles....
Lors d'une recherche, comment faire pour qu'il ne recherche que sur les 1ères lettres d'un mot?
Pourquoi dans mon tableau, il ne trouve pas un mot (sans faute d'ortho) et qu'il trouve les autres sans souci, d'où cela peut-il provenir?
Franchement je cale .....
Bon weekend à vous
Bonsoir,
Concernant le mot qu'il ne trouve pas dans ta feuille, une recherche avec Excel donne ce même résultat ?
Si tu veux plus d'explications sur cette anomalie, crée un classeur vierge avec simplement un copier-coller de la cellule contenant ce mot, teste bien que l'erreur persiste et mets-la sur ce fil, je regarderai.
Pour l'utilisation de Like, la syntaxe est celle-ci :
Sub Test()
If ActiveCell.Text Like "*admission*" Then MsgBox "Trouvé"
End SubTu peux utiliser les caractères génériques *, # et ?
* remplace toute une série de caractères, # un nombre et ? un caractère alphabétique.
Si tu veux trouver le mot admission n'importe ou dans la phrase, il faut mettre "*admission*"
Si tu veux trouver ce même mot en début de phrase : "admission*" et en fin de phrase "*admission"
Si tu veux trouver ce mot avec des fotes
Si tu veux, par exemple, trouver le mot orthographe avec ou sans faute : "*or*gr*e" (Orthographe et ortografe sont trouvés)
Si tu veux trouver tout les mots tata, titi, toto et tutu en une seule recherche : "*t?t?*"
Si tu veux trouver le caractère *, il faut mettre entre crochet [*], donc si tu veux le trouver n'importe ou dans la cellule : "*[*]*"
Si tu veux trouver un mot qui comprend un nombre aléatoire : "*feuil#*", seront exclus tous les mots qui ont une lettre après feuil, par exemple feuille.
Tu peux aussi utiliser une liste de caractères dans ta comparaison, pour plus d'explications, quand tu es dans VBE, tu sélectionnes le mot Like puis tu fais F1, tu auras une aide spécifique et très complète sur cet opérateur.
Salut Benead,
Très complet ce que tu viens de m'écrire, merci beaucoup,
Je te mets le fichier en question, et fais une recherche dans "pathologie" et le mot "acné", et tu verras....
Pour les autres, enfin en partie cela fonctionne, tu trouveras peut-être des erreurs dans mon code, alors c'est open vas-y.....
J'ai d'autres questions en suspend mais pas dans ce fil et pas seulement sur ce forum...
Merci de m'aider c'est cool....
A+
Ps: le fichier joint comporte des erreurs, a ne pas prendre en compte car il y a eu des modifs entre temps, mais le code est sensiblement le même....
Bonsoir,
Bon, j'ai regardé ton code sur mon ordi du boulot, car je suis en *Office 64 bits" à la maison, et j'ai des problèmes avec l'ocx mscomctl, mais c'est un autre problème.
Le mot acné est introuvable simplement car dans ta table de chargement des pathologies, tu as écris acné suivi d'un espace. Ce que je te conseille de faire c'est d'utiliser la fonction Trim pour supprimer ces espaces parasites à chacun des combobox :
dim sPatho as String
With recherche_phyto
...
sPatho = Trim(.ComboBox_patho.Text)
...
End WithEnsuite tu fais ta recherche avec sPatho, en plus cela devrait améliorer l'exécution de ton code, car plus besoin d'aller lire le texte qu'il y a dans le combobox.
Evite de mettre des expressions à ralonge mais plutôt des mots clets :
recherche_phyto.ListView1.ListItems(recherche_phyto.ListView1.ListItems.Count).ListSubItems.Add , , ActiveCell.Offset(0, D)se remplace par exemple par :
UF.LsVPh.ListItems(UF.LsVPh.ListItems.Count).ListSubItems.Add , , ActiveCell.Offset(0, D)C'est ce que je fais pour ne pas avoir des lignes trop longues
Si tu veux considérablement améliorer l'exécution de ton code, il ne faut pas sélectionner ou activer les feuilles et les cellules, VBA peut travailler sans cela et du coup, beaucoup plus vite et cela se voit sur des bases de données de milliers de lignes :
.Cells(c.Row, 2).Activate
ActiveCell.Offset(0, D)se remplacent par
.Cells(c.Row, 2).Offset(0, D)Bonjour Benead,
Merci d'avoir regardé,
Juste pour un espace, c'est c..., je cherche depuis par mal de temps, juste pour ça...
Pour ce code:
dim sPatho as String
With recherche_phyto
...
sPatho = Trim(.ComboBox_patho.Text)
...
End WithJ'imagine qu'il faut le retranscrire pour chaque combobox?
Et le mettre dans :
Private Sub patho_Change()
'[L1] = patho
End SubEvite de mettre des expressions à rallonge mais plutôt des mots clefs :
C'est ce que je te disais, le fichier que je t'ai joint comportait des erreurs et code à rallonge, je te joins le nouveau fichier avec les simplifications de code, c'est plus lisible tu verras....
Tu pourras également apercevoir qu'il y a un nouveau userform (Usfimpres), mais j'ai encore besoin de travailler dessus. De plus 2 Lv, comme tu l'as vu, qu'il faut que je mettre en relation avec les recherches, Lv2 pour les FT et Lv3 pour prescriptions, mais bon, je reviendrai vers toi si tu le veux bien
Bonne soirée
Editer le 20/04 à 21h10
Je viens de faire les modifs, et même si je laisse l'espace, cela ne change rien avec le code que tu m'as fourni, je pense que j'ai dû faire une erreur quelque part???
Pour moi tu peux remplacer ceci :
Private Sub patho_Change()
With recherche_phyto
sPatho = Trim(.patho.Text)
End With
End Subpar ceci :
Private Sub patho_Change()
Dim sPatho As String
sPatho = Trim(patho.Text)
End SubQuand tu es dans l'Userform, tu n'es pas obligé de mettre le parent du contrôle :
recherche_phyto = me.patho = pato
Les 3 expressions sont valides, dans tous les cas, évite de nommer l'UF par son nom quand tu es dans le module de l'UF, parce que c'est inutile et en cas de renommage, il faut tout renommer, utilise plutôt le mot clef Me qui désigne l'instance de la classe en cours, donc quand tu es dans un UF, il le désigne implicitement, sans que tu aies besoin de le nommer. Personnellement, quand je suis dans un userform, je nomme les contrôles directement sans mettre le nom de l'UF ni Me.
Pour en revenir à ton problème, je ne mettrais pas le trim comme tu l'as fait, c'est à dire dans l'événement, mais simplement en début de la procédure de recherche
dim sPatho as String
With recherche_phyto
...
sPatho = Trim(.ComboBox_patho.Text)
...
End WithEnsuite tu fais la comparaison avec le résultat sPatho (et idem pour les autres combobox) :
.../.... And c.Offset(0, 4) Like "*" & sPatho & "* .../...Concernant la recherche du mot acné, sans faire de modification, la recherche à trouvé une ligne dans ton second fichier parce que tu as supprimé des lignes par rapport au premier (qui en avait plusieurs dizaines de lignes ou ce mot était présent). Il trouve la ligne 191.
Tu as encore laissé .Cells(c.Row, 2).Activate dans la recherche... cela ne sert à rien, sauf à ralentir l'exécution de ton code comme je te l'ai expliqué dans mon précédent message
Re,
Tu as encore laissé .Cells(c.Row, 2).Activate dans la recherche... cela ne sert à rien, sauf à ralentir l'exécution de ton code comme je te l'ai expliqué dans mon précédent message
Désolé
Je fais les modifs demain, car je suis au boulot et je ne peux pas modifier mon fichier, je suis en lecture seul ici.
A+
Bonjour Benead, et le forum
Niquel tout fonctionne avec ce code
Dim sPatho As String
sPatho = Trim(patho.Text)je l'ai appliqué au 3 autres combobox
idem avec celui-là:
.../.... And c.Offset(0, 4) Like "*" & sPatho & "* .../...Et pour ça:
.Cells(c.Row, 2).Offset(0, D)Je ne dois pas le faire correctement car il me colle des erreurs, je sais pas comment faire???
Et enfin comme je te le disais
Tu pourras également apercevoir qu'il y a un nouveau userform (Usfimpres), mais j'ai encore besoin de travailler dessus. De plus 2 Lv, comme tu l'as vu, qu'il faut que je mettre en relation avec les recherches, Lv2 pour les FT et Lv3 pour prescriptions, mais bon, je reviendrai vers toi si tu le veux bien
pour te demander conseils.....
Après tes réponses, je passerai le sujet en résolu,
Pourrai-je revenir vers toi afin d'avoir des éclaircissements et conseils à propos du Quote au-dessus?
Merci encore
A+
Ps: Révision du fichier ci-dessous
Bonjour à tous,
Cela fait 5 jours que je lis : "orthographe érronné".
Alors je craque.
Sans correcteur d'orthographe : orthographe erronée
mbbp
Salut à tous,
Et oui, je me doutais que cela allait faire réagir au moins une personne, chose faite.....
Merci pour ton analyse
A+
Bonjour,
J'ai adapté ton code, mais si il y a une chose à ne pas faire dans une base de données, c'est bien de fusionner les cellules. Ceci dit, cela fonctionne, ne remets pas ta BD maintenant.
Voici une adaptation sans activation de la feuille, ni utilisation d'ActiveCell :
Sub Recherches_plantes()
'Déclaration des variables
Dim c As Range, D As Byte, i
' C représente chaque cellule de la plage B4 à B et le numéro de la dernière ligne de la colonne B
' D représente le nombre de colonnes de la Lv à remplir sauf la première
'Supprimer les Espaces intempestifs dans les listes
Dim sPatho As String
sPatho = Trim(patho.Text)
Dim sPlantes As String
sPlantes = Trim(plantes.Text)
Dim sConstchimiq As String
sConstchimiq = Trim(constchimiq.Text)
Dim sActpharm As String
sActpharm = Trim(actpharm.Text)
'Suspension du raffraichissement de l'écran
Application.ScreenUpdating = False
'Vidage du contenu de la listview
Lv1.ListItems.Clear
With Sheets("Listes plantes")
' .Activate
'Définition de la plage de recherche sur la feuille active
For Each c In .Range("B4:B" & .Range("B" & Rows.Count).End(xlUp).Row)
'Critères de recherche des différents Combobox
'Si le contenu du Combobox1 correspond aux critères et que le contenu du Combobox2 et que le contenu du Combobox3 etc
If c.Value Like "*" & plantes.Text & "*" And c.Offset(0, 4) Like "*" & constchimiq.Text & "*" And c.Offset(0, 5) Like "*" & patho.Text & "*" _
And c.Offset(0, 3) Like "*" & actpharm.Text & "*" Then
If c.Address <> "$B$2" Then 'And .Cells(C.Row, 2) <> ""
' .Cells(c.Row, 2).Activate
lig = c.MergeArea.Row
'On rempli la première colonne de la listview avec la valeur de la variable
Lv1.ListItems.Add , , .Cells(lig, 2) '.Cells(C.Row, 2) '.Range(C.Address)
Lv1.ListItems(Lv1.ListItems.Count).Bold = True
'On rempli les autre colonnes de la listview par le décalage D représentant l'offset 1,2,3 etc
For D = 1 To 9
Lv1.ListItems(Lv1.ListItems.Count).ListSubItems.Add , , .Cells(lig, 2).Offset(0, D)
Lv1.ListItems(Lv1.ListItems.Count).ListSubItems(D).Bold = True
Next D
'On rempli les autres colonnes de la listview par le décalage D représentant les cellules fusionnées
For i = lig + 1 To c.Offset(1, 0).Row - 1
Lv1.ListItems.Add , , ""
For D = 3 To 11
Lv1.ListItems(Lv1.ListItems.Count).ListSubItems.Add , , .Cells(i, D)
Next D
Next i
End If
End If
Next c
End With
If Lv1.ListItems.Count = 0 Then MsgBox "Pas de résultats trouvés", vbOKOnly, "FIN DE RECHERCHE"
End SubOui, tu peux revenir vers moi, mais je suis de façon aléatoire sur ce forum, cela dépend beaucoup de me mon temps de libre...
Bonjour Benead,
Merci encore une fois,
Le code que tu m'as fourni à une erreur:
lig = c.MergeArea.Rowil bloque à lig
Oui, tu peux revenir vers moi, mais je suis de façon aléatoire sur ce forum, cela dépend beaucoup de me mon temps de libre...
Je l'entends évidemment comme cela.
Merci et bonne journée
C'est quoi le message d'erreur ? Chez moi cela fonctionne. c.MergeArea.Row récupère la première ligne de la plage des cellules fusionnées. Il faut déclarer Lig as Long en début de procédure...
Si cela bug encore envoi moi à nouveau le fichier.
Re,
C'est bon pour moi, ça fonctionne
Par contre si je créais une erreur, ex:
Dans la liste où il y a acné, page BdD, si je laisse l'espace après acné, il ne trouve rien, même avec Trim???
je n'ai pas fait le test avec les autres listes
Merci encore
Ps: quand j' écrirai un nouveau post, pour ce que je t'ai parlé plus haut, puis-je t'envoyer un MP pour te prévenir? Bien évidemment si tu as du temps et si le sujet t'intéresse.
Alienox,
Normal, je n'ai pas recontrôlé ton code, mais visiblement tu es revenu sur une version antérieure, il faut que tu remplaces patho.text par sa variable texte sPatho lors de la comparaison avec Like (idem pour les autres variables) :
.../.... And c.Offset(0, 4) Like "*" & sPatho & "* .../...Ok pour le message perso, mais parfois je suis plusieurs jours sans démarrer mon ordi, tu verras bien. Très certainement que d'autres prendrons le relais.
Dans tous les cas, soit explicite, précis et patient et tu auras ta réponse.
Si tu peux, modifie le titre du fil pour corriger la faute d'orthographe, sans doute en éditant le premier post. Il faut prendre en compte les remarques des contributeurs de ce forum, qui sont très souvent attachés à un respect minimum quant à la rédaction des messages sur les forums et dont je fais partie.
Re,
Je te remets le bon fichier, comme tu me l'avais fait modifier, la version que tu as, est sans toutes les modifs que l'on a apporté.
Sinon tout est good, ça fonctionne
Erreur du titre corrigée
Et encore merci