XL 2019 Parcourir un tableau afin d'extraire des dates comprises dans un intervalle

Smveee

XLDnaute Nouveau
Bonjour à vous,

Je vous écris car j'essaie depuis quelques jours d'effectuer la chose suivante avec VBA :

  • L'utilisateur saisit dans un tableau les critères suivants : nom de la réunion, le type de réunion, l'étape (liste déroulante) et la date dans la colonne approprié (allant de Janvier à Décembre).
  • Ensuite si l'utilisateur souhaite extraire les réunions dans un intervalle qu'il aura saisi il devra se rendre dans la feuille "Extraction" et faire : cocher l'étape qui l'intéresse (1, 2 ou les 3 choix possibles) + saisir une date de début + saisir une date de fin + appuyer sur valider
  • Et c'est là que ça coince, j'ai le message d'erreur suivant : "Erreur de compilation ; référence de variable de contrôle incorrecte dans Next"
  • Ce que je souhaite c'est que la macro positionne dans une nouvelle feuille la liste des réunions selon chaque étape sous la forme suivante :
    • Etape Test1
      • 21/02 : NomRéunion1
      • 22/02 : NomRéunion2 + NomRéunion3
    • Etape Test 2
      • 18/02 : NomRéunion4
Vous pouvez retrouver avec ce message un fichier Excel avec le code VBA et l'erreur en question.

Je vous remercie par avance,

Cordialement
 

Pièces jointes

  • Parcourir un tableau.xlsm
    26 KB · Affichages: 7
Dernière édition:

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Smveee,
Tout langage demande une extrême rigueur, vous avez :
VB:
For Each celulle In Range("Tableau1[[Janvier]:[Décembre]]")

Next cellule
Or pour le VBA "celulle" et "cellule" sont deux variables différentes. ( regardez les doubles L )
Pour éviter ça, mettez au tout début de votre feuille "option explicit". Le VBA vous dira qu'il y a une variable qui n'est pas déclarée.
VB:
Option Explicit
Sub TestMacro()

    Dim ws As Worksheet
    Set ws = Sheets("Extraction")
...
1650892608427.png


Ensuite vous avez d'autres erreurs, mais c'est un autre problème.
Comme :
Dim colonneJanvier As String puis colonneJanvier = Range("E3:E18"), c'est donc un range, non un string.
 

Smveee

XLDnaute Nouveau
Bonjour,

Merci pour votre retour. Effectivement je viens de voir cette erreur après vérification. Je vous remercie. Je continue le développement de ce fichier qui va sans doute encore me poser énormément de problème..

C'est mon 2nd projet que je souhaite réaliser avec VBA, désolé des futurs questions stupides que je peux poser..
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re,
J'ai debuggué votre macro sans trop savoir ce que cela fait, mais au moins ça passe sans erreur.
- dateDebut et dateFin ne sont pas des string, mais des nombres
- Idem pour colonnexxx, ce sont des range
-tabResultat() = cellule ne peut pas marcher, car tabResultat est un tableau donc la syntaxe est tabResultat(indice ), donc il faut gérer l'indice :
VB:
p = 0 ' Indice du tableau init à 0'
For Each cellule In Range("Tableau1[[Janvier]:[Décembre]]")
    If cellule.Value >= dateDebut And cellule.Value <= dateFin Then
        ReDim Preserve tabResultat(p)    ' On redimensionne le tableau avec cet indice'
        Debug.Print cellule
        tabResultat(p) = cellule.Value    ' On range la valeur dans le tableau'
        p = p + 1                        ' On passe à l'indice suivant pour le prochain rangement
    End If
Next cellule
 

Pièces jointes

  • Parcourir un tableau.xlsm
    24.3 KB · Affichages: 7

Smveee

XLDnaute Nouveau
Re,
J'ai debuggué votre macro sans trop savoir ce que cela fait, mais au moins ça passe sans erreur.
- dateDebut et dateFin ne sont pas des string, mais des nombres
- Idem pour colonnexxx, ce sont des range
-tabResultat() = cellule ne peut pas marcher, car tabResultat est un tableau donc la syntaxe est tabResultat(indice ), donc il faut gérer l'indice :
VB:
p = 0 ' Indice du tableau init à 0'
For Each cellule In Range("Tableau1[[Janvier]:[Décembre]]")
    If cellule.Value >= dateDebut And cellule.Value <= dateFin Then
        ReDim Preserve tabResultat(p)    ' On redimensionne le tableau avec cet indice'
        Debug.Print cellule
        tabResultat(p) = cellule.Value    ' On range la valeur dans le tableau'
        p = p + 1                        ' On passe à l'indice suivant pour le prochain rangement
    End If
Next cellule

Bonjour,
Je vous remercie pour votre partage. Ce code fonctionne également de mon côté je vous remercie.
Ce que je souhaite c'est que la macro positionne dans une nouvelle feuille la liste des réunions selon chaque étape sous la forme suivante :
  • Etape Test1
    • 21/02 : NomRéunion1
    • 22/02 : NomRéunion2 + NomRéunion3
  • Etape Test 2
    • 18/02 : NomRéunion4
Est-ce compréhensible ? Il faut donc récupérer 3 informations à chaque fois : l'étape (qu'on affiche qu'une fois pour toutes les réunions d'une même étape) + la date + le nom de la réunion

De plus, la partie la plus compliqué est selon moi le fait de gérer les multi dates au sein d'une même cellule, je m'explique : dans une cellule il peut avoir x dates sous 2 formes possible : xx/xx, xx/xx ou bien xx/xx et xx/xx. De ce fait, la macro devra ressortir les 2 dates. Est-ce possible selon vous ? Je ne suis pas encore à cette étape mais cela semble compliqué.
Cordialement
 

Smveee

XLDnaute Nouveau
Effectivement ce sera complexe.
En particulier vos dates qui peuvent être double dans une cellule. Vos format qui sont différents 22/02/2022 ou 21/01. Ca va être une usine à gaz.

Je vais adopter la même forme de date : 21/01 ça sera plus simple.

Pensez-vous que c'est possible de gérer les multiples dates dans une cellule ? Car si une réunion a lieu plusieurs fois dans le mois je ne vois pas d'autres solutions que de l'insérer dans la même cellule... :😓
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Ce serait bien plus simple d'adopter un autre format comme celui ci :
  • Etape Test1
    • NomRéunion1 : 21/02 22/03
    • NomRéunion2 : 22/03 22/04 21/01, 24/01
  • Etape Test 2
    • NomRéunion4 : 18/02
car dans ce cas vous n'auriez plus à gérer les dates mais juste à recopier les cellules.
Mais cela s'éloigne de l'expression de votre besoin.
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonsoir,
Juste une simple maquette en PJ, avec :
VB:
Option Explicit
Sub Extraire()
    Dim datedébut, datefin, test1, test2, test3
    datedébut = [D9]: datefin = [D12]                               ' On récupère les dates
    test1 = [C6]: test2 = [D6]: test3 = [E6]                        ' On récupère les étapes
    Sheets("Données").Cells.ClearContents                           ' On efface la feuille Données
    If test1 = True Then ChercheEtape ("Test1")                     ' Si une étape est cocher on lance la macro de recherche
    If test2 = True Then ChercheEtape ("Test2")
    If test3 = True Then ChercheEtape ("Test3")
End Sub
Sub ChercheEtape(Test$)
    Dim DL%, L%, C%, Col%, Liste
    Application.ScreenUpdating = False                              ' On fige l'écran
    DL = 1 + Sheets("Données").[C65000].End(xlUp).Row               ' Première ligne vide
    Sheets("Données").Cells(DL, "B") = Test                         ' On met l'étape en colonne B
    DL = DL + 1                                                     ' Ligne suivante
    Set Liste = Sheets("Liste")
    For L = 3 To 18                                                 ' Pour toutes les lignes du tableau
        DL = 1 + Sheets("Données").[C65000].End(xlUp).Row
        If Liste.Cells(L, "D") = Test Then                          ' Si c'est une bonne étape
            Sheets("Données").Cells(DL, "C") = Liste.Cells(L, "B")  ' On inscrit la réunion
            Col = 4                                                 ' Première colonne date en D, donc 4
            For C = 5 To 16                                         ' On regarde toutes les colonnes
                If Liste.Cells(L, C) <> "" Then                     ' Si une date est inscrite ...
                    Sheets("Données").Cells(DL, Col) = Liste.Cells(L, C) ' On inscrit les dates
                    Col = Col + 1                                   ' Onn passe à la colonne suivante
                End If
            Next C
        End If
    Next L
End Sub
Pour les étapes j'ai opté pour mettre des cellules liées car c'est plus simple à lire. ( vous aurez remarqué que la lecture de vos checkbox ne marchaient pas dans votre code ), donc faisons simple dans un premier temps.
Et avec le format retenu, on n'a plus de problème d'analyse de dates, celles ci ne sont que des cellules recopiées :
1650908188401.png

En espérant vous avoir un petit peu avancé.
 

Pièces jointes

  • Parcourir un tableau.xlsm
    29.7 KB · Affichages: 2

Smveee

XLDnaute Nouveau
Bonsoir,
Juste une simple maquette en PJ, avec :
VB:
Option Explicit
Sub Extraire()
    Dim datedébut, datefin, test1, test2, test3
    datedébut = [D9]: datefin = [D12]                               ' On récupère les dates
    test1 = [C6]: test2 = [D6]: test3 = [E6]                        ' On récupère les étapes
    Sheets("Données").Cells.ClearContents                           ' On efface la feuille Données
    If test1 = True Then ChercheEtape ("Test1")                     ' Si une étape est cocher on lance la macro de recherche
    If test2 = True Then ChercheEtape ("Test2")
    If test3 = True Then ChercheEtape ("Test3")
End Sub
Sub ChercheEtape(Test$)
    Dim DL%, L%, C%, Col%, Liste
    Application.ScreenUpdating = False                              ' On fige l'écran
    DL = 1 + Sheets("Données").[C65000].End(xlUp).Row               ' Première ligne vide
    Sheets("Données").Cells(DL, "B") = Test                         ' On met l'étape en colonne B
    DL = DL + 1                                                     ' Ligne suivante
    Set Liste = Sheets("Liste")
    For L = 3 To 18                                                 ' Pour toutes les lignes du tableau
        DL = 1 + Sheets("Données").[C65000].End(xlUp).Row
        If Liste.Cells(L, "D") = Test Then                          ' Si c'est une bonne étape
            Sheets("Données").Cells(DL, "C") = Liste.Cells(L, "B")  ' On inscrit la réunion
            Col = 4                                                 ' Première colonne date en D, donc 4
            For C = 5 To 16                                         ' On regarde toutes les colonnes
                If Liste.Cells(L, C) <> "" Then                     ' Si une date est inscrite ...
                    Sheets("Données").Cells(DL, Col) = Liste.Cells(L, C) ' On inscrit les dates
                    Col = Col + 1                                   ' Onn passe à la colonne suivante
                End If
            Next C
        End If
    Next L
End Sub
Pour les étapes j'ai opté pour mettre des cellules liées car c'est plus simple à lire. ( vous aurez remarqué que la lecture de vos checkbox ne marchaient pas dans votre code ), donc faisons simple dans un premier temps.
Et avec le format retenu, on n'a plus de problème d'analyse de dates, celles ci ne sont que des cellules recopiées :
Regarde la pièce jointe 1137858
En espérant vous avoir un petit peu avancé.
Bonjour à vous,

Tout d'abord je vous remercie pour votre merveilleux travail.
J'aurais plusieurs questions :
  • Lorsque je choisis les dates 01/01/2022 au 31/01/2022 il me sort cela :
    1650958907935.png
  • Est-il possible d'avoir le format suivant s'il vous plaît après l'extraction :
    • Test1
    • 01/01/22 Réunion 1
    • 23/01,28/01 Réunion 3
    • Sachant que l'on peut mettre toutes les dates dans la même colonne étant donné que je vais copier/coller le contenu pour le coller dans un ppt ou word, qu'est ce que vous en pensez ?
Encore une fois, je vous remercie pour votre aide très précieuse.
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour,
Je n'ai pas traité ce genre de format avec plusieurs dates dans une cellule.
Qui plus est, pour XL ça ne représente pas des dates :
1650965020527.png

Il manque l'année pour qu'XL puisse comprendre. Ensuite il faudrait faire la séparation des dates s'il y en a plusieurs dans votre cellule.
Comme dit au post précédent : "Juste une simple maquette", c'était juste pour donner une piste autre que votre code initial qui posait problème.
Donc vous aurez des soucis avec le format de votre feuille Liste.
Une piste possible : si l'année est de facto 2022, si vous êtres dans la colonne E alors c'est Janvier. Il vous suffirait de mettre 21 pour qu'XL comprenne après traitement qu'il s'agit du 21 janvier 2022.
Quand au second point il s'agit juste d'une concaténation, une simple remise en forme.
 

Smveee

XLDnaute Nouveau
Bonjour,
Je n'ai pas traité ce genre de format avec plusieurs dates dans une cellule.
Qui plus est, pour XL ça ne représente pas des dates :
Regarde la pièce jointe 1137913
Il manque l'année pour qu'XL puisse comprendre. Ensuite il faudrait faire la séparation des dates s'il y en a plusieurs dans votre cellule.
Comme dit au post précédent : "Juste une simple maquette", c'était juste pour donner une piste autre que votre code initial qui posait problème.
Donc vous aurez des soucis avec le format de votre feuille Liste.
Une piste possible : si l'année est de facto 2022, si vous êtres dans la colonne E alors c'est Janvier. Il vous suffirait de mettre 21 pour qu'XL comprenne après traitement qu'il s'agit du 21 janvier 2022.
Quand au second point il s'agit juste d'une concaténation, une simple remise en forme.
Effectivement, toutes les dates sont pour l'année en cours donc 2022. C'est pour cela que je ne l'indique pas forcément toujours : mais effectivement il faut uniformiser le tout.
Concernant le second point, je pense savoir comment faire cela :)
 

Smveee

XLDnaute Nouveau
Bonjour,
J'ai essayé de faire ce que vous m'avez dit concernant l'année (car je le redis toutes ces dates concernant l'année 2022) : sans succès...
Je vais essayer de continuer de chercher (c'est mon 2nd projet en VBA).

Pour ce qui est du second point, je n'ai réussi à simplement mettre l'étape tout en haut. Lorsque j'essaie d'alterner la date et la réunion cela ne ressemble à rien :eek: (je ne suis pas très doué..)

Une autre question s'il vous plaît : à quoi correspond cette ligne "DL = 1 + Sheets("Données").[C65000].End(xlUp).Row" ? Plus généralement : à quoi sert la variable "DL" (à retourner à la ligne à chaque fois ?) ?

Voilà le code légérement modifié :
VB:
Option Explicit
Sub Extraire()
    Dim datedébut, datefin, test1, test2, test3
    datedébut = [D9]: datefin = [D12]                               ' On récupère les dates
    test1 = [C6]: test2 = [D6]: test3 = [E6]                        ' On récupère les étapes
    Sheets("Données").Cells.ClearContents                           ' On efface la feuille Données
    If test1 = True Then ChercheEtape ("Test1")                     ' Si une étape est cocher on lance la macro de recherche
    If test2 = True Then ChercheEtape ("Test2")
    If test3 = True Then ChercheEtape ("Test3")
End Sub
Sub ChercheEtape(Test$)
    Dim DL%, L%, C%, Col%, Liste
    Application.ScreenUpdating = False                              ' On fige l'écran
    DL = 1 + Sheets("Données").[C65000].End(xlUp).Row               ' Première ligne vide
    Sheets("Données").Cells(DL, "C") = Test                         ' On met l'étape en colonne B
    DL = DL + 1                                                     ' Ligne suivante
    Set Liste = Sheets("Liste")
    For L = 3 To 18                                                 ' Pour toutes les lignes du tableau
        DL = 1 + Sheets("Données").[C65000].End(xlUp).Row
        If Liste.Cells(L, "D") = Test Then                          ' Si c'est une bonne étape
            Sheets("Données").Cells(DL, "C") = Liste.Cells(L, "B")  ' On inscrit la réunion
            Col = 4                                                 ' Première colonne date en D, donc 4
            For C = 5 To 16                                         ' On regarde toutes les colonnes (de la 5eme à la 16eme)
                If Liste.Cells(L, C) <> "" Then                     ' Si une date est inscrite ...
                    Sheets("Données").Cells(DL, Col) = Liste.Cells(L, C) ' On inscrit les dates
                    Col = Col + 1                                   ' Onn passe à la colonne suivante
                End If
            Next C
        End If
    Next L
End Sub
 

Discussions similaires

Statistiques des forums

Discussions
311 720
Messages
2 081 885
Membres
101 830
dernier inscrit
sonia poulaert