Microsoft 365 Fonction Find.Range

NicoB42

XLDnaute Nouveau
Bonjour à tous,

Je souhaite rechercher une chaîne de caractères d’une Textbox dans un colonne d’un fichier Excel et de renvoyer le numéro de la cellule correspondante.

Pour cela, sans problème, j’ai réussi à taper le code vba qui va bien et je suis assez content du résultat. Cependant, je viens de m’apercevoir que lorsque que je rentre partiellement la chaine de caractère, cela fonctionne aussi…

Exemple:
Si je souhaite chercher 123456 et que je tape 123, j’ai un résultat et cela me valide me code. L’ennui est que je travaille sur des chaînes de caractères proches et que cela pourrait générer des erreurs.
N’y a t il pas moyen de faire une recherche sur une chaîne exact?

Merci
 
Solution
Re,

Au cas où vous utiliseriez Range.Find, voyez du coté du paramètre :

LookAtFacultatifVariantIl peut s'agir de l'une des constantes XlLookAt suivantes : xlWhole ou xlPart.

Avec
NomValeurDescription
xlPart2Détecte une correspondance avec une partie du texte recherché.
xlWhole1Détecte une correspondance avec l'ensemble du texte recherché.

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @NicoB42, bienvenue sur XLD :),

Faisons appel à Madame IRMA pour faire apparaitre votre code ;)...

1694613304691.png
 
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Re,

Au cas où vous utiliseriez Range.Find, voyez du coté du paramètre :

LookAtFacultatifVariantIl peut s'agir de l'une des constantes XlLookAt suivantes : xlWhole ou xlPart.

Avec
NomValeurDescription
xlPart2Détecte une correspondance avec une partie du texte recherché.
xlWhole1Détecte une correspondance avec l'ensemble du texte recherché.
 

NicoB42

XLDnaute Nouveau
Effectivement cela peut sûrement être la solution car je ne précise que le critère recherché et donc, par défaut, cela doit travailler en partiel.
Je vais tester d’ajouter xlWhole à la recherche.
Pour le code, si le xlWhole ne fonctionne pas, je le transmettrai.
Je dois faire un extract car il y a un peu de confidentialité ;)
Merci pour vos retour
 

mapomme

XLDnaute Barbatruc
Supporter XLD
et donc, par défaut, cela doit travailler en partiel.

C'est plus vicieux que ça :

Les paramètres de LookIn, LookAt, SearchOrder, et MatchByte sont enregistrés chaque fois que vous utilisez cette méthode. Si vous ne spécifiez pas de valeurs pour ces arguments la prochaine fois que vous appelez la méthode, les valeurs enregistrées sont utilisées. Lorsque vous définissez ces arguments, les paramètres de la boîte de dialogue Find sont modifiés, et lorsque vous changez les paramètres de la boîte de dialogue Find, les valeurs enregistrées qui sont utilisées si vous omettez les arguments sont modifiées. Pour éviter les problèmes, définissez ces arguments de façon explicite chaque fois que vous utilisez cette méthode.

Voyez ICI.
 

Staple1600

XLDnaute Barbatruc
Bonsoir le fil

Sauf erreur de ma part, Excel fait cela tout seul comme un grand
(sans macro mais avec les doigts, au moins deux ;)
CTRL+F
(affiche ce qu'on pourrait appeler une TextBox (ma foi de fort belle facture)

Et le résultat est ergonomique puisque on nous affiche l'adresse de la ou des cellules contenant la valeur cherchée et en plus on nous y emmène d'un clic ;)
(voir exemple ci-dessous)
CTRLF.png
 

NicoB42

XLDnaute Nouveau
Bonjour à tous,

Merci pour le support, j'ai essayé d'ajouté le "lookat:=xlWhole", je pense que c'est cela le problème par contre maintentant je sors en erreur car je n'ai pas la valeur exact ;). Je progresse.

Effectivement quand j'ai la valeur exact cela marche par contre quand je n'ai pas la valeur, je sors en erreur 91 ce qui est normal car je n'ai pas programmé le Nothing de la fonction find.

Le code est le suivant
1694694982805.png

Private Sub BtnValider_Click()

Dim Lign As Integer
Lign = 1
While Hoja4.Range("A" & Lign).Value <> ""
Lign = Lign + 1
Wend

If Me.Text_Chp1 <> "" And Me.Text_Chp2 <> "" Then
MSTLinea = Hoja1.Range("B:B").Find(Me.Text_Chp1.Value, Lookat:=xlWhole).Row
Hoja4.Range("A" & Lign).Value = Me.Text_Chp1
Hoja4.Range("B" & Lign).Value = Me.Text_Chp2
Hoja1.Range("E" & MSTLinea).Value = Hoja4.Range("B" & Lign).Value
Hoja4.Range("C" & Lign).Value = Now
Hoja1.Range("F" & MSTLinea).Value = Hoja4.Range("C" & Lign).Value
Else
MsgBox "Champ vide"
End If
End Sub


Le problème que j'ai maintenant et la déclaration de "MSTLinea" qui doit me donner un numéro de ligne mais que je ne sais pas gérer si le résultat est Nothing en cas de recherche infructueuse.

Pour repondre @Staple1600 , je ne passe par directement par excel car j'utilise des formulaires pour remplir ma table avec un lecteur Code à barre donc j'utilise le vba pour remplir toute la table excel qui est au final un fichier de traçabilité.

Encore merci d'avance pour le support.
Je pense que vous verrez avec mon code que je suis plutot autodidact et que je ne suis pas une référence de vba. J'ai essayé de déclarer MSTLinea en string ou autre mais sans succès.
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @NicoB42 :),

Peut-être avec ce code ?:
VB:
Private Sub BtnValider_Click()
Dim Lign As Long     ' un numéro de ligne pouvant dépasser la valeur max d'un integer
                     ' on déclare en général un numéro de ligne as Long
Dim MSTLinea As Long
   Lign = 1
   While Hoja4.Range("A" & Lign).Value <> ""
      Lign = Lign + 1
   Wend
  
   If Me.Text_Chp1 <> "" And Me.Text_Chp2 <> "" Then
      MSTLinea = 0            ' le n° de ligne est mis à 0
      On Error Resume Next    ' si FIND ne trouve, on continue à l'instruction suivante
      MSTLinea = Hoja1.Range("B:B").Find(Me.Text_Chp1.Value, Lookat:=xlWhole).Row
      On Error GoTo 0         ' on rétablit l'interception normale des erreurs
      ' on teste si on a trouvé une ligne (sinon MSTLinea sera resté à 0)
      If MSTLinea = 0 Then
         ' on a trouvé le texte
         Hoja4.Range("A" & Lign).Value = Me.Text_Chp1
         Hoja4.Range("B" & Lign).Value = Me.Text_Chp2
         Hoja1.Range("E" & MSTLinea).Value = Hoja4.Range("B" & Lign).Value
         Hoja4.Range("C" & Lign).Value = Now
         Hoja1.Range("F" & MSTLinea).Value = Hoja4.Range("C" & Lign).Value
      Else
         ' on n'a pas trouvé le texte
         ' instructions à exécuter dans ce cas
         ' ...
         ' ...
      End If
   Else
      ' instruction si Me.Text_Chp1 est vide ou Me.Text_Chp2 est vide
      ' si on ne fait rien, on supprimera le "Else"
   End If
End Sub
 

NicoB42

XLDnaute Nouveau
Bonjour @NicoB42 :),

Peut-être avec ce code ?:
VB:
Private Sub BtnValider_Click()
Dim Lign As Long     ' un numéro de ligne pouvant dépasser la valeur max d'un integer
                     ' on déclare en général un numéro de ligne as Long
Dim MSTLinea As Long
   Lign = 1
   While Hoja4.Range("A" & Lign).Value <> ""
      Lign = Lign + 1
   Wend
 
   If Me.Text_Chp1 <> "" And Me.Text_Chp2 <> "" Then
      MSTLinea = 0            ' le n° de ligne est mis à 0
      On Error Resume Next    ' si FIND ne trouve, on continue à l'instruction suivante
      MSTLinea = Hoja1.Range("B:B").Find(Me.Text_Chp1.Value, Lookat:=xlWhole).Row
      On Error GoTo 0         ' on rétablit l'interception normale des erreurs
      ' on teste si on a trouvé une ligne (sinon MSTLinea sera resté à 0)
      If MSTLinea = 0 Then
         ' on a trouvé le texte
         Hoja4.Range("A" & Lign).Value = Me.Text_Chp1
         Hoja4.Range("B" & Lign).Value = Me.Text_Chp2
         Hoja1.Range("E" & MSTLinea).Value = Hoja4.Range("B" & Lign).Value
         Hoja4.Range("C" & Lign).Value = Now
         Hoja1.Range("F" & MSTLinea).Value = Hoja4.Range("C" & Lign).Value
      Else
         ' on n'a pas trouvé le texte
         ' instructions à exécuter dans ce cas
         ' ...
         ' ...
      End If
   Else
      ' instruction si Me.Text_Chp1 est vide ou Me.Text_Chp2 est vide
      ' si on ne fait rien, on supprimera le "Else"
   End If
End Sub
Merci pour le code j’ai inversé les lignes entre if MSTLinea = 0 et le Else car sinon cela ne fonctionnait pas.
Effectivement, on ne trouve pas de ligne 0 et donc cela génère un bug quand on veut écrire.
En plus MSTLINEA est mon index de ligne donc pour valider la copie des champs, il doit être forcément supérieur à 1.
Mais en faisant l’inversion, cela marche génial.

Merci @mapomme

Ça fait bizarre, c’est comme si je ne te remerciais pas vraiment et que je me félicitais…
En tout cas merci à tous pour l’aide.
 

Discussions similaires

Réponses
10
Affichages
453

Statistiques des forums

Discussions
313 314
Messages
2 097 069
Membres
106 832
dernier inscrit
SuperTimor