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 :

trouver une date [XL-2003]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 32
    Par défaut trouver une date
    Bonjour à tous!

    Sur mon classeur excel, j'ai une série de dates en feuille 1 entre A20 et A800 dans l'ordre croissant.
    Sur ma feuille 2, j'ai une date sur la case A1.
    Je cherche à sélectionner la date de ma feuille 2 dans la série qui se situe sur la feuille 1. Si la date n'est pas dans la série, je cherche à sélectionner la date la plus proche.

    J'ai essayé d'utiliser la fonction Find sans succès. Pouvez_vous m'aider svp?

    Merci beaucoup!

  2. #2
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    Bonjour le forum, fanfan89

    une idée à améliorer sans doute
    imaginons que tu passes par un bouton de commande, sachant a20 =>a800 meme format date que feuille 2 a1
    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
    33
    Private Sub CommandButton1_Click()
    Dim dt As Range, trouve As Range, x As Integer, y As Integer, d1 As Date, d2 As Date
        Set dt = Sheets(1).Range("a20:a800")
        d = Sheets(2).Range("a1")
        Set trouve = dt.Find(d)
        If trouve Is Nothing Then
            d1 = Sheets(2).Range("a1") + 1
            For x = 1 To 780
                Set trouve = dt.Find(d1)
                If Not trouve Is Nothing Then
                    Exit For
                Else
                    d1 = Sheets(2).Range("a1") + x
                End If
            Next x
            d2 = Sheets(2).Range("a1") - 1
            For y = 780 To 1 Step -1
                Set trouve = dt.Find(d2)
                If Not trouve Is Nothing Then
                    Exit For
                Else
                    d2 = Sheets(2).Range("a1") + x
                End If
            Next y
            If d1 < d2 Then
                MsgBox d1
            Else
                MsgBox d2
            End If
        Else
            MsgBox trouve.Value
        End If
    End Sub
    bien sur remplacer le msgbox par ton résultat escompté

    essayes comme ça

    bonne journée
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 32
    Par défaut Eviter la boucle
    Merci pour ta réponse mais avec une boucle For le temps de traitement est assez long, je cherche une façon par exemple d'utiliser la fonction Find (ou quelque chose qui y ressemble) pour sélectionner la case que je cherche en spécifiant le range a20:a800

  4. #4
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    Bonjour à tou(te)s, fanfan

    Une parade :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub CommandButton1_Click()
    Dim plage As String, dt As String, resultat As Date
       plage = Sheets(1).Range("a20:a800").Address
       dt = Sheets(2).Range("a1").Address
       Sheets(2).Range("b1").Formula = "=VLookup(" & dt & "," & "Feuil1!" & plage & ", 1, True)"
    ' une cellule provisoire
       resultat = Sheets(2).Range("b1")
       MsgBox resultat
       Sheets(2).Range("b1").ClearContents
    End Sub
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  5. #5
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Bonjour casefayere
    Je me suis permis de peaufiner encore ta proposition; en effet, si dans notre série on a 18/01/2010, 21/01/2010, 22/01/2010..., si on cherche le 20/01/2010, il va te retourner le 18/01/2010

    En supposant que la date pourrait être hors plage, et adaptant ta proposition
    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
    Dim Plage As Range, Dt As Range, c As Range
    Dim Resultat As Date
     
    With Sheets(1)
         Set Plage = .Range("A20", .Range("A" & .Rows.Count).End(xlUp))
    End With
    Set Dt = Sheets(2).Range("A1")
    If Dt.Value < Application.Min(Plage) Then
         Set c = Plage(1)
    ElseIf Dt.Value >= Application.Max(Plage) Then
         Set c = Plage(Plage.Rows.Count)
    Else
         Resultat = Evaluate("=VLookup(" & Dt.Address & "," & "Feuil1!" & Plage.Address & ", 1, True)")
         Set c = Plage.Find(Resultat)
         If DateDiff("d", c.Value, Dt.Value) > DateDiff("d", Dt.Value, c.Offset(1, 0).Value) Then Set c = c.Offset(1, 0)
    End If
    Set Plage = Nothing
    Resultat = c.Value
    MsgBox "Valeur proche trouvée de " & Dt.Value & " est " & Resultat & " trouvé en " & c.Address
    Set Dt = Nothing
    Set c = Nothing

  6. #6
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    Bonsoir mercatog,

    en effet, je n'avais pas fait attention au résultat donné, en attendant, je cherchais à écrire la formule vlookup directement dans une variable et mes recherches me laissent perplexe, j'ai trouvé ceci qui ne tient, bien sur, pas compte de tes remarques

    pour le bouton de commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub CommandButton1_Click()
    recherche
    End Sub
    dans un module
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub recherche()
    Dim resultat As Date
       resultat = Application.WorksheetFunction.VLookup(Range("feuil2!a1"), Range("feuil1!a20:a800"), 1)
       MsgBox resultat
    End Sub
    ça fonctionne mais si j'écris cette formule directement dans le bouton de commande, j'ai un message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub CommandButton1_Click()
    Dim resultat As Date
       resultat = Application.WorksheetFunction.VLookup(Range("feuil2!a1"), Range("feuil1!a20:a800"), 1)
       MsgBox resultat
    End Sub
    bonne soirée
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 21/07/2010, 08h43
  2. Trouver une date d'après un N° de semaine et une année
    Par lezinve dans le forum Général VBA
    Réponses: 2
    Dernier message: 26/02/2010, 12h38
  3. trouver une date comprise entre plusieurs lignes
    Par dinette dans le forum SQL
    Réponses: 1
    Dernier message: 12/01/2010, 20h50
  4. Réponses: 9
    Dernier message: 08/08/2009, 23h32
  5. trouver une date à partir d'un nombre de jours
    Par charlene44 dans le forum Delphi
    Réponses: 4
    Dernier message: 21/08/2006, 14h27

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