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 :

Remplir un planning a partir d'une liste complexe


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 69
    Points : 34
    Points
    34
    Par défaut
    Bonjour à tous,
    Vous allez voir que je ne reviens pas pour rien.
    J’ai un fichier Excel composé de 40000 lignes.qui provient d’un batch d’un système externe et qui est mis à jour tous les 15 jours.
    On y trouve le code gestionnaire (plusieurs)
    Les codes stages (plusieurs)- Libelles stages
    Une Date début
    Une Date fin.
    Pour un meilleur suivi, il faudrait que je remplisse un planning (en ligne les jours de l’année , en colonne les gestionnaires)
    En fonction ds stages qui ont lieu chaque jour.
    No problemo, je l’ai fait.
    Mais il arrive que pour un jour plusieurs stages soient présents. Re no problemo, j’ai agrandi mes lignes d’autant que nécessaire.
    Mais je me rends compte qu’en fait dans un même cellule il existe plusieurs fois le même stage (il y a autant de stages que de stagiaires en fait, donc si un jour il y a dix stagiaires, je me retrouve avec une ligne composé de dix fois le même stage)
    Donc ce que j’aimerais faire c’est mettre un compteur .
    Dans ma cellule j’aurais : code stage-libellé stage, et compteur (qui indiquerait le nombre de fois que ce stage apparait pour ce jour).
    Mais là je ne vois pas comment faire.
    Puisque finalement tous mes stages ne sont que dans une seule cellule par jour .
    Si je crée des cellules ca me déséquilibre le tableau.
    Enfin bref, je cale.
    La panne, j’imagine qu’il faut que j’utilise des variables tableau, mais je ne sais pas faire.
    Ci-joint mon code actuel. Je suis peut être mal parti.

    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
    112
    113
    114
    115
    Sub Planning()
        Dim Lig As Long
        Dim Col As Long
        Dim Lig2 As Long
        Dim Col2 As Long
        Dim Stag As String
        Dim V As String
        Dim Ref As Date
        Dim Ref2 As Date
        Dim Ref3 As Date
        Dim C As Long
        Dim I As Long
        Dim Cod As String
        Dim Lig3 As Long
     
     
        Lig = 733
        Lig2 = 2
        Col2 = 32
     
       Application.ScreenUpdating = False
     
            Range("G733", "M1050").ClearContents
            Rows("733:1664").EntireRow.AutoFit
     
            Sheets("Base").Activate
            While Cells(Lig2, 1) <> ""
                If Trim(Cells(Lig2, 17)) <> "" Then GoTo Boucle
     
                If Trim(Cells(Lig2, Col2)) = "FAULSO" Then
                    GoTo Boucle
                End If
     
                If Trim(Cells(Lig2, Col2)) = "FURSTDA" Then
                    GoTo Boucle
                End If
     
                If Trim(Cells(Lig2, Col2)) = "HANTZOVI" Then
                    GoTo Boucle
                End If
     
                If Trim(Cells(Lig2, Col2)) = "HONOLDLA" Then
                    GoTo Boucle
                End If
     
                If Trim(Cells(Lig2, Col2)) = "JACQUEMR" Then
                    GoTo Boucle
                End If
     
                If Trim(Cells(Lig2, Col2)) = "MASTIOSO" Then
                    GoTo Boucle
                End If
     
                If Trim(Cells(Lig2, Col2)) = "VENANTIS" Then
                    GoTo Boucle
     
                End If
     
                If Trim(Cells(Lig2, Col2)) = "BURSTMA" Then
                    Col = 7
     
                End If
     
                If Trim(Cells(Lig2, Col2)) = "ENGELMD" Then
                    Col = 8
     
                End If
     
                If Trim(Cells(Lig2, Col2)) = "LIDOLFFA" Then
                    Col = 9
     
                End If
     
     
                If Trim(Cells(Lig2, Col2)) = "TEIXEIPA" Then
                    Col = 10
     
                End If
     
                 If Trim(Cells(Lig2, Col2)) = "VETTERDA" Then
                    Col = 11
     
                End If
     
     
                Stag = Cells(Lig2, 6)
                Cod = Cells(Lig2, 5)
                Ref = Cells(Lig2, 21)
                Ref2 = Cells(Lig2, 22)
                Sheets("Animation").Activate
                Lig3 = 733
                Ref3 = Ref
                While Cells(Lig3, 3) <= Ref2
                    If Cells(Lig3, 3) = Ref Then
                        Do
                            Cells(Lig3, Col) = Cells(Lig3, Col) & Chr(10) & Cod & "-" & Stag
                            Ref3 = Date + 1
                            Lig3 = Lig3 + 1
     
                        Loop Until Cells(Lig3, 3) > Ref2
     
                    End If
     
     
                    Lig3 = Lig3 + 1
     
                Wend
    Boucle:
                Sheets("Base").Activate
                Lig2 = Lig2 + 1
            Wend
     
            Sheets("Animation").Activate
            Application.ScreenUpdating = True
    End Sub
    Le goto boucles correspondent aux gestionnaires que je n'incluent pas dans le planning.
    J'ai deux onglets.
    Un base avec mon fichier de données.
    Un Animation : ou figure mon planning.

    Voilou, j'espère avoir été assez clair. Mais je peux préciser si nécessaire. Et merci à vous.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    752
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 752
    Points : 832
    Points
    832
    Par défaut
    Je ne comprends pas ce que fait ton code: y aurait-il moyen d'avoir des commentaires dedans?

    Sinon personnellement, ton système de Goto ne me plaît pas: il serait préférable de modifier un booleen puis de tester ce booleen pour exécuter le code approprié.

    Dernière chose: ça c'est toi qui vois, mais un select case sur "Trim(Cells(Lig2, Col2))" serait à mon avis plus approprié que ta batterie de If.

    Pour ton compteur, si tu veux te passer des tableaux il faut que tu analyses le contenu de ta cellule (via manipulation de chaînes) pour compter le nombre d'éléments identiques avant insertion.

    Ceci dit, travailler avec un tableau est possible, mais il faudrait que ce soit soit un tableau de type structuré, soit un tableau d'objets (codés via un module de classe).

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 69
    Points : 34
    Points
    34
    Par défaut
    Voici le code avec les commentaires :
    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
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    Sub Planning()
        Dim Lig As Long
        Dim Col As Long
        Dim Lig2 As Long
        Dim Col2 As Long
        Dim Stag As String
        Dim V As String
        Dim Ref As Date
        Dim Ref2 As Date
        Dim Ref3 As Date
        Dim C As Long
        Dim I As Long
        Dim Cod As String
        Dim Lig3 As Long
     
     
        Lig = 733
        Lig2 = 2
        Col2 = 32
     
       Application.ScreenUpdating = False
            ' Vidage du planning
            Range("G733", "M1050").ClearContents
            Rows("733:1664").EntireRow.AutoFit
     
     
            Sheets("Base").Activate
            ' Selection de la colonne cible en fonction du gestionnaire
            While Cells(Lig2, 1) <> ""
                ' si quelque chose dans cette cellule(donc une absence) on zappe cette ligne
                If Trim(Cells(Lig2, 17)) <> "" Then GoTo Boucle
     
                ' Si ces Gestionaires là, alors on ne fait rien on passe à la ligne suivante
     
                If Trim(Cells(Lig2, Col2)) = "FAULSO" Then
                    GoTo Boucle
                End If
     
                If Trim(Cells(Lig2, Col2)) = "FURSTDA" Then
                    GoTo Boucle
                End If
     
                If Trim(Cells(Lig2, Col2)) = "HANTZOVI" Then
                    GoTo Boucle
                End If
     
                If Trim(Cells(Lig2, Col2)) = "HONOLDLA" Then
                    GoTo Boucle
                End If
     
                If Trim(Cells(Lig2, Col2)) = "JACQUEMR" Then
                    GoTo Boucle
                End If
     
                If Trim(Cells(Lig2, Col2)) = "MASTIOSO" Then
                    GoTo Boucle
                End If
     
                If Trim(Cells(Lig2, Col2)) = "VENANTIS" Then
                    GoTo Boucle
     
                End If
     
                ' Selection de la colonne cible (ou sera inscrit les dates de formation) en fonction du gestionnaire
                If Trim(Cells(Lig2, Col2)) = "BURSTMA" Then
                    Col = 7
     
                End If
     
                If Trim(Cells(Lig2, Col2)) = "ENGELMD" Then
                    Col = 8
     
                End If
     
                If Trim(Cells(Lig2, Col2)) = "LIDOLFFA" Then
                    Col = 9
     
                End If
     
     
                If Trim(Cells(Lig2, Col2)) = "TEIXEIPA" Then
                    Col = 10
     
                End If
     
                 If Trim(Cells(Lig2, Col2)) = "VETTERDA" Then
                    Col = 11
     
                End If
     
                ' Récupération dans le fichie rsource des données que je vais inscrire dans la colonne cible
                ' libelle stage
                Stag = Cells(Lig2, 6)
                ' Code stage
                Cod = Cells(Lig2, 5)
                ' Date début
                Ref = Cells(Lig2, 21)
                ' Date fin
                Ref2 = Cells(Lig2, 22)
                ' On se place dans la feuille cible
                Sheets("Animation").Activate
                ' en début de fichier (ici ligne733)
                Lig3 = 733
                ' Ref3 egal date debut
                Ref3 = Ref
                ' Il y a peut etre quelque chose a faire tant que la date du planning est inf ou egal a la date fin
                While Cells(Lig3, 3) <= Ref2
                ' Si ligne egal date debut stage
                    If Cells(Lig3, 3) = Ref Then
                        Do
                        ' Alors on inscrit le code stage et le libelle stage dans la cellule
                            Cells(Lig3, Col) = Cells(Lig3, Col) & Chr(10) & Cod & "-" & Stag
                            ' on ajoute un jour à ref3
                            Ref3 = Date + 1
                            ' On descent d'une ligne sur le planning
                            Lig3 = Lig3 + 1
                            ' On continue d'inscrire ce stage dans les jours suivants du planning tant que jour du planning est plus petit ou egal a date fin(Ref2)
                        Loop Until Cells(Lig3, 3) > Ref2
     
                    End If
     
     
                    Lig3 = Lig3 + 1
     
                Wend
                ' On passe à la ligne suivante dans le fichier source
    Boucle:
                Sheets("Base").Activate
                Lig2 = Lig2 + 1
            Wend
     
            Sheets("Animation").Activate
            Application.ScreenUpdating = True
    End Sub
    J'aurais effectivment du utiliser des select case plutot que des if, je le ferais surement lorsque j'ameliorerais le code.
    Pour la boucle, je usi allé au plus simple, enfin pour moi, il serai tinteressant que je test la condition Booleen.

    Pour le coeur de mon problème, une manip des chaibnes de caracteres m'irait tres bien , mais comment faire ?
    Je ne trouve pas la syntax sur le web (en tout cas pas pour mon cas particulier) sachant que je dois supprimer le stage et le compteur pour remplacer avec le code stage et compteur mis a jour.
    A moins que je ne remplace que le compteur finalement.
    pas très simple tout ça.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    752
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 752
    Points : 832
    Points
    832
    Par défaut
    Tu as dans l'aide en ligne un index qui s'appelle "Résumé des mots clés de manipulation de chaînes", où tu trouveras toute une batterie de fonctions pour ça.

    Petit indice: tu devras faire une boucle incrémentant un compteur tant qu'une variable tampon contiendra le texte recherché. Cette variable contiendra initialement le contenu de ta cellule, et tu la raccourciras jusqu'à ce qu'il n'y ait plus rien de potable dedans.

    C'est pas très évident à comprendre ce que je viens de t'expliquer, mais cela reste une solution envisageable. N'oublie pas qu'il te reste encore la solution utilisant un tableau en mémoire, et que celle-ci aura un fonctionnement radicalement différent.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 288
    Points : 364
    Points
    364
    Par défaut
    Salut,
    je pense que la fonction Instr() dans une condition IF peut être suffisante et éviter des boucles sur les caractères. Mais pour ça, il faut absolument qu'aucun libellé de stage ne puisse constituer une partie du libellé d'un autre.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    752
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 752
    Points : 832
    Points
    832
    Par défaut
    Citation Envoyé par neupont Voir le message
    Salut,
    je pense que la fonction Instr() dans une condition IF peut être suffisante et éviter des boucles sur les caractères. Mais pour ça, il faut absolument qu'aucun libellé de stage ne puisse constituer une partie du libellé d'un autre.
    Ce n'est pas nécessaire dans la mesure où le compteur est mis à la fin de la ligne, ou qu'une quelconque convention de notation est utilisée.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 69
    Points : 34
    Points
    34
    Par défaut
    Bon avec la manip des chaînes et grâce à internet j'ai reussis.
    Je vais dans la cellule, je regarde si le code que je veux y mettre exsite déjà.
    Si non, il met le code, le libelle, et le compteur à 01.
    S'il existe déjà :
    Il regarde quand débute le code dans la cellule (c'est mon point départ).
    Il se décalle pour arriver jusqu'au compteur qu'il isole et incrémente de 1 et le remplace.
    C'est pas beau ça ?
    On peut sans doute faire mieux, mais suis assez content, pour ceux que ça interesserait le code suit.
    Merci à tous.

    Sinon je pense que pour gagner du temps (traitement assez long) j'aurais du utiliser les variables en definissant un tableau mais m'y connais pas du tout et faudrait que je me plonge dans cette partie.

    A bientôt pour une nouvelle énigme
    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
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    Sub Planning()
        Dim Lig As Long
        Dim Col As Long
        Dim Lig2 As Long
        Dim Col2 As Long
        Dim Stag As String
        Dim V As String
        Dim Ref As Date
        Dim Ref2 As Date
        Dim Ref3 As Date
        Dim C As Long
        Dim I As Long
        Dim Cod As String
        Dim Lig3 As Long
        Dim Lig4 As Long
        Dim LongueurCod As Long
        Dim LongueurStag As Long
        Dim Cible As String
        Dim Debut As Long
        Dim Longueur As Long
        Dim Compteur As Long
        Dim Compteur2 As Long
        Dim CompteurTxt As String
     
        Lig = 3
        Lig2 = 2
        Col2 = 32
     
       Application.ScreenUpdating = False
            ' Vidage du planning
            Range("G3", "M1050").ClearContents
            Rows("3:1664").EntireRow.AutoFit
     
            Workbooks.Open "\\Uf11-001\EIFORMAFIN\Gestion financière - formation (kieffesa)\Etudes\Bases données\00-CDECDFC (avec modif PIDGES).xls"
            Windows("00-CDECDFC (avec modif PIDGES).xls").Activate
            'Workbooks(1).ActiveSheet.Cells(1, 2).Formula = Workbooks(2).ActiveSheet.Cells(1, 2).Formula
     
     
            ' Sheets("Base").Activate
            ' Selection de la colonne cible en fonction du gestionnaire
            While Cells(Lig2, 1) <> ""
                ' si quelque chose dans cette cellule(donc une absence) on zappe cette ligne
               If Trim(Cells(Lig2, 17)) <> "" Then GoTo Boucle
     
               If Trim(Cells(Lig2, 5)) >= "M1000" And Trim(Cells(Lig2, 5)) <= "M1050" Then GoTo Boucle
     
                Select Case Trim(Cells(Lig2, 29))
                    Case "FAULSO"
                        Col = 7
                    Case "FURSTDA"
                        Col = 8
                    Case "HANTZOVI"
                        Col = 9
                    Case "HONOLDLA"
                        Col = 10
                    Case "JACQUEMR"
                        Col = 11
                    Case "MASTIOSO"
                        Col = 12
                    Case "VENANTIS"
                        Col = 13
     
                    Case Else
                        GoTo Boucle
     
                End Select
     
                ' Récupération dans le fichier source des données que je vais inscrire dans la colonne cible
                ' libelle stage
                Stag = Trim(Cells(Lig2, 6))
                ' Code stage
                Cod = Cells(Lig2, 7)
                ' Date début
                Ref = Cells(Lig2, 18)
                ' Date fin
                Ref2 = Cells(Lig2, 19)
                ' On se place dans la feuille cible
                Windows("Planning Logistique Réseau.xls").Activate
                Sheets("Planning").Activate
                ' en début de fichier (ici ligne733)
                Lig3 = 3
                ' Ref3 egal date debut
                Ref3 = Ref
                ' Il y a peut etre quelque chose a faire tant que la date du planning est inf ou egal a la date fin
                While Cells(Lig3, 3) <= Ref2
                    'definition de la cible
     
                ' Si ligne egal date debut stage
                    If Cells(Lig3, 3) = Ref Then
                        Do
                        ' Si le stage est déjà dans la cellule
     
                        Cible = Cells(Lig3, Col)
                        Debut = InStr(Cible, Cod)
                        Select Case Debut
     
                            Case Is <> 0
                                LongueurCod = Len(Cod)
                                LongueurStag = Len(Stag)
                                Longueur = Debut + LongueurCod + LongueurStag + 4
                                Compteur = Mid(Cible, Longueur, 2)
                                Compteur2 = Compteur + 1
                                CompteurTxt = Right("00" & Compteur2, 2)
                                Mid(Cible, Longueur, 2) = CompteurTxt
                                Cells(Lig3, Col) = Cible
                            Case Else
     
                        ' Alors on inscrit le code stage et le libelle stage dans la cellule
                                Cells(Lig3, Col) = Cells(Lig3, Col) & Chr(10) & Cod & "-" & Stag & " : " & "01"
     
                        End Select
                            ' on ajoute un jour à ref3
                            Ref3 = Date + 1
                            ' On descent d'une ligne sur le planning
                            Lig4 = Lig3 + 1
                            If Cells(Lig4, 3) > Ref2 Then Exit Do
                            Lig3 = Lig3 + 1
                            'If Cells(Lig4, 3) <= Ref2 Then Lig3 = Lig4
                            ' On continue d'inscrire ce stage dans les jours suivants du planning tant que jour du planning est plus petit ou egal a date fin(Ref2)
                        Loop Until Cells(Lig3, 3) > Ref2
     
     
                    End If
     
     
                    Lig3 = Lig3 + 1
     
                Wend
                ' On passe à la ligne suivante dans le fichier source
    Boucle:
                Windows("00-CDECDFC (avec modif PIDGES).xls").Activate
                'Sheets("Base").Activate
                Lig2 = Lig2 + 1
            Wend
     
            Windows("00-CDECDFC (avec modif PIDGES).xls").Close
            Windows("Planning Logistique Réseau.xls").Activate
            Sheets("Planning").Activate
     
            Application.ScreenUpdating = True
    End Sub

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

Discussions similaires

  1. [XL-2003] Créer un planning Gantt à partir d'une liste de taches
    Par babouu dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 09/07/2012, 08h32
  2. remplir des champs a partir d'une liste
    Par piotrowski-s dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 05/07/2012, 15h14
  3. Réponses: 3
    Dernier message: 14/07/2009, 15h10
  4. Réponses: 3
    Dernier message: 03/05/2009, 09h56
  5. Réponses: 19
    Dernier message: 27/11/2007, 23h54

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