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

méthode find

13 réponses
Avatar
ptck
Bonsoir

je cherche à trouver le jour d'une date avec la méthode find
la date est obtenue avec la formule aujourdhui() dans la feuille
j'ai essayé ceci mais çà ne marche pas
ladate = sh2.Columns("A:M").Find(What:="=aujourdhui()", LookIn:=xlFormulas,
lookat:=xlWhole, MatchCase:=False)

merci de votre aide
ptck

3 réponses

1 2
Avatar
Mishell
"MichDenis" wrote in message
news:
Bonjour Mishell,

A ) d'abord, je n'ai regardé que la première procédure de ta démonstration
:
Trouver_Tout(CDate(nombre), Range("B:B"), xlFormulas, xlWhole).Select

**** Elle réussit à retenir et sélectionner les cellules contenant ceci :
J'ai fait un copier-coller à partir du contenu de ces
cellules dans la barre de formule suite à l'exécution de la
procédure "Mettre_les_donnees_sur_la_feuille"

En B13 -> 09-03-2006 Cellule Format date
B14 -> 09-03-2006 Cellule Format date
ET
B19 -> 3/9/2006 Cellule Format Texte
**** C'est un tour de force, avec la même procédure, et une même
variable (nombre8785) passée en paramètre à la procédure,
tu réussis à sélectionner ces 3 cellules représentant 2 dates
différentes et 2 formats différents de cellule.



Dans les 3 cellules, il s'agit de la même date, qui doit être entrée en VBA
avec le format américain:
Range("B13").Formula = "3/9/2006"
Elle doit être entrée également avec le format américain en B19, soit
Range("B19").Formula = "3/9/2006" (et non pas "03/9/2006" qui ne sera pas
reconnu par la commande Find).
Mais , bien sûr, l'affichage en B19 restera "3/9/2006", étant donné que B19
est au format Texte. Et il est essentiel que le format de la date soit
américain en B19 pour que la commande Find trouve cette date dans cette
cellule au format texte.







**** Dans ta procédure : "Mettre_les_donnees_sur_la_feuille"
tu utilises ceci pour renseigner le contenu de la cellule B19
Range("B19").Select
ActiveCell.Formula = "3/9/2006"
On reconnaît que "3/9/2006" est la représentation au
format américain du contenu de la cellule B14 : 09-03-2006

Que sait-il passé ? Comme tu as retenu la propriété "Formula"
pour définir le contenu de la cellule B19, Microsoft
énonce
cette remarque dans l'aide d'Excel-vba sur cette
propriété :

Copier-coller d'une partie de l'aide sur la propriété Formula d'Excel
'***************************
Si vous affectez une date à la formule d'une cellule, Microsoft Excel
vérifie si la
cellule est déjà dotée de l'un des formats numériques ou de date. Si tel
n'est pas le cas,
Microsoft Excel lui affecte le format de date numérique par défaut
'***************************
Selon moi, Excel enregistre à l'interne une "date" et bien attendu comme
cela provient de
l'interface VBA, son format est américain. C'est ce qui "expliquerait"
qu'il puisse
reconnaître le contenu de cette cellule en utilisant XlLookIn:=XlFormula.



J'ai voulu créer une cellule (B19) formatée Texte contenant la même date que
les cellules formatées Date. Je lui ai simplement attribué le format Texte
( Selection.NumberFormat = "@" ) avant d'y inscrire le contenu par
ActiveCell.Formula = "3/9/2006"

Range("B19").Select
Selection.NumberFormat = "@"
ActiveCell.Formula = "3/9/2006"

Excel considère donc B19 comme du texte. On le voit dans la colonne C qui
contient les valeurs .Formula des cellules de la colonne B. La valeur
.Formula de B19 est 3/9/2006 (du texte) et non pas 38785 comme dans les
cellules au format Date (B13 et B14).

On voit dans le test de la fonction Find avec le paramètre xlFormulas que
Excel trouve aussi bien la date des cellules B13 et B14 (formatées Date),
que la date de la cellule B19 (formatée Texte)

Par contre, dans le test de la fonction Find avec le paramètre xlValues,
Excel trouve comme résultat B19 (formaté Texte), mais ne trouve pas B13 et
B14 (formatés Date). Ce qui me fait conclure que, avec le paramètre
xlValues, Excel ne regarde même pas la valeur .Text des cellules formatées
Date. Les cellules formatées Date sont simplement exclues de sa recherche.




****Si tu veux faire davantage de test sur la colonne B:B de ton fichier
exemple, utilise
la commande "Rechercher" du menu "édition". L'interface graphique te
permet de définir au
besoin
le paramètre "Formule" ou "Valeur". Les observations que j'ai faites vos
dans le sens des
explications que j'ai énoncées. Pour l'instant et jusqu'à preuve du
contraire, c'est ma
perception de la chose !

****Ceci étant dit, je n'ai rien à vendre, que le paramètre de xlLookIn
soit xlvalues ou
xlformulas, ce n'est pas la quintessence de mon propos. Mon objectif est
surtout de
comprendre la mécanique de ce paramètre afin de pouvoir faire un usage
éclairé de la
méthode "Find" lors d'une recherche sur les "dates". Quand il s'agit de
date dans excel,
il faut se méfier des automatismes et des copier-coller trop faciles...




Avatar
MichDenis
Bonjour Mishell,

Je laisse les usagers de ce forum le soin d'apprécier
l'argumentaire présenté.

Je m'arrête ici. Je te le répète, je n'ai rien à vendre. Pour moi,
ton raisonnement ne tient pas la route, et pour cause, tu es sur
un chemin sans issue, impraticable. Je te laisse à tes certitudes.
Avatar
Mishell
Voici la version 2 de tests pour vérifier différents résultats obtenus par
la fonction Find selon que le paramètre est xlFormulas ou xlValues.

Conclusion:
Pour chercher dans des cellules formatées Date ou formatées Nombre, xlValues
n'est pas fiable parce qu'il est dépendant du format d'affichage de la
cellule.

Son utilité est de faire une recherche dans la valeur Text de cellules
contenant une formule.

Pour faire une recherche dans des cellules formatées Date, on doit utiliser
xlFormulas avec une variable de type Date comme objet de recherche.

Pour faire une recherche d'un nombre dans des cellules formatées Nombre ou
formatées Texte, on doit utiliser xlFormulas avec, comme objet de recherche,
une variable d'un autre type que le type Date (par exemple : String, Double,
Long).

Mishell


'********************************
'Copier dans un module de feuille
Dim Annee
Dim Mois
Dim Jour

Sub Demarrer_Test_Find_xlFormulas_ou_xlValues()

Mettre_les_donnees_sur_la_feuille
Formulas_Sur_Texte
Values_Sur_Texte
Text_Sur_Texte
Columns("A:E").Select
Selection.Columns.AutoFit

Recherches
End Sub

Sub Entrer_Ici_La_Date()
Annee = 2006
Mois = 1
Jour = 14
End Sub

Sub Recherches()

Dim nombre As Long
Dim strNombre As String

Call Entrer_Ici_La_Date

nombre = DateSerial(Annee, Mois, Jour)

strNombre = CStr(nombre)

Trouver_Tout(CDate(nombre), Range("B:B"), xlFormulas, xlWhole).Select

Message = "Chercher la date (Type Date) " & CDate(nombre) & "." _
& vbCrLf & "Le critère LookIn:=xlFormulas" _
& vbCrLf & "Le critère What:Íate(nombre)" _
& vbCrLf _
& vbCrLf & "La recherche s'effectue donc dans la valeur Formula." _
& vbCrLf & "Les cellules au format Date" _
& vbCrLf & "pourront faire partie du résultat de la recherche." _
& vbCrLf & "Les cellules au format Texte contenant une date" _
& vbCrLf & "au format m/j/aaaa " _
& vbCrLf & "pourront faire partie du résultat de la recherche," _
& vbCrLf & "dépendant du format du séparateur de date dans les préférences
régionales."
MsgBox Message

Trouver_Tout(CDate(nombre), Range("B:B"), xlValues, xlWhole).Select

Message = "Chercher la date (Type Date) " & CDate(nombre) & "." _
& vbCrLf & "Le critère LookIn:=xlValues" _
& vbCrLf & "Le critère What:Íate(nombre)" _
& vbCrLf _
& vbCrLf & "Les cellules au format Date dont la valeur .Text contient une
date" _
& vbCrLf & "au format Short Date ou au format m/dd/yyyy" _
& vbCrLf & "pourront faire partie du résultat de la recherche." _
& vbCrLf & "Les cellules affichant un autre format Date seront ignorées." _
& vbCrLf & "Les cellules au format Texte dont la valeur .Text contient une
date" _
& vbCrLf & "au format m/d/yyyy" _
& vbCrLf & "pourront faire partie du résultat de la recherche." _
& vbCrLf & "" _
& vbCrLf & "XlValues est donc à éviter pour rechercher une date" _
& vbCrLf & "dans les cellules formatées Date comme dans les cellules" _
& vbCrLf & "formatées Texte."
MsgBox Message

Trouver_Tout(nombre, Range("B:B"), xlFormulas, xlWhole).Select
Message = "" _
& vbCrLf & "Cherche le nombre (Type Double) " & nombre & " dans Formula. " _
& vbCrLf & "Le critère LookIn:=xlFormulas" _
& vbCrLf & "Le critère What:=Nombre" _
& vbCrLf _
& vbCrLf & "Si la cellule est au format Date" _
& vbCrLf & "elle ne fera pas partie de résultat de la recherche," _
& vbCrLf & "ce qui est normal vu qu'on cherche un nombre et non une date."
MsgBox Message

Trouver_Tout(strNombre, Range("B:B"), xlFormulas, xlWhole).Select
Message = "" _
& vbCrLf & "Cherche le nombre (Type String) " & nombre & " dans Formula. " _
& vbCrLf & "Le critère LookIn:=xlFormulas" _
& vbCrLf & "Le critère What:=Type String" _
& vbCrLf _
& vbCrLf & "Le résultat est le même" _
& vbCrLf & "avec un Type String qu'avec un Type Double." _
& vbCrLf & "Si la cellule est au format Date" _
& vbCrLf & "elle ne fera pas partie du résultat de la recherche."
MsgBox Message

Trouver_Tout(nombre, Range("B:B"), xlValues, xlWhole).Select
Message = "" _
& vbCrLf & "Chercher le nombre " & nombre & " dans Text (ce qui est
affiché)." _
& vbCrLf & "Le critère LookIn:=xlValues" _
& vbCrLf & "Le critère What:=Nombre" _
& vbCrLf _
& vbCrLf & "Le problème est que si le format d'affichage " _
& vbCrLf & "montre 2 décimales ( par exemple 38799.00 )" _
& vbCrLf & "et que la valeur recherchée ne comporte pas 2 décimales (ex.:
38799 )" _
& vbCrLf & "la recherche avec xlValues ne produira aucun résultat." _
& vbCrLf & "" _
& vbCrLf & "XlValues est donc à éviter pour rechercher un nombre."
MsgBox Message

NombreFormate = Format(nombre, "0.00") '"38799.00"
For i = Len(NombreFormate) To 1 Step -1
If Mid(NombreFormate, i, 1) = "," Then
Mid(NombreFormate, i, 1) = "."
Exit For
End If
Next
Trouver_Tout(NombreFormate, Range("B:B"), xlValues, xlWhole).Select
Message = "" _
& vbCrLf & "Chercher le String " & NombreFormate & " dans Text." _
& vbCrLf & "Le critère LookIn:=xlValues" _
& vbCrLf & "Le critère What:=" & NombreFormate _
& vbCrLf _
& vbCrLf & "Si la valeur réelle est " & nombre & " et la valeur affichée est
" & Format(nombre, "0.00") _
& vbCrLf & "il faut rechercher " & NombreFormate & " pour que la recherche
avec XlValues produise un résultat."
MsgBox Message


On Error Resume Next
Trouver_Tout(CStr(CDate(nombre)), Range("B:B"), xlFormulas, xlWhole).Select

Message = "Chercher la date (Type String) " & CStr(CDate(nombre)) & "" _
& vbCrLf & "Le critère LookIn:=xlFormulas" _
& vbCrLf & "Le critère What:=une date de type String" _
& vbCrLf _
& vbCrLf & "Ici la fonction Find recherche un String dans" _
& vbCrLf & "la valeur Formula des cellules." _
& vbCrLf _
& vbCrLf & "Pour chercher une date avec XlFormula dans les cellules
formatées Date, " _
& vbCrLf & "il faut que le paramètre What:= contienne une variable de type
Date."
MsgBox Message

End Sub
Sub Formulas_Sur_Texte()
Cells(1, 3).Value = "'.Formula"
For i = 2 To 21
Cells(i, 3).Value = Cells(i, 2).Formula
Next
End Sub
Sub Values_Sur_Texte()
Cells(1, 4).Value = "'.Value"
For i = 2 To 21
Cells(i, 4).Value = Cells(i, 2).Value
Next
End Sub
Sub Text_Sur_Texte()
Cells(1, 5).Value = "'.Text"
For i = 2 To 21
Cells(i, 5).Value = Cells(i, 2).Text
Next
End Sub
Function Trouver_Tout(Item_rechercher As Variant, _
Champ_de_recherche As Range, _
Optional LookIn As Variant, _
Optional LookAt As Variant, _
Optional MatchCase As Boolean) As Range

Dim cellule As Range

If IsMissing(LookAt) Then LookAt = xlPart

If IsMissing(LookIn) Then LookIn = xlValues

If IsMissing(MatchCase) Then MatchCase = False

Range("A1").Select

With Champ_de_recherche
Set cellule = .Find( _
What:=Item_rechercher, _
LookIn:=LookIn, _
LookAt:=LookAt, _
SearchOrder:=xlByRows, _
SearchDirection:=xlNext, _
MatchCase:=MatchCase)

If Not cellule Is Nothing Then

Set Trouver_Tout = cellule
PremiereAdresse = cellule.Address
Do
Set Trouver_Tout = Union(Trouver_Tout, cellule)
Set cellule = .FindNext(cellule)

Loop While Not cellule Is Nothing And cellule.Address <>
PremiereAdresse

End If
End With

End Function


Sub Mettre_les_donnees_sur_la_feuille()

Call Entrer_Ici_La_Date

strDateserial = DateSerial(Annee, Mois, Jour)

lngDateSerial = CLng(strDateserial)

Cells.Clear

Range("A1").Select
ActiveCell.Formula = "Format"
Range("C1").Select
ActiveCell.Formula = "Formulas"
Range("D1").Select
ActiveCell.Formula = "Values"
Range("E1").Select
ActiveCell.Formula = "Text"
Range("A:A,C:C,D:D,E:E").Select
Range("E1").Activate
Selection.NumberFormat = "@"

Range("A7").Select
ActiveCell.Formula = "Nombre 2 déc"
Range("A8").Select
ActiveCell.Formula = "Nombre 2 déc"
Range("A10").Select
ActiveCell.Formula = "Standard"
Range("A11").Select
ActiveCell.Formula = "Standard"

Range("B7:B8").Select
Selection.NumberFormat = "0.00"

Range("B7").Select
ActiveCell.Formula = lngDateSerial

Range("B8").Select
ActiveCell.Formula = lngDateSerial

Range("B10").Select
ActiveCell.Formula = lngDateSerial

Range("B11").Select
ActiveCell.Formula = lngDateSerial

Range("B13").Select
Selection.NumberFormat = "d-mmm-yyyy"
Range("A13").Formula = "Date d-mmm-yyyy"

Range("B13").Select
ActiveCell.Formula = strDateserial

Range("B14").Select
ActiveCell.Value = strDateserial
Range("A14").Formula = "Date par défaut"

Range("B15").Select
Selection.NumberFormat = "m/dd/yyyy"
ActiveCell.Value = lngDateSerial
Range("A15").Formula = "Date m/dd/yyyy"

Range("B16:B17").Select
Selection.NumberFormat = "@"

Range("B16").Select
ActiveCell.Formula = lngDateSerial

Range("B17").Select
ActiveCell.Formula = lngDateSerial

Range("A16").Formula = "Texte @"
Range("A17").Formula = "Texte @"

Range("B19").Select
Selection.NumberFormat = "@"
ActiveCell.Formula = CStr(Format(CDate(lngDateSerial), "m/d/yyyy")) '
Format américain sans 0

Range("A19").Formula = "Texte m/d/yyyy"

Range("B20").Select
Selection.NumberFormat = "@"
ActiveCell.Formula = Format(CDate(lngDateSerial), "mm/dd/yyyy") ' Format
américain avec 0

Range("A20").Formula = "Texte mm/dd/yyyy"

Range("B21").Select
Selection.NumberFormat = "@"
ActiveCell.Formula = Format(CDate(lngDateSerial), "Short Date") ' Format
américain avec 0
Range("A21").Formula = "Texte Short Date"

Range("B2").Select
ActiveCell.Formula = "·"

Range("B3").Select
ActiveCell.Formula = "±6"

Range("B4").Select
ActiveCell.Formula = "±3"

Range("B5").Select
ActiveCell.Formula = "±4"

Range("B6").Select
ActiveCell.Formula = "±9"
End Sub
'********************************


"ptck" wrote in message
news:%
Merci pour votre aide
ptck
"MichDenis" a écrit dans le message de news:

Bonjour Mishell,

Je ne répéterais pas ici ce que tu peux lire dans le commentaire
que j'ai commis sur le sujet là : http://excelabo.net/pasapas/find-date

avec la méthode "Find" pour rechercher une date, il n'y a pas une
façon de définir les paramètres qui fassent mouche à tout coup.

A ) L'usager doit savoir d'abord ce qu'il cherche (une date émanant
d'une formule ou d'une saisie dans une cellule ou peut-être les 2
avant de déterminer la nature des paramètres, voire si la méthode
est appropriée dans les circonstances.
B ) Que contiennent les autres cellules dans la plage scrutée par la
méthode Find ?
C ) Se rappeler que la méthode "Find" recherche toujours une chaîne
de caractères passée par l'argument "What" à la méthode.
D ) La méthode "Find" utilise la propriété "Formula" ou "Value"
que retourne un objet "Range" pour évaluer si la chaîne du
paramètre "What" est "=" à la chaîne de caractère retournée
par la propriété "Formula" ou "Value" de la cellule selon que l'on
a retenue l'une ou l'autre lorsque l'on a défini le paramètre
"LookIn".
C'est là la vraie signification des constantes "XlFormulas" ou
"xlvalues"
de l'argument "LookIn" de la méthode Find.

Ceci étant dit,

| Pour Chercher une date avec Find(),
| le critère LookIn:= doit être xlFormulas.
****Ça dépend du contenu de la plage de cellules !

| Si on Cherche une date avec xlFormulas :
| Les cellules au format Date
| et les cellules au format Texte contenant une date valide
| feront partie des résultats de la recherche.

****Sauf erreur, cet énoncé est inexact :
Si A1 contient une date reconnue dans un format date compris par
Excel
x = Range("A1").Formula -> renvoie : "39949"
Si B1 est au format texte, mais contient une date habituellement
reconnue par Excel
x = Range("B1").Formula -> renvoie : "16-05-09"

La méthode "Find" ne peut pas trouver les 2 cellules avec
XlFormulas
SAUF si on passe à l'argument "What" une variable d'un type
"String"
une fois et une variable d'un type "Date" une autre fois.
Variable type date - > elle trouve A1
Variable Type String -> elle trouve B1
En conséquence, tu dois faire un choix et l'une des
2 sera exclue selon ton choix.

| Si on Cherche une date avec xlValues :

**** Je pourrais répéter le même commentaire que précédemment
mais cette fois avec XlValues

P.S - J'arrête ici. Il y a un grand professeur qui me coure après
avec sa piqure. J'arrête avant qu'il s'énerve un peu trop !











1 2