XL 2010 Find et format

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

cathodique

XLDnaute Barbatruc
Bonsoir,

Je suis vraiment perdu. J'utilise un masque de saisie de @patricktoulon (que je salue).
Je voudrais faire une recherche de la donnée saisie dans une texte dans une colonne d'un tableau structuré.
J'ai essayé une fonction utilisant Find et FindNext mais rien n'y fait. La fonction ne trouve rien.
Je me suis égaré et n'arrive plus à avancer.
Merci pour votre coup de main. Vous comprendrez mieux en ouvrant le fichier.

Bonne soirée
 

Pièces jointes

Solution
Re,
J'ai pris le problème à l'envers. 😉
Comme votre base de données contient des code 160, et que votre textbox contient des espaces, alors il suffit de remplacer les espaces par des espaces insécables avec :
VB:
NoIdanimal = Replace(NoIdanimal, " ", Chr(160))
Mais j'ai gardé la recherche TrouverIndex modifié.

NB: Mais si vous faites d'autres calculs sur cette BDD, n'oubliez pas la présence des codes 160.
Bonjour Cathodique,
Dans vos IdAnimal, les espaces en fait ne sont pas des espaces mais des espaces insécables. ( code 501 )
Je les ai remplacés avec la macro ReplaceCHR160. Ils deviennent un nombre, le problème est que votre textbox donne un texte et non un nombre.
Donc j'ai modifié la macro TrouverIndex pour comparer un texte à un texte.
1737328552049.png
 

Pièces jointes

Re,
J'ai pris le problème à l'envers. 😉
Comme votre base de données contient des code 160, et que votre textbox contient des espaces, alors il suffit de remplacer les espaces par des espaces insécables avec :
VB:
NoIdanimal = Replace(NoIdanimal, " ", Chr(160))
Mais j'ai gardé la recherche TrouverIndex modifié.

NB: Mais si vous faites d'autres calculs sur cette BDD, n'oubliez pas la présence des codes 160.
 

Pièces jointes

Bonsoir à tous 😉,

Comme @sylvanu, j'avais trouvé que vos pseudo-espaces sont des caractères de code ASCII 160.
Mais j'ai choisi une autre option : Dès la première recherche, je remplace tous les caractères de code 160 par de "vrais" espaces de code 32 au sein du TS BD. Ainsi la base est nettoyée de ces espaces insécables.

Le code a été simplifié. Il se trouve entièrement dans le code du bouton "Valider" et il est commenté :
VB:
Private Sub CommandButton1_Click()
Dim Id, col&, indexTS&, Ligne&
   Id = TxtNoId      ' Id de l'animal à rechercher
   If Not Id Like "### ### ### ### ###" Then    ' vérification du bon format de l'Id
      ' le format n'est pas bon -> information et sortie de la procédure
      MsgBox "L'Id de l'animal n'a pas le bon format (5 groupes de 3 chiffres)", vbCritical
      Exit Sub
   End If
   ' recherche de la colonne des IdAnimal au sein de la base (tableau structuré "BD")
   ' la colonne est le numéro absolu de la colonne (colonne de la feuille "BD")
   col = Application.Match("IdAnimal", Worksheets("BD").ListObjects(1).Range.Rows(1).EntireRow, 0)
   ' on remplace les éventuels espaces insécables (code 160) par de vrai espaces (code32)
   Worksheets("BD").Columns(col).Replace what:=Chr(160), replacement:=Chr(32), lookat:=xlPart
   ' on recherche l'Id de l'animal dans la colonne col - si pas trouvé on renvoie 0
   Ligne = Application.IfError(Application.Match(Id, Worksheets("BD").Columns(col), 0), 0)
   If Ligne = 0 Then    ' l'id est absent
      MsgBox "Aucune Occurence trouvée"
   Else                 ' l'id est présent
      ' on retire du N° de la ligne (absolu) - le n° de ligne (absolu) du TS BD pour obtenir le n° d'indexTS
      indexTS = Ligne - Worksheets("BD").ListObjects(1).Range.Row
      MsgBox "Index = " & indexTS, vbInformation
   End If
   ' à ce stade l'index de l'ID est >>>>> indexTS
End Sub
 

Pièces jointes

Bonjour @sylvanu , @mapomme ,

je viens juste d'allumer ma machine. Je vous remercie pour votre aide .
Je reviendrai un peu plus tard après avoir testé.

Encore merci à vous. Je vous souhaite une excellente journée.
Je vous dois bien ça, un retour avant mon petit déjeuner.

Comme @sylvanu, j'avais trouvé que vos pseudo-espaces sont des caractères de code ASCII 160.
Merci de me dire comment avez-vous fait pour trouver ce fameux code ASCII 160.
J'ai failli m'arracher les cheveux. J'ai torturé ma touche F8 en vain.

Je privilégie la seconde solution de @sylvanu car je ne dois pas toucher au données du Ts.

Encore merci.

Bonne journée.
 
Bonjour,
Comme j'ai supposé que la bddd était importée j'ai préféré ne pas y toucher.

Merci de me dire comment avez-vous fait pour trouver ce fameux code ASCII 160.
Quant au fameux code 160, regardez ceci 🙂
 
Dernière édition:
Merci de me dire comment avez-vous fait pour trouver ce fameux code ASCII 160.
C'est un grand classique. Quand des fonctions texte de recherche n'aboutissent pas alors qu'on sait que la valeur recherchée est présente, on s'oriente vers la présence de ce caractère de code ASCII 160. Ca se produit assez fréquemment quand on importe des données depuis un site Web.

Je privilégie la seconde solution de @sylvanu car je ne dois pas toucher au données du Ts.
Je pense que c'est dommage. Car cela ne peut que vous poser des problèmes par la suite. Même une simple recherche au niveau Excel (Ctrl+H) à la mimine échouera. A moins de bien saisir les espaces insécables via le clavier.
 
Dernière édition:
Re @cathodique,

Voici la version v1a. Elle est identique à la version v1 mais elle ne modifie pas le tableau structuré BD.
VB:
Private Sub CommandButton1_Click()
Dim Id32, Id160, col&, indexTS&, Ligne&
   Id32 = Application.Trim(TxtNoId)
   If Not Id32 Like "### ### ### ### ###" Then       ' vérification du bon format de l'Id
      ' le format n'est pas bon -> information et sortie de la procédure
      MsgBox "L'Id de l'animal n'a pas le bon format (5 groupes de 3 chiffres)", vbCritical
      Exit Sub
   End If
   Id160 = Replace(Id32, Chr(32), Chr(160))     ' Id de l'animal à rechercher avec espaces insécables
   ' recherche de la colonne des IdAnimal au sein de la base (tableau structuré "BD")
   ' la colonne est le numéro absolu de la colonne (colonne de la feuille "BD")
   col = Application.Match("IdAnimal", Worksheets("BD").ListObjects(1).Range.Rows(1).EntireRow, 0)
   ' on recherche l'Id de l'animal dans la colonne col - si pas trouvé alors on renvoie 0
   Ligne = Application.IfError(Application.Match(Id160, Worksheets("BD").Columns(col), 0), 0)
   If Ligne = 0 Then    ' l'id est absent
      MsgBox "Aucune Occurence trouvée"
   Else                 ' l'id est présent
      ' on retire du N° de la ligne (absolu) - le n° de ligne (absolu) du TS BD (calcul index)
      indexTS = Ligne - Worksheets("BD").ListObjects(1).Range.Row
      MsgBox "Index = " & indexTS, vbInformation
   End If
   ' à ce stade l'index de l'ID est >>>>> indexTS
End Sub
 

Pièces jointes

C'est un grand classique. Quand des fonctions texte de recherche n'aboutissent pas alors qu'on sait que la valeur recherchée est présente, on s'oriente vers la présence de ce caractère de code ASCII 160. Ca se produit assez fréquemment quand on importe des données depuis un site Web.


Je pense que c'est dommage. Car cela ne peut que vous posez des problèmes par la suite. Même une simple recherche au niveau Excel (Ctrl+H) à la mimine échouera. A moins de bien saisir les espaces insécables via le clavier.
En fait, je n'importe rien. Le Ts est reconstitué par code regroupant 3 Ts élémentaires. J'utilise index/equiv appliquer aux tableaux. Les id peuvent être constitués uniquement de chiffres ou des chiffres et de lettres. Je formate donc comme ceci pour avoir un affichage dans les cellules identique.
VB:
Tbbg(j, 3) = FORMAT(tbl(i, 3), "#,0##")        ' IdAnimal
ça ne peut provenir que de cette ligne de code.

En tout cas merci beaucoup à vous deux.
Je vous souhaite une excellente journée.
 
Re @cathodique,

Voici la version v1a. Elle est identique à la version v1 mais elle ne modifie pas le tableau structuré BD.
VB:
Private Sub CommandButton1_Click()
Dim Id32, Id160, col&, indexTS&, Ligne&
   Id32 = Application.Trim(TxtNoId)
   If Not Id32 Like "### ### ### ### ###" Then       ' vérification du bon format de l'Id
      ' le format n'est pas bon -> information et sortie de la procédure
      MsgBox "L'Id de l'animal n'a pas le bon format (5 groupes de 3 chiffres)", vbCritical
      Exit Sub
   End If
   Id160 = Replace(Id32, Chr(32), Chr(160))     ' Id de l'animal à rechercher avec espaces insécables
   ' recherche de la colonne des IdAnimal au sein de la base (tableau structuré "BD")
   ' la colonne est le numéro absolu de la colonne (colonne de la feuille "BD")
   col = Application.Match("IdAnimal", Worksheets("BD").ListObjects(1).Range.Rows(1).EntireRow, 0)
   ' on recherche l'Id de l'animal dans la colonne col - si pas trouvé alors on renvoie 0
   Ligne = Application.IfError(Application.Match(Id160, Worksheets("BD").Columns(col), 0), 0)
   If Ligne = 0 Then    ' l'id est absent
      MsgBox "Aucune Occurence trouvée"
   Else                 ' l'id est présent
      ' on retire du N° de la ligne (absolu) - le n° de ligne (absolu) du TS BD (calcul index)
      indexTS = Ligne - Worksheets("BD").ListObjects(1).Range.Row
      MsgBox "Index = " & indexTS, vbInformation
   End If
   ' à ce stade l'index de l'ID est >>>>> indexTS
End Sub
Très intéressant. Le bouton valider ne figure que sur ce fichier monté pour la circonstance.
Dans mon fichier de travail, je n'ai pas ce bouton c'est pour cela que j'ai utilisé une fonction (pour pouvoir la réutiliser en changeant les paramètres). Ma fonction est appelée depuis l'évènement AfterUpdate.
Je te remercie, je vais essayer d'adapter à mon besoin.

Encore Merci.
 
Le Ts est reconstitué par code regroupant 3 Ts élémentaires.
Mais si c'est vous qui générez cette BDD pourquoi ne pas intervenir en amont en supprimer directement ces codes 160 ?
Vous auriez alors directement une BDD non "polluée".
VB:
Tbbg(j, 3) = Format(tbl(i, 3), "#,0##")             ' IdAnimal
Tbbg(j, 3) = Replace(Tbbg(j, 3), Chr(160), Chr(32)) ' Supp des codes 160.
 
Mais si c'est vous qui générez cette BDD pourquoi ne pas intervenir en amont en supprimer directement ces codes 160 ?
Vous auriez alors directement une BDD non "polluée".
VB:
Tbbg(j, 3) = Format(tbl(i, 3), "#,0##")             ' IdAnimal
Tbbg(j, 3) = Replace(Tbbg(j, 3), Chr(160), Chr(32)) ' Supp des codes 160.
Honnêtement, quand ça bloque, ça bloque.
Je n'y ai même pas pensé pour la bonne raison que j'ignorais la présence de ces espaces insécables.
Merci beaucoup. Je m'empresse de tester ta proposition.
👍👍👍👍👍
 
Bonsoir cathodique, sylvanu, mapomme,

Avec une colonne auxiliaire le tableau source n'est pas modifié :
VB:
Private Sub CommandButton1_Click()
Dim i As Variant
Application.ScreenUpdating = False
With [Tbd]
    .Columns(3).EntireColumn.Insert   'colonne auxiliaire
    .Columns(3) = "=SUBSTITUTE(RC[1],CHAR(160),CHAR(32))&RC[2]"
    i = Application.Match(TxtNoId & "Ad", .Columns(3), 0)
    .Columns(3).EntireColumn.Delete
End With
If IsNumeric(i) Then MsgBox "Index trouvé : " & i Else MsgBox "Aucune occurrence trouvée"
End Sub
La formule remplace les espaces insécables de code 160 par des espaces normaux de code 32.

A+
 

Pièces jointes

Dernière édition:
Hello,
A noter que dans le code de mapomme on peut faire aussi la recherche en utilisant le caractère générique ? (un caractère) :
VB:
Id160 = Replace(Id32, Chr(32), "?")     ' Id de l'animal à rechercher avec espaces insécables ou espaces
Cela permet de faire la recherche quelque soit le caractère d'espacement.
Ami calmant, J.P
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
4
Affichages
138
Retour