Rechercher une date précise dans une liste

david84

XLDnaute Barbatruc
Re : Rechercher une date précise dans une liste

Bonjour,
Le même test sur une formule
Code:
=RechercheFeuil!A2
à la place d'une date (cf.fichier) :
Find semble fonctionner sur tous les formats, que ce soit avec
Code:
LookIn:=xlFormulas, LookAt:=xlWhole
ou
Code:
]LookIn:=xlFormulas, LookAt:=xlPart
(idem pour Match bien sûr).
Reste à tester d'autres formules au cas où...
A+
 

Fichiers joints

Bebere

XLDnaute Barbatruc
Re : Rechercher une date précise dans une liste

bonjour
il en faut pour toutes et tous.Distributions d'étoiles pour tout le monde
 

Staple1600

XLDnaute Barbatruc
Re : Rechercher une date précise dans une liste

Bonjour à tous


Une question me taraude depuis le début de ce fil.
Pour en avoir le coeur net, je viens d'ouvrir la PJ de Cathy de son message #15
(By the way pourquoi n'était-il pas dans le #1...)
C@thy
Pourquoi passer par VBA, quand le filtre automatique ou élaboré saura trouver la date désirée ?
 

MJ13

XLDnaute Barbatruc
Re : Rechercher une date précise dans une liste

Bonjour Jean-Marie


Pourquoi passer par VBA, quand le filtre automatique ou élaboré saura trouver la date désirée ?
Le problème ce n'est pas Cathy :eek:, c'est de trouver des dates dans une feuille ou autre mais plutôt par VBA :).

On dira que c'est pour la recherche fondamentale ;).

PS: Merci David. Je regarderai ton dernier fichier plus tard. :).
 

Staple1600

XLDnaute Barbatruc
Re : Rechercher une date précise dans une liste

Re, Bonjour MJ13


Je posais la question à C@thy, simplement pour comprendre pourquoi elle semblait réticente à utiliser des fonctions natives d'Excel dans le cas présent.
Excel ce n'est pas que le VBA, non ?

Mais effectivement, le fil est riche de solutions diverses et variées et peuplés d’aficionados talentueux de la Sub.

L'emploi des filtres en est une de plus. ;)

PS: MJ13: Où as-tu lu dans mon message que j'assimilais C@thy à un problème ??????
 
Dernière édition:

MJ13

XLDnaute Barbatruc
Re : Rechercher une date précise dans une liste

Re Jean-Marie

MJ13: Où as-tu lu dans mon message que j'assimilais C@thy à un problème ??????
J'ai dit ça comme ça :eek:. Je trouvais que la phrase faisait joli :eek:. Cathy, c'est pas un problème pour nous, au contraire, elle nous aide à faire phosphorer nos neurones :eek:.

Par contre, tu as bien compris que le fil était riche en codes divers et variés, c'est ça le plus important :).

Mais pour les filtres, tu peux proposer quelque chose. je pensais même que c'était la suite logique.
 

david84

XLDnaute Barbatruc
Re : Rechercher une date précise dans une liste

Bonjour,
Avec match sur le fichier ci joint.
en ligne 3 ça marche, pas en ligne 2
attention : je triche !!! (en ligne 3)
Mais le cas s'est posé pour un fichier déjà.
D'accord avec toi sur le principe : pour utiliser Match sur des heures, utiliser Round (je note au passage que Match en VBA n'a pas toujours le même comportement que EQUIV).
Concernant ton explication
' démonstation que match recherche sur une valeur exacte ( index 0 dans ce cas c'est nécessaire car sur d'autres valeurs la colonne reznvoyée ne sera pas bonnes)
' donc on arrondi la valeur à 5 décimales dans la fonction et idem dans la ligne 3)
pourquoi dis-tu
et idem dans la ligne 3
Tes heures ne sont pourtant pas arrondies...
Concernant Find, prendre le soin de placer
Code:
lookat:=xlWhole
sinon cela peut jouer des tours.
Un détail : la MsgBox est appelée 3 fois donc
Code:
Sub AvecFind()
    ' démontration Find = contient valeur affichée et ne recherche pas sur la valeur réelle
    Nat = InputBox("heure?")
    With Worksheets("Essai 1").Range("B2:aW3")
    Set C = .Find(Nat, LookIn:=xlValues, lookat:=xlWhole)
    If Not C Is Nothing Then
        firstAddress = C.Address
        'MsgBox C.Address
        Do
            MsgBox C.Address
            Set C = .FindNext(C)
        Loop While Not C Is Nothing And C.Address <> firstAddress
    End If
End With
End Sub
A+
 

david84

XLDnaute Barbatruc
Re : Rechercher une date précise dans une liste

Re
les valeurs des heures dans la ligne 3 sont arrondies a 5 décimales( c'est pour cela que ca marche)
pour t'en convaincre tu mets les lignes 2 et 3 au format standard.
Oui effectivement.
Explication SVP pour , lookat:=xlWhole
Au 1er test : Nat=5:00=>résultats ramenés 5:00 et 15:00
Cela est dû au fait que lors d'une précédente recherche, lookat éatait sur xlPart.
C'est la raison pour laquelle il te faut préciser à Lookin et Lookat lorsque tu utilises Range.Find.

Sinon, plutôt que d'être obligé d'arrondir préalablement tes données dans la feuille, tu peux peut-être :
- déclarer ta plage A2:IV2 en tant qu'objet
- te servir du format de nombre utilisé dans la plage pour modifier ta plage dans un array
- et là tu dois pouvoir utiliser Match pour trouver Myvar puisque tu travailleras sur un array contenant les valeurs formatées de A2:IV2.
Pas le temps tout de suite mais si cela t'intéresse je peux regarder de mon côté.
A+
 

david84

XLDnaute Barbatruc
Re : Rechercher une date précise dans une liste

Bonjour,
Le but de mon intervention était de démontrer les limites de find et de match.
Ton intervention permet en effet de démontrer que sur les heures, l'utilisation de Find est plus adaptée.

Sinon, concernant Match sur les heures, j'avais crû comprendre que tu l'avais utilisé dans un cas précédent et que la solution que tu avais trouvée était préalablement d'arrondir les valeurs de la plage de recherche pour pouvoir t'en sortir, d'où ma remarque, donc à tester de ton côté :
Code:
Sub test()
Dim Pl As Range, T(), i As Long, Nat As String, MyVar As Long
Nat = InputBox("heure?")
Set Pl = Worksheets("Essai 1").Range("A2:IV2")
ReDim T(1 To Pl.Cells.Count)
For i = LBound(T) To UBound(T)
    T(i) = Format(Pl(1, i), Pl.NumberFormat)
Next i
MyVar = Application.Match(Nat, T, 0)
MsgBox Nat & " se trouve en colonne " & MyVar & " et en ligne 2 "
End Sub
A+
 

MJ13

XLDnaute Barbatruc
Re : Rechercher une date précise dans une liste

Bonjour à tous

Ah, cela fait plaisir de voir toute cette émulation autour d'un thème Excellent :eek:.

Voici mon dernier fichier pour trouver une date ou une heure sur une feuille.

Merci à tous pour votre participation :).
 

Fichiers joints

david84

XLDnaute Barbatruc
Re : Rechercher une date précise dans une liste

Bonjour,
@JeanMarcel
Bien vu David c'est OK.
Tant mieux, mais je remarque tout de même que sur les heures Find est plus adapté.

@Michel : en passant par
Code:
LookIn:=xlFormulas, LookAt:=xlPart
cela semble effectivement donner de bons résultats sur les heures (sur les dates on le savait déjà mais pas sur les heures).
Pour ton info, la macro plante chez moi sur le format général (plage C5:C10), que j'entre 4/1 ou 04/01/2012.
A+
 
Dernière édition:

MJ13

XLDnaute Barbatruc
Re : Rechercher une date précise dans une liste

Bonjour David, Jean-Marcel

Merci à vous deux pour les tests :).

David:
Pour ton info, la macro plante chez moi sur le format général (plage C5:C10), que j'entre 4/1 ou 04/01/2012.
C'est justement l'intérêt de déclarer la date recherchée en date. Ainsi, on est sur de chercher que dans les dates. Imaginons qu'on ait sur une feuille un nombre qui contiendrait la date au format numérique, il ne prendra que les cellules formatées en date.
 

C@thy

XLDnaute Barbatruc
Re : Rechercher une date précise dans une liste

Bonjour à tous les amis de ce fil, que je relis avec un très grand plaisir.

Je me souviens de cette discussion très animée et très riche, et je salue vos performances respectives pour trouver les solutions qui vont bien à un problème fort complexe :
en conclusion
gestion des dates et heures en excel et VBA : pas facile :D
Je plussoie...

Bises

C@thy
 

job75

XLDnaute Barbatruc
Re : Rechercher une date précise dans une liste

Bonjour C@thy, le fil,

En convertissant la valeur recherchée en texte, cette macro permet de trouver toute valeur texte, nombre, date, heure :

Code:
Sub Rechercher()
Dim x$, i As Variant
x = InputBox("Entrez la valeur texte, nombre, date, heure :", "Rechercher")
If x = "" Then Exit Sub
Range("B8", Range("B" & Rows.Count).End(xlUp)).Name = "T" 'nom défini
If IsNumeric(x) Then x = Replace(CDbl(x), ",", ".") Else _
  If IsDate(x) Then x = Replace(CDbl(CDate(x)), ",", ".")
i = Evaluate("MATCH(""" & x & """,""""&T,0)")
If IsNumeric(i) Then [T].Cells(i).Select 'valeur trouvée
End Sub
Pas très facile à bien comprendre, ni à expliquer...

Fichier joint.

A+
 

Fichiers joints

job75

XLDnaute Barbatruc
Re : Rechercher une date précise dans une liste

Re,

Ah bien vu Jean-Marcel :)

Avec 0:30 (ou 1:00) CDbl utilise le format scientifique => 2,08333333333333E-02

Il faut donc utiliser CDec pour avoir toujours des nombres décimaux :

Code:
Sub Rechercher()
Dim x$, i As Variant
x = InputBox("Entrez la valeur texte, nombre, date, heure :", "Rechercher")
If x = "" Then Exit Sub
Range("B8", Range("B" & Rows.Count).End(xlUp)).Name = "T" 'nom défini
If IsNumeric(x) Then x = Replace(CDec(x), ",", ".") Else _
  If IsDate(x) Then x = Replace(CDec(CDate(x)), ",", ".")
i = Evaluate("MATCH(""" & x & """,""""&T,0)")
If IsNumeric(i) Then [T].Cells(i).Select 'valeur trouvée
End Sub
Fichier (2).

A+
 

Fichiers joints

job75

XLDnaute Barbatruc
Re : Rechercher une date précise dans une liste

Re,

Intéressant de noter que la macro précédente ne trouve pas une heure inférieure à 00:00:09.

En effet Excel traite alors la cellule avec la notation scientifique : 00:00:08 => 9,25926E-05.

Pas très grave, on n'a pas souvent à rechercher une heure inférieure à 9 secondes...

A+
 

job75

XLDnaute Barbatruc
Re : Rechercher une date précise dans une liste

Re,

Pour mieux comprendre ce que je viens de dire, voyez le fichier joint avec cette macro :

Code:
Sub Test()
MsgBox "A1 => " & Evaluate("""""&A1")
MsgBox "A2 => " & Evaluate("""""&A2")
End Sub
A+
 

Fichiers joints

Dernière édition:

job75

XLDnaute Barbatruc
Re : Rechercher une date précise dans une liste

Re,

Une solution très bourrin.

La valeur cherchée doit correspondre exactement à la valeur affichée :

Code:
Sub Rechercher()
Dim x$, c As Range
x = InputBox("Entrez la valeur texte, nombre, date, heure :", "Rechercher")
If x = "" Then Exit Sub
For Each c In Range("B8", Range("B" & Rows.Count).End(xlUp))
  If c.Text = x Then Exit For
Next
If Not c Is Nothing Then c.Select 'cellule trouvée
End Sub
Fichier (3).

Bonne nuit.
 

Fichiers joints


Haut Bas