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


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé
    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



    Le format des dates est le suivant



    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



    Même chose si utilise
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    LookIn:=xlValues


    Merci par avance pour toute aide !
    Mal nommer un objet, c'est ajouter au malheur de ce monde, car le mensonge est justement la grande misère humaine, c'est pourquoi la grande tâche humaine correspondante sera de ne pas servir le mensonge
    Poésie 44, n° 17 - Albert Camus

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

  2. #2
    Expert confirmé
    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 tout 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
    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
    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é
    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



    Merci pour votre aide
    Mal nommer un objet, c'est ajouter au malheur de ce monde, car le mensonge est justement la grande misère humaine, c'est pourquoi la grande tâche humaine correspondante sera de ne pas servir le mensonge
    Poésie 44, n° 17 - Albert Camus

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

  5. #5
    Membre éclairé
    A l'origine j'utilisais un variant



    Qui prend le format date comme on le voit sur la copie d'écran mais erreur identique
    Mal nommer un objet, c'est ajouter au malheur de ce monde, car le mensonge est justement la grande misère humaine, c'est pourquoi la grande tâche humaine correspondante sera de ne pas servir le mensonge
    Poésie 44, n° 17 - Albert Camus

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

  6. #6
    Expert confirmé
    Re,

    L'erreur vient de l'utilisation de Range(3) au lieu de Rows(3)
    Cordialement,
    Patrice
    Personne ne peut détenir tout 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
    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 régulier
    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


  9. #9
    Expert éminent
    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

    Envoi d'un bloc de messageries Outlook utilisant des paramètres variables


    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é
    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.
    Mal nommer un objet, c'est ajouter au malheur de ce monde, car le mensonge est justement la grande misère humaine, c'est pourquoi la grande tâche humaine correspondante sera de ne pas servir le mensonge
    Poésie 44, n° 17 - Albert Camus

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

  11. #11
    Membre éclairé
    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

    Merci TonyNiort79 pour cette précision qui permet d’éviter les pièges du VBA
    Mal nommer un objet, c'est ajouter au malheur de ce monde, car le mensonge est justement la grande misère humaine, c'est pourquoi la grande tâche humaine correspondante sera de ne pas servir le mensonge
    Poésie 44, n° 17 - Albert Camus

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

  12. #12
    Membre éclairé
    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.
    Mal nommer un objet, c'est ajouter au malheur de ce monde, car le mensonge est justement la grande misère humaine, c'est pourquoi la grande tâche humaine correspondante sera de ne pas servir le mensonge
    Poésie 44, n° 17 - Albert Camus

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

  13. #13
    Expert confirmé
    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 tout 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 régulier
    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
    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é
    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


    La ligne sur laquelle se fait le FIND



    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

    Mal nommer un objet, c'est ajouter au malheur de ce monde, car le mensonge est justement la grande misère humaine, c'est pourquoi la grande tâche humaine correspondante sera de ne pas servir le mensonge
    Poésie 44, n° 17 - Albert Camus

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

  17. #17
    Membre confirmé
    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
    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 régulier
    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 éminent
    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

    Envoi d'un bloc de messageries Outlook utilisant des paramètres variables


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



###raw>template_hook.ano_emploi###