Find et format de date

david84

XLDnaute Barbatruc
Bonjour,
je me demande si l'utilisation de Find pour rechercher une date ne pose pas de problème si le format de date est un format personnalisé (et non l'un des formats dates proposés dans "format de cellule").

Code:
Sub RechercheDateFind2()
  d = InputBox("Date? jj/mm/aa")
  If d <> "" Then
  MsgBox Format(CDate(Cells(2, 14)), "ddd dd") 'pour vérifier le format d'une valeur de la colonne
  MsgBox Format(CDate(d), "ddd dd") 'pour vérifier l'application du format de la valeur rentrée
    On Error Resume Next
    [N:N].Find(What:=Format(CDate(d), "ddd dd"), LookIn:=xlValues).Select
    
    If Err <> 0 Then MsgBox "Inconnu"
  End If
End Sub

En effet, je bute sur le fait que le code ci-dessus ne trouve pas la date recherchée dans un tableau. Je pourrais faire autrement et passer par exemple par Equiv mais ma recherche devant être faite sur une plage multi-colonne, cela me forcerait à utiliser une boucle (bon, si je peux m'en passer...).
Ci-joint un fichier de JB qui traite du sujet. L'exemple initial trouvé ici fonctionne correctement mais le format utilisé est un format de cellule Date et non un format personnalisé en l'occurrence "jjj jj".
Mes questions sont :
- peut-on arriver au même résultat avec un format personnalisé comme présenté dans le fichier joint ?
- Si oui, où est mon erreur ?
- Si cela n'est pas possible, comment vous-y-prendriez-vous ?
Merci
A+
 

Pièces jointes

  • FindDates.xls
    46 KB · Affichages: 59
Dernière édition:
G

Guest

Guest
Re : Find et format de date

bonjour David:):):)

Normalement en cherchant dans xlFormulas cela devrait le faire( testé sur ton fichier).
XlValues recherche dans les dates formatées et xlFormulas dans les valeurs sous-jacentes(ou les formules).

Code:
[N:N].Find(What:=CDate(d), LookIn:=xlFormulas).Select

A+
 
Dernière modification par un modérateur:

david84

XLDnaute Barbatruc
Re : Find et format de date

Bonjour Hasco:):):) et merci de t'intéresser à ma question.
J'ai testé en utilisant xlFormulas mais sans parvenir à mes fins alors qu'effectivement les dates formatées sont obtenues à partir de formules.
Je m'aperçois que mon 1er fichier manquait peut-être de précision.
J'ai donc joint un autre fichier avec le code et les différents tests effectués.
Le but est de localiser les jours fériés dans le calendrier.
Les jours fériés sont en format date et incrémentés en dur et celles du calendrier sont en format personnalisé "jjj jj" et obtenues par formules.
Merci à toi et aux autres qui passeront par ici:).
A+
 

Pièces jointes

  • Find_Format_Date.xls
    90 KB · Affichages: 109
Dernière édition:

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Re : Find et format de date

Bonsoir,

-La commande Edition/Rechercher mar 04 (valeurs en option) fonctionne bien mais la macro obtenue par l'enregistreur auto ne reproduit pas la commande!

-2 solutions simplistes: MFC ou VBA

JB
 

Pièces jointes

  • Copie de Find_Format_Date.xls
    143.5 KB · Affichages: 63

job75

XLDnaute Barbatruc
Re : Find et format de date

Bonjour David, Hasco :)

La méthode Find pose en effet des problème avec les dates.

En outre elle est moins rapide que Match (EQUIV) ou même qu'une recherche par boucle comme ici :

Code:
Function JOURFERIE(dat As Long, ferie As Variant) As Boolean
Dim f
ferie = ferie 'matrice, plus rapide
For Each f In ferie
If f = dat Then JOURFERIE = True: Exit Function
Next
End Function

Cette fonction est utilisée par la MFC mise en place sur le calendrier.

Fichier joint.

Edit : salut JB pas rafraîchi

A+
 

Pièces jointes

  • Find_Format_Date(1).xls
    105 KB · Affichages: 52
Dernière édition:

david84

XLDnaute Barbatruc
Re : Find et format de date

Re
merci à tous pour vos réponses.
Donc visiblement, pas possible de passer avec Find.
Le but final n'étant pas simplement de localiser les jours fériés, la MFC ne m'est pas utile.
Cependant, vous m'avez donné des solutions.
La plus adaptée à mon cas et la plus simple est d'utiliser Countif comme préconisé par JB.
Encore merci pour l'aide apportée.
A+
 

flyonets44

XLDnaute Occasionnel
Re : Find et format de date

Bonjour
quelques news glanées sur un forum il y a quelques années
'1-) Si une plage de cellules où s'effectue la recherche n'a pas le format système

'Dim UneVraieDate As Variant
'À l'instar du type "Date", l'utilisation du type "Variant" permet d'affecter
'à cette variable le même format de date de la plage de cellules où la
'recherche a lieu. (à adapter dans la ligne de code suivante le format approprié)
'UneVraieDate = Format(DateSerial(2002, 11, 15), "dd/mm/yyyy")

'2-) Si une plage de cellules où s'effectue la recherche a le format système

'Dim UneVraieDate As Date
'Comme énoncé précédemment, la ligne de code suivante est sans effet
'lorsque la variable a le type "Date"... donc inutile.
'UneVraieDate = Format(DateSerial(2002, 11, 15), "dd/mm/yyyy")


'Résultat obtenu:
'Pour que la méthode Find fonctionne avec ce paramètre "LookIn:=xlValues",
'la plage de cellules où s'effectue la recherche doit obligatoirement être
'du même format que la variable utiliée pour la recherche. Que la date
'affichée dans la cellule soit une constante (08/11/02) ou l'expression
'd'une formule comme "aujourdhui()" n'a aucune importance. La propriété
'"Value" d'une cellule renvoie toujours la valeur affichée et non la
'formule qui se cache dernière.
Cordialement
Flyonets
 

david84

XLDnaute Barbatruc
Re : Find et format de date

Bonjour flyonets44,
si j'applique tes indications à l'exemple de mon fichier du message 3, cela pourrait donner par exemple :
Code:
Sub TestFind()
Dim c, Prem, MaDate As Variant, Val
Val = Sheets("Feuil1").Range("Q3")
MaDate = Format(DateSerial(Year(Val), Month(Val), Day(Val)), "ddd dd")
With [calend]
        Set c = .Find(MaDate, LookIn:=xlValues, lookat:=xlWhole)
        If Not c Is Nothing Then Prem = c.Address
        '--suite de mon code
End With
End Sub
Or, Find ne ramène rien.
Qu'en penses-tu ?
A+
 

david84

XLDnaute Barbatruc
Re : Find et format de date

Re, bonjourJM,
indépendamment de ma question qui est réglée, pour continuer le débat intéressant concernant Find,
une solution faute de mieux pour l'instant qui semble fonctionner (à tester sur mon fichier du message 3) : récupérer le format de nombre initial de la plage calendrier, modifier cette plage avec le nouveau format et remettre le format initial une fois les données traitées :
Code:
Sub TestFind()
Dim a, i As Byte, c, Prem, MonFormat
a = Sheets("Feuil1").Range("Q2:Q14")
MonFormat = [calend].NumberFormat
With [calend]
   .NumberFormat = "m/d/yyyy"
End With

For i = LBound(a) To UBound(a)
    With [calend]
            Set c = .Find(a(i, 1), LookIn:=xlValues, lookat:=xlWhole)
            If Not c Is Nothing Then Prem = c.Address
            '--suite de mon code
    End With
Next i

With [calend]
    .NumberFormat = MonFormat
End With
End Sub
A+
 
Dernière édition:

job75

XLDnaute Barbatruc
Re : Find et format de date

Bonjour David, le fil,

A condition d'aimer les boucles - mais elles sont rapides :

Code:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Intersect(Target, [Fériés]) Is Nothing Then Exit Sub
Dim cal, ub%, i&, j%
Cancel = True
cal = [calend] 'matrice, plus rapide
ub = UBound(cal, 2)
For i = 1 To UBound(cal)
  For j = 1 To ub
    If cal(i, j) = Target Then MsgBox Format(cal(i, j), "ddd dd") & _
      " cellule " & [calend].Cells(i, j).Address: Exit Sub
  Next
Next
End Sub
Fichier (2).

A+
 

Pièces jointes

  • Find_Format_Date(2).xls
    88 KB · Affichages: 107
Dernière édition:

david84

XLDnaute Barbatruc
Re : Find et format de date

Re Job,
j'ai testé et effectivement c'est rapide et efficace (et adaptable à ce que je veux faire au final), bref du "Made in Job":) (j'ai failli tenter "Good Job" mais je me suis dit qu'on te l'avait déjà faite :p).
A+
 
G

Guest

Guest
Re : Find et format de date

Bonjour à tous,

Je reviens avec du retard. Effectivement si les dates sont produites par des formules....

@David, puisque tu connais ton Tableau calendrier ("calend", 12 col et 31 lignes) la cellule de la date cherchée sera:

Set LaCellule=Range("calend")(Day(laDate), Month(laDate))

Il ne te restera plus qu'à vérifier que LaCellule contient bien la date voulue (ex: utilisateur qui rentrerait "31/02/2011" -> 31ème lignes et 2ème colonne=vide

Au fait, tu peux comparer une valeur de date d'une cellule avec sa propriété .Value2 qui contient toujours un Double pour les dates (40865 pour ce jour).

A+ à tous
 
Dernière modification par un modérateur:

david84

XLDnaute Barbatruc
Re : Find et format de date

Re
@Hasco : franchement, même si je ne pense pas que ton idée soit adaptable à mon cas précis (le calendrier comporte en son sein d'autres colonnes avec d'autres infos que des dates (regarde ici tu comprendras mieux), par rapport à l'exemple fourni dans ce fil, je trouve ton approche d'une simplicité Géniale ! Sache que cela me servira dans d'autres circonstances.
Merci

Concernant Find, ci-joint une proposition couvrant la quasi_intégralité des formats de nombre Date (je ne parle pas des formats de nombre personnalisés), exceptés les 2 1er formats précédés d'une astérisque (répondant aux changements dans les paramètres régionaux) :
Code:
Sub TestFind2()
Dim Pl As Range, i As Byte, c, Prem, MonFormat, NouvFormat, TypeForm
Set Pl = Sheets("Feuil1").Range("Q2:Q14")
MonFormat = [calend].NumberFormat 'récupérer le format de nombre de la plage de traitement
NouvFormat = Pl.NumberFormat 'récupérer le format de nombre de la plage de comparaison

With [calend]
   .NumberFormat = NouvFormat
End With
TypeForm = InStr(1, NouvFormat, "@")
For i = 1 To Pl.Rows.Count
'MsgBox Pl(i, 1).Text
'MsgBox Pl(i, 1).Value
    With [calend]
            'Set c = .Find(Pl(i, 1).Text, LookIn:=xlValues, lookat:=xlWhole)
            Set c = IIf(TypeForm = 0, .Find(Pl(i, 1), LookIn:=xlValues, lookat:=xlWhole), .Find(Pl(i, 1).Text, LookIn:=xlValues, lookat:=xlWhole))
            If Not c Is Nothing Then Prem = c.Address
            '--suite de mon code
    End With
Next i

With [calend]
    .NumberFormat = MonFormat 'rétablissement du format de nombre initial
End With
End Sub
A+
 
G

Guest

Guest
Re : Find et format de date

Re,

Very good:)

Seule chose qui peut créer des lenteurs: le IIF.
En effet à chaque IIF les deux expressions sont évaluées (c'est bête mais il a été fabriqué comme ça)
donc Find est lancé 2 fois.

A+++
 

Discussions similaires