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

  1. #1
    Membre éclairé

    Profil pro
    Inscrit en
    janvier 2010
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2010
    Messages : 764
    Points : 689
    Points
    689
    Billets dans le blog
    19
    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 : 65
Taille : 10,8 Ko

    Le format des dates est le suivant

    Nom : Crit2.PNG
Affichages : 68
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 : 70
Taille : 17,9 Ko

    Même chose si utilise
    Merci par avance pour toute aide !
    Mes réponses vous ont aidés, un clic sur leur pouce vert
    Bonjour chez vous

  2. #2
    Membre émérite Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    mars 2007
    Messages
    1 248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : mars 2007
    Messages : 1 248
    Points : 2 686
    Points
    2 686
    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.
    Cordialement,
    Patrice
    Personne ne peut détenir le savoir, c'est pour ça qu'on le partage.

    Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur

  3. #3
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    juin 2007
    Messages
    14 195
    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 : 14 195
    Points : 29 123
    Points
    29 123
    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 : 70
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
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    janvier 2010
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2010
    Messages : 764
    Points : 689
    Points
    689
    Billets dans le blog
    19
    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 : 62
Taille : 31,8 Ko

    Merci pour votre aide
    Mes réponses vous ont aidés, un clic sur leur pouce vert
    Bonjour chez vous

  5. #5
    Membre éclairé

    Profil pro
    Inscrit en
    janvier 2010
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2010
    Messages : 764
    Points : 689
    Points
    689
    Billets dans le blog
    19
    Par défaut
    A l'origine j'utilisais un variant

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

    Qui prend le format date comme on le voit sur la copie d'écran mais erreur identique
    Mes réponses vous ont aidés, un clic sur leur pouce vert
    Bonjour chez vous

  6. #6
    Membre émérite Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    mars 2007
    Messages
    1 248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : mars 2007
    Messages : 1 248
    Points : 2 686
    Points
    2 686
    Par défaut
    Re,

    L'erreur vient de l'utilisation de Range(3) au lieu de Rows(3)
    Cordialement,
    Patrice
    Personne ne peut détenir le savoir, c'est pour ça qu'on le partage.

    Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur

  7. #7
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    juin 2007
    Messages
    14 195
    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 : 14 195
    Points : 29 123
    Points
    29 123
    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...
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  8. #8
    Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    septembre 2019
    Messages
    51
    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 : 51
    Points : 51
    Points
    51
    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 : 58
Taille : 6,9 Ko

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

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

    Informations forums :
    Inscription : juillet 2009
    Messages : 2 867
    Points : 5 871
    Points
    5 871
    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.

    Bien Cordialement.

    Marcel

    Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.



  10. #10
    Membre éclairé

    Profil pro
    Inscrit en
    janvier 2010
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2010
    Messages : 764
    Points : 689
    Points
    689
    Billets dans le blog
    19
    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.
    Mes réponses vous ont aidés, un clic sur leur pouce vert
    Bonjour chez vous

  11. #11
    Membre éclairé

    Profil pro
    Inscrit en
    janvier 2010
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2010
    Messages : 764
    Points : 689
    Points
    689
    Billets dans le blog
    19
    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 : 58
Taille : 6,9 Ko
    Merci TonyNiort79 pour cette précision qui permet d’éviter les pièges du VBA
    Mes réponses vous ont aidés, un clic sur leur pouce vert
    Bonjour chez vous

  12. #12
    Membre éclairé

    Profil pro
    Inscrit en
    janvier 2010
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2010
    Messages : 764
    Points : 689
    Points
    689
    Billets dans le blog
    19
    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.
    Mes réponses vous ont aidés, un clic sur leur pouce vert
    Bonjour chez vous

  13. #13
    Membre émérite Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    mars 2007
    Messages
    1 248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : mars 2007
    Messages : 1 248
    Points : 2 686
    Points
    2 686
    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)
    Cordialement,
    Patrice
    Personne ne peut détenir le savoir, c'est pour ça qu'on le partage.

    Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur

  14. #14
    Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    septembre 2019
    Messages
    51
    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 : 51
    Points : 51
    Points
    51
    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

  15. #15
    Expert éminent
    Homme Profil pro
    Inscrit en
    août 2010
    Messages
    3 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : août 2010
    Messages : 3 452
    Points : 6 855
    Points
    6 855
    Par défaut
    Bonjour,

    Avec Find(), je pense que la recherche est faite sur la propriété "Value" des cellules et non sur "Value2", "Value2" contient le numéro de série de la date, "Value" et "Text" contiennent la valeur formatée pour voir la différence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Sub Test()
     
        MsgBox ActiveCell.Value & vbCrLf & ActiveCell.Text & vbCrLf & ActiveCell.Value2
     
    End Sub
    Je me suis aperçu que quand on recherche une date, il peut être judicieux de passer la plage avec NumberFormat = "General", faire la recherche et remettre le formatage :
    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
     
    Sub Test2()
     
        Dim Plage As Range
        Dim Cel As Range
        Dim LaDate As Long
        Dim F As String
     
        With ActiveSheet: Set Plage = .Range(.Cells(3, 1), .Cells(3, .Columns.Count).End(xlToLeft)): End With 'sur la ligne 3
     
        'mémorise le formatage de la première cellule de la plage qui est sensé être le même pour toute la plage
        F = Plage(1, 1).NumberFormat
     
        'la date du jour
        LaDate = Date
     
        'passe le formatage en standard
        Plage.NumberFormat = "General"
     
        'effectue la recherche
        Set Cel = Plage.Find(LaDate, , xlValues, xlWhole)
     
        'si trouvée, message
        If Not Cel Is Nothing Then MsgBox "La date '" & CDate(LaDate) & "' à été trouvé dans la cellule '" & Cel.Address(0, 0) & "' !"
     
        'réaffecte le formatage initial
        Plage.NumberFormat = F
     
    End Sub

  16. #16
    Membre éclairé

    Profil pro
    Inscrit en
    janvier 2010
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2010
    Messages : 764
    Points : 689
    Points
    689
    Billets dans le blog
    19
    Par défaut
    Définitivement FIND sur les dates, c'est l'horreur !

    Preuve en est, FIND retourne nothing sur une date initialisée à #1/1/1900#


    Le code
    Nom : crit1.png
Affichages : 42
Taille : 42,1 Ko

    La ligne sur laquelle se fait le FIND
    Nom : crit2.PNG
Affichages : 40
Taille : 43,3 Ko


    Le truc c'est que je dois ensuite trouver tous les items de la colonne X de la ligne 3 ayant la même date. D'où la recherche sur la ligne 3 de la cellule ayant #1/1/1900# puis recherche sur la colonne de tous les items
    Ici c'est #1/1/1900# car c'est l'initialisation mais il y aura les dates d'historisation

    Nom : crit3.PNG
Affichages : 40
Taille : 12,1 Ko
    Mes réponses vous ont aidés, un clic sur leur pouce vert
    Bonjour chez vous

  17. #17
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    juin 2019
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : juin 2019
    Messages : 247
    Points : 399
    Points
    399
    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)

  18. #18
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    juin 2007
    Messages
    14 195
    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 : 14 195
    Points : 29 123
    Points
    29 123
    Par défaut
    Etant donné que Find cherche sur la valeur affichée et non sur la valeur saisie, à ta place je testerais de mettre dDate en String et de la renseigner entre guillemet selon le format d'affichage dans ta feuille.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  19. #19
    Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    septembre 2019
    Messages
    51
    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 : 51
    Points : 51
    Points
    51
    Par défaut
    Bonjour,
    essaye la formule suivante

    =TEXTE(AUJOURDHUI();"JJ/MM/AAAA")
    le format sera en texte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =TEXTE(AUJOURDHUI();"JJ/MM/AAAA")

  20. #20
    Expert confirmé Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    juillet 2009
    Messages
    2 867
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Maine et Loire (Pays de la Loire)

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

    Informations forums :
    Inscription : juillet 2009
    Messages : 2 867
    Points : 5 871
    Points
    5 871
    Par défaut
    Bonjour à tous,

    Au vu de ces échanges, comme ceux nombreux par le passé, je persiste à croire, comme l'ami Theze qu'il reste plus facile de rechercher un numéro de série.
    (Avec Theze, nous avons déjà participé à ce genre de discussion rémanente, et, partant, nos codes se rejoignent)

    Informer, as-tu testé le code proposé?

    Bien Cordialement.

    Marcel

    Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.



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

Discussions similaires

  1. Réponses: 0
    Dernier message: 20/07/2017, 18h06
  2. Réponses: 3
    Dernier message: 17/06/2016, 16h44
  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, 12h56
  4. Réponses: 2
    Dernier message: 02/02/2011, 11h23
  5. Fonction DISTINCT ne fonctionne pas sur une date
    Par cramouille dans le forum Access
    Réponses: 5
    Dernier message: 25/10/2006, 16h42

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