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 :

Comparaison de date (nom d'un fichier) et date saisie dans Userform [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 77
    Par défaut Comparaison de date (nom d'un fichier) et date saisie dans Userform
    Bonsoir,

    Tournant en rond depuis deux jours, je reviens vers vous pour une Nième énigme pour moi (je vous rassure, je commence à trouver moi-même des réponses à certaines énigmes, même si j'y mets le temps ) ...
    Je vais essayer d'être le plus clair possible dans mes explications.

    Via un UserForm, je souhaite permettre la suppression de fichiers archivés.
    Ces fichiers portent un nom contenant systématiquement la date d'archivage au format anglais (yymmdd).
    J'ai créé le UserForm avec entre autres :
    - une ComboBox (cmbDate) contenant les opérateurs de comparaison
    - une TextBox (txtDate) pour la saisie d'une date au format français (jj/mm/aa)
    - une ListBox (lbListeArchives) pour afficher les noms des fichiers xls trouvés dans le répertoire (ThisWorkbook.Path)
    A ce jour, j'ai réussi à alimenter la ListBox si je ne mets pas de date ou si j'en mets une (l'opérateur de comparaison n'est pas encore opérationnel). Je souhaite maintenant utiliser le comparateur (<=, >=, = ou <>) et ne récupérer dans la ListBox que les fichiers répondant au critère de recherche (ex : fichiers contenant dans leur nom une date <= à la date saisie dans le UserForm). Et c'est là que le bas blesse, car malgré mes recherche et mes essais, je n'y arrive pas
    Voici où j'en suis (code du UserForm).

    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
    Option Explicit
     
    Private Sub UserForm_Initialize()
    ' Alimentation de la ComboBox cmdDate avec les opérateurs de comparaison
        cmbDate.AddItem "<="
        cmbDate.AddItem ">="
        cmbDate.AddItem "="
        cmbDate.AddItem "<>"
    End Sub
     
    Private Sub cmdRechercher_Click()
    ' Déclaration des variables
        Dim Chemin As String ' Variable indiquant le répertoire de stockage de l'application
        Dim NomFichier As String ' Variable de stockage du nom du fichier archivé
        ' Variables date
        Dim Jour As String, Mois As String, Annee As String ' Variables pour conversion de la date saisie
        Dim DateSaisie As String ' Valeur de txtDate
        Dim ValeurDate As String ' Date saisie mise au format "jjmmaa" ("ddmmyy")
    '
    ' Définition des valeurs de la variable ValeurDate
        Chemin = ThisWorkbook.Path
        DateSaisie = txtDate.Value
    '
    ' Conversion au format anglais ("yymmdd") de la date saisie (DateSaisie)
        ' Récupération des 2 premiers caractères en partant de la gauche (jour)
        Jour = Left(DateSaisie, 2)
        ' Récupération des 2 caractères suivant le 4ème caractère en partant de la gauche (mois)
        Mois = Mid(DateSaisie, 4, 2)
        ' Récupération des 2 premiers caractères en partant de la droite (année)
        Annee = Right(DateSaisie, 2)
        ' Définition de ValeurDate (mise au format anglais de la date saisie)
        ValeurDate = Annee & Mois & Jour
    '
    ' Recherche des fichiers
        NomFichier = Dir(Chemin & "\*" & ValeurDate & "*.xls"
    ' La boucle tourne tant qu'elle trouve un fichier correspondant aux critères de recherche
        Do While Len(NomFichier) > 0
            ' Ajoute le nom du fichier dans la ListBox
            lbListeArchives.AddItem NomFichier
            ' Recherche du fichier suivant
            NomFichier = Dir()
        Loop
    End Sub
    Merci d'avance pour votre aide. J'essayerai ensuite d'avancer seul pour la suite ... sauf si je bute à nouveau
    Bruno

  2. #2
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Bonjour,

    la combobox où tu a mis tes opérateurs de comparaison contient des chaînes de caractères (string) qui ne peuvent être interprêtées comme comaparateurs.

    Il te faut donc établir, par exemple, un mécanisme d'interprêtation, du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Select case toto ' toto étant la sélection faite dans la combo
     
      Case is ">"
         .....tes instructions
      Case is ">="
       .....tes instructions
      Case is "<"
        ... tes instructions
      Case is "<="
        .....tes instructions
    End select
    Tes instructions ?
    Isoler de l'inventaire fait par la boucle sur DSir, pour chaque fichiuer trouvé, les 4 derniers caractères, les transformer en numérique et comparer avec l'équivalent résultant de tes textboxes. Comme tu as choisi yymmdd, la comparaison numérique (donc pas de dates) sera parfaite si tu n'omets pas de bien formater chacun de ces nombres sur deux chiffres (donc, par exemple, 02 pour 2).
    Tu devrais t'en sortir avec ces explications.
    Reviens si tu ne t'en sors pas.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 77
    Par défaut
    J'ai essayé de faire quelque chose, voici ce que j'ai écrit :
    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
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    Option Explicit
     
    Private Sub UserForm_Initialize()
    ' Alimentation de la ComboBox cmdDate avec les opérateurs de comparaison
        cmbDate.AddItem "<"
        cmbDate.AddItem "<="
        cmbDate.AddItem ">"
        cmbDate.AddItem ">="
        cmbDate.AddItem "="
        cmbDate.AddItem "<>"
    End Sub
     
    Private Sub cmdRechercher_Click()
    ' Déclaration des variables
        Dim Chemin As String ' Variable indiquant le répertoire de stockage de l'application
        Dim NomFichier As String ' Variable de stockage du nom du fichier archivé
        Dim Operateur As String ' Valeur de l'opérateur de comparaison cmbDate
        ' Variables date
        Dim Jour As String, Mois As String, Annee As String ' Variables pour conversion de la date saisie
        Dim DateSaisie As String ' Valeur de txtDate
        Dim ValeurDate As String ' DateSaisie mise au format "jjmmaa" ("ddmmyy")
        Dim DateFichier As String ' Date au format anglais (yymmdd) présente dans le nom du fichier
        ' Variables servant au tri des fichiers dans la ListBox
        Dim i As Integer, j As Integer ' Nombre d'éléments dans la ListBox (le comptage démarre à 0 et non à 1)
        Dim Temp As String ' Variable de stockage temporaire du nom du fichier à classer
    '
    ' Initialisation des variables
        Chemin = ThisWorkbook.Path
        DateSaisie = txtDate.Value
        Operateur = cmbDate.Value
        NomFichier = Dir(Chemin & "\*.xls")
        DateFichier = Left(NomFichier, 6) ' Récupération des 6 premiers caractères en partant de la gauche
    '
    ' Conversion au format anglais ("yymmdd") de la date saisie (DateSaisie)
        ' Récupération des 2 premiers caractères en partant de la gauche (jour)
        Jour = Left(DateSaisie, 2)
        ' Récupération des 2 caractères suivant le 4ème caractère en partant de la gauche (mois)
        Mois = Mid(DateSaisie, 4, 2)
        ' Récupération des 2 premiers caractères en partant de la droite (année)
        Annee = Right(DateSaisie, 2)
        ' Définition de ValeurDate (mise au format anglais de la date saisie)
        ValeurDate = Annee & Mois & Jour
    '
    ' Contrôle et comparaison des dates, définition de la valeur de NomFichier et alimentation de lbListeArchives
        If DateSaisie <> "" Then
            Select Case Operateur
                Case "<"
                Do While Len(NomFichier) > 0
                    If DateFichier < ValeurDate Then
                        ' Ajoute le nom du fichier dans la ListBox
                        lbListeArchives.AddItem NomFichier
                        ' Recherche du fichier suivant
                        NomFichier = Dir()
                    End If
                Loop
                Case "<="
                Do While Len(NomFichier) > 0
                    If DateFichier <= ValeurDate Then
                        ' Ajoute le nom du fichier dans la ListBox
                        lbListeArchives.AddItem NomFichier
                        ' Recherche du fichier suivant
                        NomFichier = Dir()
                    End If
                Loop
                Case ">"
                Do While Len(NomFichier) > 0
                    If DateFichier > ValeurDate Then
                        ' Ajoute le nom du fichier dans la ListBox
                        lbListeArchives.AddItem NomFichier
                        ' Recherche du fichier suivant
                        NomFichier = Dir()
                    End If
                Loop
                Case ">="
                Do While Len(NomFichier) > 0
                    If DateFichier >= ValeurDate Then
                        ' Ajoute le nom du fichier dans la ListBox
                        lbListeArchives.AddItem NomFichier
                        ' Recherche du fichier suivant
                        NomFichier = Dir()
                    End If
                Loop
                Case "="
                Do While Len(NomFichier) > 0
                    If DateFichier = ValeurDate Then
                        ' Ajoute le nom du fichier dans la ListBox
                        lbListeArchives.AddItem NomFichier
                        ' Recherche du fichier suivant
                        NomFichier = Dir()
                    End If
                Loop
                Case Else
                Do While Len(NomFichier) > 0
                    If DateFichier <> ValeurDate And IsNumeric(DateFichier) Then
                        ' Ajoute le nom du fichier dans la ListBox
                        lbListeArchives.AddItem NomFichier
                        ' Recherche du fichier suivant
                        NomFichier = Dir()
                    End If
                Loop
            End Select
            Else
            NomFichier = Dir(Chemin & "\*.xls")
            Do While Len(NomFichier) > 0
            ' Ajoute le nom du fichier dans la ListBox
                lbListeArchives.AddItem NomFichier
            ' Recherche du fichier suivant
                NomFichier = Dir()
            Loop
        End If
    End Sub
    Lorsque je lance le UserForm, et après test des différentes possibilités (opérateur et dates différents, pas de date), j'obtiens toujours le même résultat, à savoir l'affichage de la liste complète des fichiers xls
    Après contrôle pas à pas, les variables prennent bien les valeurs attendues, le choix de l'opérateur influe correctement sur Select Case. Je ne comprends pas ce que j'ai fait de mal ...
    J'ai aussi testé avec Case Is "Operateur" ou Case "Operateur" pour un même résultat.

  4. #4
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Hé bé !...

    Bon...
    Correction à main levée :

    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
     lbListeArchives.Clear ' on vide avant de faire un nouvel inventaire
        ValeurDate = Format(txtDate.Value, "yymmdd") ' voilà qui t'évide ton micmac et débarrasse-toi des variables jour, mois, etc...
        Operateur = cmbDate.Value
        NomFichier = Dir(Chemin & "\*.xls")
        Do While Len(NomFichier) > 0
          DateFichier = Format(Val(Right(NomFichier, 10)), "0#####") ' <<<<<======== réfléchis ... il faut penser aux 4 caractères ".xls ...
          Select Case Operateur ' on ne décide ici que l'insertion ou pas et rien d'autre !
            Case "<"
              If DateFichier < ValeurDate Then lbListeArchives.AddItem NomFichier
            Case "<="
              If DateFichier <= ValeurDate Then lbListeArchives.AddItem NomFichier
            Case ">"
              If DateFichier > ValeurDate Then lbListeArchives.AddItem NomFichier
            Case ">="
              If DateFichier >= ValeurDate Then lbListeArchives.AddItem NomFichier
          End Select
          NomFichier = Dir()
        Loop
    essaye et fais-moi savoir...

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 77
    Par défaut
    Bonjour,

    Merci beaucoup pour le coup de main Le code est beaucoup plus simple ainsi, et c'est en lisant mon code qu'on voit bien mes limites de débutant Pourquoi faire simple et fonctionnel alors qu'on peut faire compliqué et ... non fonctionnel

    Redevenons sérieux. Une chose que j'ai oublié de préciser, et tu ne pouvais pas le deviner, c'est que le nom des fichiers commence par la date au format anglais (lorsqu'il y a une date car le répertoire ne contient pas que des fichiers avec date), ce qui explique mon DateFichier = Left(NomFichier, 6). J'ai donc modifier ton code en ce sens.
    J'ai également ajouté une condition car Format mettait en forme la date, et renvoyait la valeur "000000" s'il n'y avait pas de date. Résultat : les fichiers sans date étaient inscrits dans la ListBox.
    Enfin, j'ai ajouté les autres opérateurs.

    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
        ValeurDate = Format(txtDate.Value, "yymmdd")
        Operateur = cmbDate.Value
        NomFichier = Dir(Chemin & "\*.xls")
        Do While Len(NomFichier) > 0
          DateFichier = Format(Val(Left(NomFichier, 6)), "0#####")
          Select Case Operateur ' on ne décide ici que l'insertion ou pas et rien d'autre !
            Case "<"
              If DateFichier < ValeurDate And DateFichier <> "000000" Then lbListeArchives.AddItem NomFichier
            Case "<="
              If DateFichier <= ValeurDate And DateFichier <> "000000" Then lbListeArchives.AddItem NomFichier
            Case ">"
              If DateFichier > ValeurDate And DateFichier <> "000000" Then lbListeArchives.AddItem NomFichier
            Case ">="
              If DateFichier >= ValeurDate And DateFichier <> "000000" Then lbListeArchives.AddItem NomFichier
            Case "="
              If DateFichier = ValeurDate And DateFichier <> "000000" Then lbListeArchives.AddItem NomFichier
            Case "<>"
              If DateFichier <> ValeurDate And DateFichier <> "000000" Then lbListeArchives.AddItem NomFichier
          End Select
          NomFichier = Dir()
        Loop
    Merci encore pour ton aide qui m'a été très précieuse Tout fonctionne parfaitement
    Bruno

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

Discussions similaires

  1. Parser une date suivi d'un fuseaux horaire (date+02:00) et conversion en Date.
    Par SpeedOverflow dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 30/06/2013, 13h37
  2. Réponses: 0
    Dernier message: 28/06/2011, 15h18
  3. [CRONTAB]Nom d'un fichier avec la date du jour
    Par fabszn dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 22/05/2007, 14h37
  4. [VBA-E]ouvrir un fichier dont le nom est determiné par sa date de création
    Par olivertwist dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 17/04/2007, 17h29
  5. [D7] Comparaison de dates d'accès de fichier
    Par johweb dans le forum Delphi
    Réponses: 2
    Dernier message: 18/01/2007, 14h45

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