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 :

VBA Fonction FIND [XL-2003]


Sujet :

Macros et VBA Excel

  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 VBA Fonction FIND
    Bonjour à tous,

    je travaille sur un classeur dans lequel il y a une série de dates assez longue en colonne A. La série commence en A19.

    je souhaite, à partir d'une date qu'on remplit manuellement sur la case C4 de ma feuille, retrouver le numéro de la ligne dans ma série en colonne A qui correspond à la date que j'ai rentré en C4. Je souhaite renvoyer ce numéro de ligne dans la case C5.

    Dans l'hypothèse où la date que j'ai rentré en C4 ne se trouve pas dans ma série en colonne A, je voudrais retrouver le numéro de ligne de la date la plus proche.

    J'ai essayé de mettre au point un début de macro en me servant de la fonction Find, mais sans résultat car même en définissant un Range pour ma recherche (en colonne A), la fonction Find me renvoie toujours la date située en C4...

    Pouvez-vous m'aider svp?

    Merci!

  2. #2
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Bonjour.

    Une précision : en colonne A les dates sont dans un ordre particulier ?

    PGZ

  3. #3
    Membre Expert
    Inscrit en
    Août 2006
    Messages
    1 588
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 1 588
    Par défaut
    Bonjour,
    avec un exemple
    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
     
    Sub test()
     Dim sh As Worksheet, d As Date, l As Long
     
     Set sh = Worksheets("Feuil1")
     d = sh.Range("C4")
     
     n = 0
     Do until n>20
      l = ligne(sh, d + n)
      If l > 0 Then sh.Range("C5") = l: Exit Do
      l = ligne(sh, d - n)
      If l > 0 Then sh.Range("C5") = l: Exit Do
      n = n + 1
     Loop
    End Sub
     
    Function ligne(sh As Worksheet, d As Date) As Long
     ligne = 0
     Set c = sh.Range("C10:C100").Find(d, LookIn:=xlValues)
     If Not c Is Nothing Then ligne = c.Row
    End Function
    la procedure envoie la date à la fonction ligne qui doit lui retourner la ligne
    si celle-ci n'est pas trouvée, on incremente la date si toujours pas trouvée on décremente la date jusqu'à l'obtention d'un résultat. on limite la recherche au 20 jours suivant ou précédent la date à rechercher
    la fonction retourne la ligne de la date trouvée sinon 0

  4. #4
    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
    Pour compléter la solution proposée par Helas et s'inspirant d'elle, j'ai pris l'évènement change de la feuille
    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
    34
    35
    36
    37
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Dte As Date
    Dim Plage As Range, c As Range
    Dim i As Integer, n As Integer
    Dim Ligne As Long
     
    If Target.Address = "$C$4" Then
        If Target.Value <> "" And IsDate(Target.Value) Then
            Dte = Target.Value
            Set Plage = Range("A19", Cells(Rows.Count, "A").End(xlUp))
            Dte = IIf(DateDiff("d", Dte, Application.Min(Plage)) > 0, Application.Min(Plage), Dte)
            Dte = IIf(DateDiff("d", Dte, Application.Max(Plage)) < 0, Application.Max(Plage), Dte)
            Do
                Ligne = RechercheDate(Plage, DateAdd("d", n, Dte))
                If Ligne > 0 Then Exit Do
                Ligne = RechercheDate(Plage, DateAdd("d", -n, Dte))
                If Ligne > 0 Then Exit Do
                n = n + 1
            Loop
            Set Plage = Nothing
        End If
    End If
    Application.EnableEvents = False
    Range("C5").Value = IIf(Ligne = 0, "", Ligne)
    Application.EnableEvents = True
    End Sub
     
     
    Function RechercheDate(LaPlage As Range, LaDate As Date) As Long
    Dim c As Range
     
    Set c = LaPlage.Find(LaDate)
    If Not c Is Nothing Then
        RechercheDate = c.Row
        Set c = Nothing
    End If
    End Function
    Qui traite aussi les dates hors plage

  5. #5
    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 Merci
    Merci helas, ton code fonctionne très bien!

    j'ai juste eu un petit souci dans le format des dates car mon pack office est en anglais (jour / mois inversé) mais ça tu n'y étais pour rien

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

Discussions similaires

  1. [E-03] Aide sur la Fonction .Find dans VBA
    Par Gunsx dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 29/01/2009, 22h36
  2. VBA Access : Fonction find qui ne marche pas
    Par leeloo35 dans le forum VBA Access
    Réponses: 7
    Dernier message: 09/02/2008, 16h56
  3. [VBA-E]Problème avec la fonction Find
    Par Mirx1 dans le forum Macros et VBA Excel
    Réponses: 17
    Dernier message: 27/04/2006, 18h43
  4. [VBA-E]Fonction .find
    Par marie10 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 16/01/2006, 11h03
  5. [VBA-E] Fonction "FIND"
    Par cinc dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 06/09/2005, 11h16

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