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:

david84

XLDnaute Barbatruc
Re : Find et format de date

Re Hasco
Après avoir un peu creusé la question, ton code aménagé comme suit le fait !
Code:
Set LaCellule = Range("calend")(Day(c), Month(c) + Month(c) * 2 - 2)

Sinon, concernant la proposition du Find :
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.

alors peut-être en utilisant select case :
Code:
Sub TestFind3()
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
        With [calend]
            Select Case TypeForm
            Case Is = 0
                    Set c = .Find(Pl(i, 1), LookIn:=xlValues, lookat:=xlWhole)
            Case Else
                    Set c = .Find(Pl(i, 1).Text, LookIn:=xlValues, lookat:=xlWhole)
            End Select
                    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
Fonctionne avec le format Date courte classique et les formats Dates exceptés les 2 1er formats précédés d'une astérisque (répondant aux changements dans les paramètres régionaux).
Pour les autres formats il y a peut-être moyen de trouver le biais mais pour l'instant je n'ai pas trouvé.
A+
 

Fo_rum

XLDnaute Accro
Re : Find et format de date

Bonjour,

et en changeant le sens de la recherche ?
Code:
Sub JoursFerie()
  Dim cel As Range, c As Range, Ad As String
  For Each cel In Range("B2:M32")
    Set c = Range("Q2:Q14").Find(cel)
    If Not c Is Nothing Then Ad = Ad & Chr(10) & cel.Address
  Next
  MsgBox Ad
End Sub
 

tototiti2008

XLDnaute Barbatruc
Re : Find et format de date

Bonjour à tous,

Sinon, une autre proposition spécifique à ces formats

Code:
        DatEng = Array("lun$mon", "mar$tue", "mer$wed", "jeu$thu", "ven$fri", "sam$sat", "dim$sun")
        MaDate = Replace(Format(a(i, 1), "ddd dd"), ".", "")
        For j = LBound(DatEng) To UBound(DatEng)
            MaDate = Replace(MaDate, Left(DatEng(j), 3), Right(DatEng(j), 3))
        Next j
        Set c = .Find(MaDate, LookIn:=xlValues, lookat:=xlWhole)
 

tototiti2008

XLDnaute Barbatruc
Re : Find et format de date

Re,

visiblement ma proposition n'était pas claire

une version plus complète :

Code:
Sub JoursFerie()
Dim a, i As Byte, c, Prem, DatEng, j As Long, MaDate As String
With Sheets("Feuil1")
        a = .Range("Q2:Q14")
End With
For i = LBound(a) To UBound(a)
With [calend]
'MsgBox [calend].Cells(1, 1)
'MsgBox CDate(a(i, 1))
'MsgBox Replace(Format(CDate(a(i, 1)), "ddd dd"), ". ", " ")

'mes différents essais
        'Set c = .Find(a(i, 1), LookIn:=xlFormulas, lookat:=xlWhole)
        'Set c = .Find(CDate(a(i, 1)), LookIn:=xlFormulas, lookat:=xlWhole)
        'Set c = .Find(Format(CDate(a(i, 1)), "ddd dd"), LookIn:=xlFormulas, lookat:=xlWhole)
        'Set c = .Find(Replace(Format(CDate(a(i, 1)), "ddd dd"), ". ", " "), LookIn:=xlFormulas, lookat:=xlWhole)
        'Set c = .Find(Format(CDate(a(i, 1)), "ddd dd"), LookIn:=xlFormulas, lookat:=xlWhole)
        'Set c = .Find(a(i, 1), LookIn:=xlValues, lookat:=xlWhole)
        'Set c = .Find(CDate(a(i, 1)), LookIn:=xlValues, lookat:=xlWhole)
        'Set c = .Find(Format(CDate(a(i, 1)), "ddd dd"), LookIn:=xlValues, lookat:=xlWhole)
        'Set c = .Find(Replace(Format(CDate(a(i, 1)), "ddd dd"), ". ", " "), LookIn:=xlValues, lookat:=xlWhole)
        'Set c = .Find(Format(CDate(a(i, 1)), "ddd dd"), LookIn:=xlValues, lookat:=xlWhole)
        DatEng = Array("lun$mon", "mar$tue", "mer$wed", "jeu$thu", "ven$fri", "sam$sat", "dim$sun")
        MaDate = Replace(Format(a(i, 1), "ddd dd"), ".", "")
        For j = LBound(DatEng) To UBound(DatEng)
            MaDate = Replace(MaDate, Left(DatEng(j), 3), Right(DatEng(j), 3))
        Next j
        Set c = .Find(MaDate, LookIn:=xlValues, lookat:=xlWhole)
        
        If Not c Is Nothing Then
        '--suite de mon code
            c.Interior.ColorIndex = 3
        End If
End With
Next i
End Sub

Edit : sur la base du fichier du message #3
 
Dernière édition:

david84

XLDnaute Barbatruc
Re : Find et format de date

Re
@Fo_rum : ton code fonctionne sans problème et semble montrer le fait que le format de cellule prépondérant est celui de la plage dans laquelle sont placées les données à rechercher.
Donc merci

@Tototiti: suite à mes tests effectués sur le fichier du message 3, je m'aperçois que l'ensemble des dates n'est pas traité par ton code.
Est-ce que cela se produit de ton côté ?
A+
 

tototiti2008

XLDnaute Barbatruc
Re : Find et format de date

Re,

@Tototiti: suite à mes tests effectués sur le fichier du message 3, je m'aperçois que l'ensemble des dates n'est pas traité par ton code.
Est-ce que cela se produit de ton côté ?

Oui, en effet, c'est parce qu'il y a plusieurs "dim 25" et "ven 11" dans l'année donc il traite plusieurs fois le même...
Bref, ça ne marche pas dans ce cas, tant pis ça aura juste été l'occasion de montrer que VBA attend une date formatée en anglais avec Find
 

MJ13

XLDnaute Barbatruc
Re : Find et format de date

Re à tous

Ma réflexion d'il y a 2 jours où j'avais un planning à faire: "Pour éviter ces désagréments, il vaut quand même mieux avoir les dates en dur et pas en formule. Sur un planning, par exemple, recopiez vos formules dates en valeur".

Ensuite, ça roule :).

Et bien, c'est mon record de like ;). Mais il faut que je décortique tout ça :eek:.
 
Dernière édition:

MJ13

XLDnaute Barbatruc
Re : Find et format de date

Re à tous

Bon, j'ai trouvé cette solution assez rapide sur une petite plage :). Merci à Ges pour le value2 dont je me demandais toujours sa signification :eek:.

Code:
Sub Trouve_value2_Inputbox()
'MJ
DateAt1 = InputBox("Date à trouver (JJ/MM)?")
t1 = Timer
Dim DateAT As Long
DateAT = Format(DateAt1, "0")
For Each cell In Range("Calend")
'MsgBox cell.Value
ValAct = cell.Value2
If ValAct = DateAT Then adr = cell.Address: Range(cell.Address).Select
Next
MsgBox Timer - t1
End Sub
 

david84

XLDnaute Barbatruc
Re : Find et format de date

Bonjour,
toujours dans le cadre de l'utilisation de Find, la méthode de Fo_rum fonctionne très bien à partir du moment où la plage de recherche est au format date courte ("m/d/yyyy"), ce qui la plupart du temps le cas donc la solution est fonctionnelle. Par contre si aucune des plages n'est à ce format, le code tel qu'il est actuellement ne fonctionne plus.

Le code suivant permet normalement de ramener les jours fériés quels que soient les formats (date ou personnalisé) des plages "calend" et "feries" (récupération des formats de nombre des plages de traitement et de recherche, application à ces 2 plages du format date courte "m/d/yyyy", traitement des données et restitution des formats d'origine des plages de traitement et de recherche) :
Code:
Sub FindDavid()
Dim Pl As Range, i As Byte, c, Prem, MonFormat, NouvFormat, TypeForm, Ad, cel, MonFormat2
Set Pl = [feries]
MonFormat = [feries].NumberFormat 'récupérer le format de nombre de la plage de traitement
MonFormat2 = [calend].NumberFormat 'récupérer le format de nombre de la plage de recherche
[feries].NumberFormat = "m/d/yyyy"
[calend].NumberFormat = "m/d/yyyy"
For Each cel In [feries]
    With [calend]
            Set c = .Find(cel, LookIn:=xlValues, lookat:=xlWhole)
            If Not c Is Nothing Then Prem = c.Address: Ad = Ad & vbCr & c.Address ': Debug.Print c.Address
    End With
Next cel
[feries].NumberFormat = MonFormat 'rétablissement du format de nombre initial de la plage de traitement
[calend].NumberFormat = MonFormat2 'rétablissement du format de nombre initial de la plage de recherche
MsgBox Ad
End Sub

Je vous ai placé un fichier test (la colonne P regroupe des formats différents à appliquer : appliquer le même format ou des formats différents aux plages) dans lequel j'ai également placé les propositions de Hasco, Jacques et Job (qui nous montrent avec raison comment se passer de Find :rolleyes:, mais comme le thème de la discussion est Find et les dates, je continue avec vous sur le sujet).
A+
Edit : désolé Michel, je n'avais pas vu ton message:confused:. Je regarde.
 

Pièces jointes

  • Find_Format_Date_v2.xls
    100 KB · Affichages: 50
Dernière édition:

MJ13

XLDnaute Barbatruc
Re : Find et format de date

Re David

Code:
quel est l'intérêt d'utiliser cell.value2 dans ton code ? D'après mes tests, les mêmes résultats sont obtenus avec cell.value, et même simplement cell.

Je ne sais pas mais cela fonctionne :).

Après mon but, est de savor que ça existe. Et si un jour j'ai un problème de ce genre (comme cela arrive souvent sur les dates entre version, langues avec inversion des dates), je testerai cette solution :). Si ils l'ont crée, c'est que cela doit servir à quelque chose ;).

Sinon code revu:

Code:
Sub Trouve_value2_Inputbox()
'MJ
DateAt1 = InputBox("Date à trouver (JJ/MM)?")
t1 = Timer
Dim DateAT As Date
DateAT = Format(DateAt1, "0")
For Each cell In Range("Calend")
'MsgBox cell.Value
ValAct = cell.Value2
If ValAct = DateAT Then adr = cell.Address: Range(cell.Address).Select: MsgBox Timer - t1: End
Next
MsgBox Timer - t1
MsgBox ("Non trouvé ou date incorrecte!")
End Sub
 

Fo_rum

XLDnaute Accro
Re : Find et format de date

Bonjour,

tiré de l'aide (2010) consacrée à Find :
'Pour effectuer des recherches plus complexes, utilisez une instruction For Each...Next avec l'opérateur Like.
d'où
Code:
Sub LikeFo_rum()
  Dim cel As Range, c As Range, Ad As String
  For Each c In [feries]
    For Each cel In [calend]
      If c Like cel Then Ad = Ad & Chr(10) & cel.Address
    Next
  Next
  MsgBox Ad
End Sub

remarque : peut prendre plus de temps !
 
Dernière édition:

Discussions similaires

Réponses
2
Affichages
253
Réponses
2
Affichages
312

Statistiques des forums

Discussions
312 234
Messages
2 086 467
Membres
103 226
dernier inscrit
smail12