Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

find et recherche de valeur numerique '07' ou '7'

9 réponses
Avatar
loko
j'ai une colonne qui contient des identifiant numeriques de sociétés (commandes/sociétés).
pour la meme société par ex la 23, on peut avoir 0023 023 23
et quandd je dois cherche cette société avec find, je ne peut raisonnablement trouver que la 23 (je vais pas non plus essayer tout ca: 023 0023 00023 000023 !..)

Comme pour le sort avec Datatoption=xlSortNormal/xlSortTextAsNumbers,
je pensais qu'on pouvait distinguer uen recherche en mode texte ou en mode numerique (par val : 23 = 023) :
selection.Find("23", , LookIn:=xlValues, LookAt:=xlWhole).address

selection.Find(cint("23"), , LookIn:=xlValues, LookAt:=xlWhole).address

or ceci ne change rien apparement...

j'ai un peu essayé tout azimut, mais j'ai du louper des trucs au passage...
---> y a til un format spécial pour le find genre what:="#23" (comme le format de VB ?!?)

---> y a il d'autres méthodes à part:
- appliquer le format "0000000X" à toute la colonne, faire le find, puis annuler le format" (les codes doievnt rester tel quel)
- un sort avec xlSortTextAsNumbers , for each + if val(cellule)=23 sur toutes les cellules


la je sèche....


merci

9 réponses

Avatar
AV
Un truc m'échappe :
Si ton champ (contenant les identifiants) est au format texte (23 ou 0023 ou
...), find fait très bien le distinguo entre ces diverses valeurs

??
AV
Avatar
Ricky [MVP]
Bonjour *AV* (et tous les lecteurs)
| Un truc m'échappe :
| Si ton champ (contenant les identifiants) est au format texte (23 ou
| 0023 ou ...), find fait très bien le distinguo entre ces diverses
| valeurs
|
| ??
| AV

Justement, je pense que *loko* souhaite que toutes les occurences soient prises en compte, les 0 de gauche n'étant pas significatifs.

--
Ricky [MVP] Visitez les faq....
http://www.faqoe.com http://faq.ms.word.free.fr
http://dj.joss.free.fr/faq.htm http://www.excelabo.net
Avatar
AV
Justement, je pense que *loko* souhaite que toutes les occurences soient
prises en compte, les 0 de gauche n'étant pas significatifs.


Ha.....
Alors .. la 1° ligne de la plage A1:A20 (à adapter) contenant "23" :

MsgBox [match(1,isnumber(find("23",A1:A20))*1,0)]

AV

Avatar
BJ
Bonjour Ioko,
Je pense que ceci corresponds à ton attente, une msgbox te demande de
poursuivre la recherche ou pas.
23 023 0023 sont pris en compte mais pas 123 ou 231
Bruno


num = 23 'cé ton exemple num doit prendre le N°du fournisseur
With Range("A1:A65536") 'A modifier en conséquence
Set c = .Find(num, LookIn:=xlValues)
If Not c Is Nothing Then
firstAddress = c.Address
Do
If c.Value * 1 = num Then
c.Activate
rep = MsgBox("Continuer la recherche ?", 4 + 32, "Recherche")
If rep = vbNo Then Exit Sub
End If
Set c = .FindNext(c)
Loop While Not c Is Nothing And c.Address <> firstAddress
End If
End With
MsgBox "Recherche terminée!"


loko a écrit dans le message :

j'ai une colonne qui contient des identifiant numeriques de sociétés
(commandes/sociétés).

pour la meme société par ex la 23, on peut avoir 0023 023 23
et quandd je dois cherche cette société avec find, je ne peut
raisonnablement trouver que la 23 (je vais pas non plus essayer tout ca:

023 0023 00023 000023 !..)

Comme pour le sort avec Datatoption=xlSortNormal/xlSortTextAsNumbers,
je pensais qu'on pouvait distinguer uen recherche en mode texte ou en mode
numerique (par val : 23 = 023) :

selection.Find("23", , LookIn:=xlValues, LookAt:=xlWhole).address

selection.Find(cint("23"), , LookIn:=xlValues, LookAt:=xlWhole).address

or ceci ne change rien apparement...

j'ai un peu essayé tout azimut, mais j'ai du louper des trucs au
passage...

---> y a til un format spécial pour le find genre what:="#23" (comme le
format de VB ?!?)


---> y a il d'autres méthodes à part:
- appliquer le format "0000000X" à toute la colonne, faire le find, puis
annuler le format" (les codes doievnt rester tel quel)

- un sort avec xlSortTextAsNumbers , for each + if val(cellule)# sur
toutes les cellules



la je sèche....


merci



Avatar
Daniel.M
Complément d'info pour loko,

Ha.....
Alors .. la 1° ligne de la plage A1:A20 (à adapter) contenant "23" :

MsgBox [match(1,isnumber(find("23",A1:A20))*1,0)]



Pour gérer la valeur d'erreur retournée lorsqu'on ne trouve pas le 23:

Dim res As Variant
res = [match(1,isnumber(find("23",A1:A20))*1,0)]
If IsError(res) Then
MsgBox "Non-Trouvé"
Else
MsgBox "Trouvé en position " & res
End If

Salutations,

Daniel M.

Avatar
loko
merci pr ce code.
mais j'arrive po à faire marcher cet exemple...

il trouve que le 23 mais pas les 023 00023
car (je sais pas si ton algo doit resoudre le pb), mais normalement un find(23) ne reconnait pas les 023 00023

Mais peut-etre que l'attribut LookIn:=xlValues permettait de resoudre ce pb du find ?



Bonjour Ioko,
Je pense que ceci corresponds à ton attente, une msgbox te demande de
poursuivre la recherche ou pas.
23 023 0023 sont pris en compte mais pas 123 ou 231
Bruno


num = 23 'cé ton exemple num doit prendre le N°du fournisseur
With Range("A1:A65536") 'A modifier en conséquence
Set c = .Find(num, LookIn:=xlValues)
If Not c Is Nothing Then
firstAddress = c.Address
Do
If c.Value * 1 = num Then
c.Activate
rep = MsgBox("Continuer la recherche ?", 4 + 32, "Recherche")
If rep = vbNo Then Exit Sub
End If
Set c = .FindNext(c)
Loop While Not c Is Nothing And c.Address <> firstAddress
End If
End With
MsgBox "Recherche terminée!"


loko a écrit dans le message :

j'ai une colonne qui contient des identifiant numeriques de sociétés
(commandes/sociétés).

pour la meme société par ex la 23, on peut avoir 0023 023 23
et quandd je dois cherche cette société avec find, je ne peut
raisonnablement trouver que la 23 (je vais pas non plus essayer tout ca:

023 0023 00023 000023 !..)

Comme pour le sort avec Datatoption=xlSortNormal/xlSortTextAsNumbers,
je pensais qu'on pouvait distinguer uen recherche en mode texte ou en mode
numerique (par val : 23 = 023) :

selection.Find("23", , LookIn:=xlValues, LookAt:=xlWhole).address

selection.Find(cint("23"), , LookIn:=xlValues, LookAt:=xlWhole).address

or ceci ne change rien apparement...

j'ai un peu essayé tout azimut, mais j'ai du louper des trucs au
passage...

---> y a til un format spécial pour le find genre what:="#23" (comme le
format de VB ?!?)


---> y a il d'autres méthodes à part:
- appliquer le format "0000000X" à toute la colonne, faire le find, puis
annuler le format" (les codes doievnt rester tel quel)

- un sort avec xlSortTextAsNumbers , for each + if val(cellule)# sur
toutes les cellules



la je sèche....


merci








Avatar
AV
Et ce que je t'ai répondu ou le rajout de Daniel, ça le fait pas chez toi ?

Pfff........
AV
Avatar
Daniel.M
j'étais en train de tester:
c'est interessant vos post: en fait, je vais essayer de
combiner vos 2 méthodes car y a des avantages et inconvenients
- match(1,isnumber(find("23",A1:A20))*1,0)] trouve bien
les 23 0023 00023 mais aussi 223. en fait ca a l'air de chercher 23.
(peut-etre equivalent à un find (*23*") ?)


res = [match(23,A1:A20*1,0)]

avec le code de gestion d'erreur autour.

Salutations,

Daniel M.

Avatar
Daniel.M
J'aurais tendance à inscrire la plage en paramètre à la fonction.
Ainsi, si tu changes tes données en A1:A10, le résultat de la fonction changera
lui-aussi automatiquement.

function myFind(s as string, Plage as Range)
myFind=Evaluate("match(" & s & "," & _
Plage.address (external:=true) & "*1,0)")
end function

Salutations,

Daniel M.

"loko" wrote in message
news:
YES !!!!

ca marche !
j'ai converti pr exploiter sous VBA:

function myFind(s as string)

myFind=Evaluate("match(" & s & ",'C:persoVBA[Sort.xls]Sort'!A1:A10*1,0)")

end function

pas con, j'ai compris :
en fait le *1 oblige à faire le calcul de la val sur chaque cellule et à virer
les 0 et les espaces. C'etait assez difficile à faire en VBA. Le pb qd on vient

de VB, on pense pas formule et cie...

Merci


j'étais en train de tester:
c'est interessant vos post: en fait, je vais essayer de
combiner vos 2 méthodes car y a des avantages et inconvenients
- match(1,isnumber(find("23",A1:A20))*1,0)] trouve bien
les 23 0023 00023 mais aussi 223. en fait ca a l'air de chercher 23.
(peut-etre equivalent à un find (*23*") ?)


res = [match(23,A1:A20*1,0)]

avec le code de gestion d'erreur autour.

Salutations,

Daniel M.