IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

RANGE.FIND ne fonctionne pas pour une DATE [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 1 031
    Billets dans le blog
    45
    Par défaut RANGE.FIND ne fonctionne pas pour une DATE
    Bonjour à tous,

    Je sais que ce problème est récurrent mais malgré la lecture de nombreux posts, je n’arrive pas à résoudre la recherche avec FIND sur une date.

    J'ai les lignes suivantes

    Nom : Crit1.PNG
Affichages : 1354
Taille : 10,8 Ko

    Le format des dates est le suivant

    Nom : Crit2.PNG
Affichages : 1329
Taille : 69,3 Ko

    Enfin le code suivant dans un un module:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dim dDate as date
    dDate = Format(Now(), "mm/dd/yyyy")
    Set oRgFind = oShtGraphe.Range(3).EntireRow.Find(What:=dDate, LookIn:=xlFormulas, SearchOrder:=xlByRows)
    Cela génère l'erreur suivante

    Nom : Crit3.PNG
Affichages : 1919
Taille : 17,9 Ko

    Même chose si utilise
    Merci par avance pour toute aide !

  2. #2
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Bonjour,

    Comme ça :
    Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Option Explicit
    Sub Test()
    Dim oShtGraphe As Worksheet
    Dim oRgFind As Range
    Dim dDate As Date
      dDate = Date
      Set oShtGraphe = Worksheets(1)
      Set oRgFind = oShtGraphe.Rows(3).Find(What:=dDate, LookIn:=xlValues)
    End Sub

    Notes que Format() renvoi un String, même si le transtypage fonctionne il est déconseillé, il est plus simple d'écrire =Date.

  3. #3
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par informer Voir le message
    Enfin le code suivant dans un un module:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dim dDate as date
    dDate = Format(Now(), "mm/dd/yyyy")
    Set oRgFind = oShtGraphe.Range(3).EntireRow.Find(What:=dDate, LookIn:=xlFormulas, SearchOrder:=xlByRows)
    Cela génère l'erreur suivante
    Nom : Crit3.PNG
Affichages : 1919
Taille : 17,9 Ko
    Quelle ligne de code est désignée par le débugage lorsque l'erreur se produit ?

    Parce que si c'est la ligne du Find, une recherche infructueuse ne génère pas d'erreur. Elle se contente de placer Nothing dans la variable.
    Donc l'erreur serait générée par une autre ligne utilisant cette variable.

    Un conseil : lorsqu'on utilise un Find, il faut toujours qu'il soit suivi d'un test pour vérifier que le résultat n'est pas Nothing.
    Quelque chose ressemblant à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    If oRgFind Is Noting Then
        MsgBox("Date " & dDate & "non trouvée")
        Exit Sub
    End If

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 1 031
    Billets dans le blog
    45
    Par défaut
    Bonjour à tous les deux,

    J'ai implémenté la solution sans transtypage (merci Patrice740) et l'erreur vient de ligne ci-desous Menhir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set oRgFind = oShtGraphe.Range(3).EntireRow.Find(What:=dDate, LookIn:=xlValues, SearchOrder:=xlByRows)
    Avec les données vérifiées ci-dessous

    Nom : crit5.PNG
Affichages : 1274
Taille : 31,8 Ko

    Merci pour votre aide

  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 1 031
    Billets dans le blog
    45
    Par défaut
    A l'origine j'utilisais un variant

    Nom : crit6.PNG
Affichages : 1269
Taille : 29,1 Ko

    Qui prend le format date comme on le voit sur la copie d'écran mais erreur identique

  6. #6
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Re,

    L'erreur vient de l'utilisation de Range(3) au lieu de Rows(3)

  7. #7
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Autre détail : EntireRow juste après un Rows(3), c'est inutile, une sorte de pléonasme informatique.

    Comme je l'ai dit, si c'est le Find qui est coupable, le problème n'apparaitra pas sur cette ligne mais sur les suivantes.
    Un Find qui ne trouve rien renvoie Nothing sans générer d'erreur.
    C'est un coupable discret qui brouille les pistes...

  8. #8
    Membre expérimenté
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Septembre 2019
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Septembre 2019
    Messages : 151
    Par défaut
    Bonjour,

    il y a une différence quand on utilise
    Maintenant et Aujourdhui

    maintenant indique le jour, l'heure, les minutes, les secondes,...
    aujourd'hui indique juste le jour,

    quand on utilise Now en VBA l'équivalent de maintenant, on ne peux pas trouver une valeur identique dans un classeur,
    en VBA, il vaut mieux utiliser Date

    Nom : maintenant.jpg
Affichages : 1872
Taille : 6,9 Ko

  9. #9
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Bonsoir,

    D'accord avec Menhir.
    Une règle est de savoir déjà si la valeur cherchée existe avant de lui en lire/affecter une méthode ou une propriété.
    Dans le cas contraire, l'erreur est très vite arrivée.

    Pour ma part, j'ai une démarche qui consiste à chercher le numéro de série plutôt que la date elle-même.
    Pour ce faire, 3 étapes
    - retirer le format au champ de recherche
    - chercher le n° de série
    - rétablir le format

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    Option Explicit
     
    Public Sub recherche_date()
     
    Dim valcherchéelong As Long
    Dim leformat As String
    Dim t As Range
     
    Application.ScreenUpdating = False
     
    With Feuil1
     
            valcherchéelong = DateValue(.[C7])
     
            With .Range("A1:A3")
                    leformat = .NumberFormat
                    .NumberFormat = "0"
                     Set t = .Find(valcherchéelong, LookIn:=xlValues)
                    If Not t Is Nothing Then
                       MsgBox _
                            Prompt:="La cellule trouvée a pour adresse " & t.Address, _
                            Buttons:=vbInformation, _
                            Title:="Info"
                    End If
                    Set t = Nothing
                    .Range("A1:A3").NumberFormat = leformat
            End With
    End With
     
    Application.ScreenUpdating = True
     
    End Sub
    Cela vaut ce que cela vaut.
    Peut-être pas grand chose.

  10. #10
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 1 031
    Billets dans le blog
    45
    Par défaut
    Citation Envoyé par MarcelG Voir le message
    Bonsoir,

    D'accord avec Menhir.
    Une règle est de savoir déjà si la valeur cherchée existe avant de lui en lire/affecter une méthode ou une propriété.
    Dans le cas contraire, l'erreur est très vite arrivée.

    Pour ma part, j'ai une démarche qui consiste à chercher le numéro de série plutôt que la date elle-même.
    Pour ce faire, 3 étapes
    - retirer le format au champ de recherche
    - chercher le n° de série
    - rétablir le format

    .
    Merci MarcelG pour ton code qui pourra m’aider sur d’autres problématiques.

  11. #11
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 1 031
    Billets dans le blog
    45
    Par défaut
    Citation Envoyé par TonyNiort79 Voir le message
    Bonjour,

    il y a une différence quand on utilise
    Maintenant et Aujourdhui

    maintenant indique le jour, l'heure, les minutes, les secondes,...
    aujourd'hui indique juste le jour,

    quand on utilise Now en VBA l'équivalent de maintenant, on ne peux pas trouver une valeur identique dans un classeur,
    en VBA, il vaut mieux utiliser Date

    Nom : maintenant.jpg
Affichages : 1872
Taille : 6,9 Ko
    Merci TonyNiort79 pour cette précision qui permet d’éviter les pièges du VBA

  12. #12
    Membre expérimenté
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Septembre 2019
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Septembre 2019
    Messages : 151
    Par défaut
    Citation Envoyé par informer Voir le message
    Merci TonyNiort79 pour cette précision qui permet d’éviter les pièges du VBA
    Bonjour,
    il y a les mêmes pièges sur Excel.
    Bonne journée à tous

  13. #13
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 1 031
    Billets dans le blog
    45
    Par défaut
    Citation Envoyé par Patrice740 Voir le message
    Re,

    L'erreur vient de l'utilisation de Range(3) au lieu de Rows(3)
    Merci Patrice740 pour ta sagacité, je teste demain en espérant avoir réglé ce problème.

  14. #14
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Que de temps perdu !!!
    Au post 2 j'avais déjà écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      dDate = Date 
      '...
      Set oRgFind = oShtGraphe.Rows(3).Find(What:=dDate, LookIn:=xlValues)
    (avec =Date et sans Entirerow)

  15. #15
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 580
    Par défaut
    bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set oRgFind = oShtGraphe.Range(3).EntireRow.Find(What:="2019-01-01", LookIn:=xlFormulas, SearchOrder:=xlByRows)

  16. #16
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    Quand je ne peux pas faire autrement qu'utiliser Find pour retrouver des dates, j'utilise Application.FindFormat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub Macro1()
      Dim r As Range
      Dim d As Date
     
      d = DateSerial(2018, 4, 16)
     
      Application.FindFormat.NumberFormat = "m/d/yyyy"
      Set r = Range("b1:b38").Find(What:=Format(d, "m/d/yyyy"), After:=Range("b1"), LookIn:=xlValues, _
        LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False, SearchFormat:=True)
      If Not r Is Nothing Then MsgBox r.Address
    End Sub

    Nom : 2019-10-22_182129.png
Affichages : 407
Taille : 11,5 Ko


    Attention à bien préciser toutes les options, car FIND "singe" l'utilisation de la boite de dialogue de recherche d'Excel, et les options utilisées antérieurement restent actives.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  17. #17
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Bonsoir Pierre,

    Je ne connaissais pas. Bien!
    Je me posais la question quant à l'adaptation de ce processus à une Textbox. Il faudrait alors considérer la fonction DateValue.
    A priori, il n'y aurait pas de problème.
    A l'occasion, je testerai à partir de demain.

    Bonne soirée à toi. Bonne soirée au Forum.

  18. #18
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Re,

    comme dit MarcelG
    Le champ de recherche ne contiendrait que des nombres au format date.
    Le changement de format les considérerait en Long.
    Et la recherche devient alors plus facile.
    Certes, la rigueur des données est, comme toujours, fondamentale.
    Ce qui n'empêche pas une restitution au format initial en fin de traitement.
    pour moi, une date valide dans Excel ne peut être qu'un numéro de série, le reste n'est que formatage ! Mais bon, ça n'engage que moi

  19. #19
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Bonjour le Forum,

    Theze,

    J'ai testé la proposition de Pierre sur un formulaire.

    Code fonctionnel, avec une déclaration, comme je le pressentais, en Long

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim d As Long
    d = DateValue(Me.TextBox1)
    Quelques remarques:
    - Il y a inversion des formats entre le code ("m/d/yyyy") et la feuille de travail ("d/m/yyyy").
    La cause en est, je pense, la gestion des dates américaines
    - La fonctionnalité de la propriété FindFormat est, comme le reporte l'aide Microsoft et comme il est démontré ici, le format de recherche.
    Ce qui signifie qu'elle peut servir à tous les formats de cellules (police, couleur...). Et donc, au passage, est elle affectée à l'objet Application. Je la trouve donc très utile.
    - L'aide Microsoft quant à la fonction DateValue indique une
    Renvoie une Variante (Date
    J'aurais plutôt pensé à Long, comme d'ailleurs pour DateSerial

    Conclusion: 1 élément de plus dans ma documentation, partie "Dates".
    Merci.

    Bonne journée à tous.

  20. #20
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 1 031
    Billets dans le blog
    45
    Par défaut
    Excel, un boulet, preuve en est, j'ai implémenté la solution de Pierre et voici le résultat


    Avec
    oRgFind.Address = $B$3:$D$3
    dDate = 23/10/2019

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    oRgFind.Find(What:=Format(dDate, "m/d/yyyy"), LookIn:=xlValues, _
    LookAt:=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=True)
    Renvoie nothing

    J'ai également essayé en ajoutant After:=oRgFind.Columns(1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    oRgFind.Find(What:=Format(dDate, "m/d/yyyy"), After:=oRgFind.Columns(1), LookIn:=xlValues, _
    LookAt:=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=True)
    Toujours Nothing

    Nom : crit1.png
Affichages : 440
Taille : 42,5 Ko

    Nom : crit2.PNG
Affichages : 414
Taille : 26,7 Ko

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 0
    Dernier message: 20/07/2017, 17h06
  2. Réponses: 3
    Dernier message: 17/06/2016, 15h44
  3. [XL-2007] Formule qui ne fonctionne pas pour une certaine ligne.
    Par ESVBA dans le forum Excel
    Réponses: 11
    Dernier message: 20/01/2016, 11h56
  4. Réponses: 2
    Dernier message: 02/02/2011, 10h23
  5. Fonction DISTINCT ne fonctionne pas sur une date
    Par cramouille dans le forum Access
    Réponses: 5
    Dernier message: 25/10/2006, 15h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo