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 :

.find et date : chercher dans une colonne les dates correspondant à un mois donné


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Chef d’entreprise
    Inscrit en
    Mai 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Chef d’entreprise

    Informations forums :
    Inscription : Mai 2014
    Messages : 18
    Par défaut .find et date : chercher dans une colonne les dates correspondant à un mois donné
    Bonjour à tous !

    J'ai tenté de trouver un titre assez explicite : ce que je cherche à faire me parait simple, pourtant après 4 heures de recherches, je suis à bout et je n'ai pas trouvé de solution satisfaisante...

    Voilà donc ce que je cherche à faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim MoisChoisi as Date ' La valeur ici est du type "Juillet 2015"
     
    With Worksheets("import_mvt").Columns(4) ' Le contenu de la colonne 4 est constitué de dates (stockées sous forme de n° de série) et affichées avec un format personnalisé "mmmm yyyy" ; soit "Juillet 2015"
    Set Rg = .Find(What:=MoisChoisi, LookIn:=xlValues, LookAt:=xlPart)
    Le problème bien entendu est que Find ne me retourne aucun résultat.

    J'ai essayé déjà un million de choses (au minimum ) donc : help

    Merci d'avance

  2. #2
    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
    Bonjour,

    Teste ce qui suit, c'est le format qui pose problème :
    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
     
    Sub Test()
     
        Dim Rg As Range
        Dim MoisChoisi As Long ' La valeur ici est du type "Juillet 2015"
     
        MoisChoisi = DateValue("01/08/2015") 'la convertion en Long est faite implicitement
     
        With Worksheets("import_mvt").Range("D:D")
     
            .NumberFormat = "General" 'mets le format de la colonne en général pour la recherche sur des longs
     
            Set Rg = .Find(MoisChoisi, , xlValues, xlPart) 'trouve le premier jour du mois
     
            .NumberFormat = "mmmm yyyy" 'remets comme précédemment
     
        End With
     
        If Not Rg Is Nothing Then
     
            MsgBox Rg.Address(0, 0)
     
        End If
     
    End Sub
    Hervé.

  3. #3
    Membre averti
    Homme Profil pro
    Chef d’entreprise
    Inscrit en
    Mai 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Chef d’entreprise

    Informations forums :
    Inscription : Mai 2014
    Messages : 18
    Par défaut Merci, mais...
    Bonjour Hervé,

    Et merci pour cette suggestion, qui m'a permis d'avancer d'un cran !
    En effet, cette fois, je trouve bien les premiers jours du mois : )

    Mais mon besoin c'est de chercher tous les jours du mois.
    Il faudrait en quelque sorte que Find accepte une plage...

    En fait, je boucle et alimente un tableau, voici l'intégralité de ma procédure :

    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
     
    Type TB_Type_mouvements
        Article As String
        Qte As Single
        Date_mvt As String
    End Type
    _____________________________________________
    Sub Nettoyage_selon_periode_choisie()
     
    Dim TB_mouvements() As TB_Type_mouvements
    Dim ligne As Long
    Dim VP_Periode_choisie As Long
    Dim Rg As Range
     
    ligne = 0
    ReDim TB_mouvements(0 To ligne)
    VP_Periode_choisie = DateValue("août 2015")
     
        With Worksheets("import_mvt").Columns(4)
        .NumberFormat = "General"
            Set Rg = .Find(VP_Periode_choisie, , xlValues, xlPart)
            Do Until Rg Is Nothing
                L = Rg.Row
                TB_mouvements(ligne).Article = Cells(L, 2)
                TB_mouvements(ligne).Qte = Cells(L, 3)
                TB_mouvements(ligne).Date_mvt = Cells(L, 4)
                ligne = ligne + 1
                ReDim Preserve TB_mouvements(0 To ligne)
                Set Rg = .FindNext(.Cells(L))
            Loop
        .NumberFormat = "mmmm yyyy"
        End With
    End Sub
    Qu'en penses-tu ?

  4. #4
    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
    Il te suffit alors de calculer le nombre de jours dans le mois et ensuite boucler à partir du premier jour du mois jusqu'à la fin du mois :
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
    Type TB_Type_mouvements
     
        Article As String
        Qte As Single
        Date_mvt As String
     
    End Type
     
    Sub Nettoyage_selon_periode_choisie()
     
        Dim TB_mouvements() As TB_Type_mouvements
        Dim Plage As Range
        Dim Rg As Range
        Dim VP_Periode_choisie As Long
        Dim NBJours As Integer
        Dim I As Integer
     
        VP_Periode_choisie = DateValue("août 2015")
     
        'calcule le nombre de jours dans le mois
        NBJours = DateSerial(Year(VP_Periode_choisie), Month(VP_Periode_choisie) + 1, 1) - VP_Periode_choisie
     
        'défini la plage en colonne D à partir de D1
        With Worksheets("import_mvt")
     
            Set Plage = .Range(.Cells(1, 4), .Cells(.Rows.Count, 4).End(xlUp))
     
            Plage.NumberFormat = "General"
     
            'recherche le premier jour du mois
            Set Rg = Plage.Find(VP_Periode_choisie, , xlValues, xlPart)
     
            'si trouvé...
            If Not Rg Is Nothing Then
     
                'redimensionne par rapport au nombre de jours dans le mois
                ReDim TB_mouvements(0 To NBJours)
     
                'et stocke les valeurs dans le tableau
                For I = 0 To NBJours - 1
     
                    TB_mouvements(I).Article = .Cells(Rg.Row + I, 2).Value
                    TB_mouvements(I).Qte = .Cells(Rg.Row + I, 3)
                    TB_mouvements(I).Date_mvt = Format(.Cells(Rg.Row + I, 4), "dd mmmm yyyy")
     
                Next I
     
            End If
     
            Plage.NumberFormat = "mmmm yyyy"
     
        End With
     
     
        'pour le test...
         For I = 0 To UBound(TB_mouvements) - 1
     
            Debug.Print "Article : " & TB_mouvements(I).Article & " Date : " & TB_mouvements(I).Date_mvt & " Quantité : " & TB_mouvements(I).Qte
     
         Next I
     
    End Sub
    Hervé.

  5. #5
    Membre averti
    Homme Profil pro
    Chef d’entreprise
    Inscrit en
    Mai 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Chef d’entreprise

    Informations forums :
    Inscription : Mai 2014
    Messages : 18
    Par défaut Ce n'est pas encore ça :(
    Hervé,

    J'ai terminé de tester ce code, il y a un hic encore : je ne traite que 31 entrées.

    Je n'ai pas pas tout détaillé auparavant, mais je pense que ça devient indispensable de reformuler :=)

    Je parcours un tableau a 4 colonnes, avec la date en colonne 4.
    J'ai environ 2000 lignes, dont environ 200 concernent un même mois.
    Je souhaite trouver via find (plus rapide) chaque ligne correspondant au mois cherché (août dans notre exemple).

    Sinon autre solution :

    Supprimer avec find chaque ligne pour laquelle la colonne date n'est pas égale à l'expression cherchée "aout 2015".
    Je sais faire l'inverse, mais pas ça

    Je ne trouve pas ce qui serait le plus simple...

  6. #6
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut



    Bonjour,

    utiliser un filtre serait bien plus simple … (le B-A-BA d'Excel plus rentable qu'une usine utilisant une boucle !)

    S'entraîner manuellement puis en activant l'Enregistreur de macros, une base de code est livrée sur un plateau !


    _____________________________________________________________________________________________________
    Je suis Charlie, Bardo, Sousse

  7. #7
    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
    Je comprends un peu mieux, enfin je pense !
    Comme la fonction "DateValue" retourne une date égale au premier jour du mois si le jour n'est pas précisé, la fonction "Find" ne retournera que les cellules ayant comme valeur la valeur "Long" identique à 42217 (nombre de jours écoulés depuis le 01/01/1900 pour le 01/08/2015) donc, il te faut boucler sur tous les jours du mois en effectuant une recherche pour chaque jour.
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    Type TB_Type_mouvements
     
        Article As String
        Qte As Single
        Date_mvt As String
     
    End Type
     
    Sub Nettoyage_selon_periode_choisie()
     
        Dim TB_mouvements() As TB_Type_mouvements
        Dim Plage As Range
        Dim Rg As Range
        Dim VP_Periode_choisie As Long
        Dim NBJours As Integer
        Dim Lgn As Long
        Dim Adr As String
        Dim I As Integer
     
        VP_Periode_choisie = DateValue("août 2015")
     
        NBJours = DateSerial(Year(VP_Periode_choisie), Month(VP_Periode_choisie) + 1, 1) - VP_Periode_choisie
     
        'défini la plage en colonne D à partir de D1
        With Worksheets("import_mvt")
     
            Set Plage = .Range(.Cells(1, 4), .Cells(.Rows.Count, 4).End(xlUp))
     
        End With
     
        Plage.NumberFormat = "General"
     
        For I = 0 To NBJours - 1
     
            Set Rg = Plage.Find(VP_Periode_choisie + I, , xlValues, xlPart)
     
            'si trouvé...
            If Not Rg Is Nothing Then
     
                Adr = Rg.Address
     
                Do
     
                    'redimensionne par rapport au nombre de jours dans le mois
                    ReDim Preserve TB_mouvements(0 To Lgn)
     
                    TB_mouvements(Lgn).Article = Rg.Offset(, -2).Value
                    TB_mouvements(Lgn).Qte = Rg.Offset(, -1).Value
                    TB_mouvements(Lgn).Date_mvt = Format(Rg.Value, "dd mmmm yyyy")
     
                    Lgn = Lgn + 1
     
                    Set Rg = Plage.FindNext(Rg)
     
                Loop While Adr <> Rg.Address
     
            End If
     
        Next I
     
        Plage.NumberFormat = "mmmm yyyy"
     
       'pour le test sur la feuille "Feuil2"...
        For I = 0 To UBound(TB_mouvements) - 1
     
            Worksheets("feuil2").Cells(I + 1, 1) = "Article : " & TB_mouvements(I).Article & " Date : " & TB_mouvements(I).Date_mvt & " Quantité : " & TB_mouvements(I).Qte & " --> i : " & I
     
        Next I
     
    End Sub
    Maintenant, question de rapidité il faut voir car avec la proc ci-dessus il faut boucler plusieurs fois (sur tous les jours avec la boucle For Next et sur toutes les occurrences avec la boucle Do-Loop). Tu peux tester le code ci-dessous car il ne fait qu'une passe en faisant une comparaison sur le mois :
    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
    38
    39
    40
    41
    42
    43
     
    Sub Nettoyage_selon_periode_choisie_Avec_Boucle()
     
        Dim TB_mouvements() As TB_Type_mouvements
        Dim Plage As Range
        Dim Cel As Range
        Dim VP_Periode_choisie As Long
        Dim Lgn As Long
        Dim I As Integer
     
        VP_Periode_choisie = DateValue("août 2015")
     
        'défini la plage en colonne D à partir de D1
        With Worksheets("import_mvt")
     
            Set Plage = .Range(.Cells(1, 4), .Cells(.Rows.Count, 4).End(xlUp))
     
        End With
     
        For Each Cel In Plage
     
            If Month(Cel.Value) = Month(VP_Periode_choisie) Then
     
                ReDim Preserve TB_mouvements(0 To Lgn)
     
                TB_mouvements(Lgn).Article = Cel.Offset(, -2).Value
                TB_mouvements(Lgn).Qte = Cel.Offset(, -1).Value
                TB_mouvements(Lgn).Date_mvt = Format(Cel.Value, "dd mmmm yyyy")
     
                Lgn = Lgn + 1
     
            End If
     
        Next Cel
     
       'pour le test sur la feuille "Feuil2"...
        For I = 0 To UBound(TB_mouvements) - 1
     
            Worksheets("feuil2").Cells(I + 1, 1) = "Article : " & TB_mouvements(I).Article & " Date : " & TB_mouvements(I).Date_mvt & " Quantité : " & TB_mouvements(I).Qte & " --> i : " & I
     
        Next I
     
    End Sub
    Les dates pose toujours problème car nous les interprétons d'une certaine façon (visuellement avec un formatage) et Excel d'une autre (Long pour les dates et Single pour les heures)

    Hervé.

  8. #8
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Citation Envoyé par ZalemCitizen Voir le message
    Bonjour à tous !

    J'ai tenté de trouver un titre assez explicite : ce que je cherche à faire me parait simple, pourtant après 4 heures de recherches, je suis à bout et je n'ai pas trouvé de solution satisfaisante...

    Voilà donc ce que je cherche à faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim MoisChoisi as Date ' La valeur ici est du type "Juillet 2015"
    
    With Worksheets("import_mvt").Columns(4) ' Le contenu de la colonne 4 est constitué de dates (stockées sous forme de n° de série) et affichées avec un format personnalisé "mmmm yyyy" ; soit "Juillet 2015"
    Set Rg = .Find(What:=MoisChoisi, LookIn:=xlValues, LookAt:=xlPart)
    Le problème bien entendu est que Find ne me retourne aucun résultat.

    J'ai essayé déjà un million de choses (au minimum ) donc : help

    Merci d'avance
    Bonjour.

    FIND avec xlValues ne trouve pas une date dans un champ au format personnalisé.
    Par contre, si le champ est au format [$-40C]mmmm aaaa;@ ou [$-F800]jjjj, mmmm jj, aaaa
    le code suivant donne un résultat sur mon ordi:

    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
    Sub tt()
    Dim what As String
    Dim dt As Date
    dt = "2015-08-27"
     
    NumberFormat = "mmmm yyyy"
    what = Format(dt, NumberFormat)
     
    LookIn = xlValues
    WholeOrPart = xlPart
    SearchFormat = False
     
    Set r = Range("A2:A" & Rows.Count)
    Set FirstCellToSearch = r.Cells(r.Rows.Count, 1)
     
    Set rg = r.Find(what:=what, After:=FirstCellToSearch, LookIn:=LookIn, LookAt:=WholeOrPart, SearchFormat:=False, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)
     
    End Sub

  9. #9
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    @docmarti
    j'aime assez le wholeorpart
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  10. #10
    Membre averti
    Homme Profil pro
    Chef d’entreprise
    Inscrit en
    Mai 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Chef d’entreprise

    Informations forums :
    Inscription : Mai 2014
    Messages : 18
    Par défaut Merci : )
    Merci à tous les deux pour ces propositions !

    Patrick, je vais essayer ta soluce qui me semble pouvoir être très rapide ! Et simple en plus : )

    Docmarti, j'ai essayé beaucoup de choses similaires à ta proposition, sauf en effet de laisser un format de date par défaut (en fait je me souviens plus tellement j'ai testé de trucs !)

    Dans tous les cas merci !

Discussions similaires

  1. Traiter une par une les dates contenue dans une cellule
    Par wyzer dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 05/04/2012, 09h20
  2. [XL-2003] Afficher dans un TexBox la date contenue dans une ListBox
    Par MichaSarah dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 24/05/2010, 02h18
  3. Réponses: 10
    Dernier message: 12/06/2007, 10h32
  4. Compter les Dates différentes dans une requête Access
    Par maxireus dans le forum Modélisation
    Réponses: 2
    Dernier message: 11/05/2007, 00h02
  5. [date] Recherche dans une plage de dates
    Par astro84 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 28/06/2005, 17h13

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