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 :

Concaténation valeurs en fonction de la date


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Homme Profil pro
    autre
    Inscrit en
    Juin 2017
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Juin 2017
    Messages : 261
    Points : 98
    Points
    98
    Par défaut Concaténation valeurs en fonction de la date
    Bonjour le forum!

    Je dispose d'un fichier de suivi des formations du personnel (389 salariés * 60 formations).
    Je souhaite réaliser un plan de formation "automatique" dans une autre feuille.
    Mon objectif: avoir un visuel immédiat des formations à recycler par mois.

    Voici ma base:

    FORMATIONS.xlsm

    Voici ou j'en suis dans mes recherches:

    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
    Sub Planformation()
        Dim DateDeb As Date
        Dim DateFin As Date
        Dim LaDate As Date
        Dim Res As Variant
     
        DateDeb = Sheets("PLAN FORMATION").Cells(3, 5)
        DateFin = Sheets("PLAN FORMATION").Cells(3, 6)
     
        nbl = Sheets("SUIVI FORMATIONS").Range("a1").End(xlDown).Row
     
        For I = 5 To nbl
            LaDate = Sheets("SUIVI FORMATIONS").Cells(I, 11)
     
            If LaDate < DateFin And LaDate > DateDeb Then
                'Res = Res + Int(Sheets(2).Cells(i, 2))
                Res = Res & Chr(10) & Cells(I, 1)
            End If
     
        Next I
     
                Sheets("SUIVI FORMATIONS").Cells(4, 5) = Res
    End Sub
    dans les faits, je souhaiterais que mon code alimente le tableau PLAN FORMATION en répartissant les noms des salariés concernés aux mois d'échéances de l'année à venir depuis le tableau SUIVI FORMATION.

    Par exemple:

    - Monsieur DUPOND a son CACES chariot élévateur catégories 3 et 5 qui atteint sa limite de validité le 29 mai 2018 - informations perdues quelque part dans SUIVI FORMATIONS.
    - Monsieur HADDOCK a le même CACES qui atteint sa limite de validité le 10 juin 2018

    A l'activation du programme, je voudrais que :

    -dans la case réunissant CACES Cat 3 et MAI 2018 le nom DUPOND apparaisse
    -dans la case réunissant CACES Cat 5 et MAI 2018 le nom DUPOND apparaisse
    -dans la case réunissant CACES Cat 5 et JUIN 2018 le nom HADDOCK apparaisse

    le cas échéant, si plusieurs personnes doivent repasser leur CACES le même mois, les noms apparaissent de façon concaténée...

    Comment parvenir à ce résultat? suis je sur la bonne voie?

    Merci!

  2. #2
    Membre extrêmement actif Avatar de mjpmjp
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    1 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2012
    Messages : 1 133
    Points : 1 441
    Points
    1 441
    Par défaut
    bonjour,
    le problème posé : basculer une liste de date (suivi formation) vers (plan formation)

    étape 1 : créer la liste de date (suivi formation) ET la rendre utilisable
    il y a, bien sur la possibilité de trier la colonne 11

    mais j'utiliserais, perso, un tableau "année"...TabAnnée(366),
    avec un calcul du numéro de jour --> 1° janvier --> jour 1 --> TabAnnée(1)... trop facile
    pour les doubles , (plusieurs nom pour même jour) : TabAnnée(1) = TabAnnée(1) & ";" & nom2
    utiliser "Split()" pour "séparer" les noms
    pour test si plusieurs nom : instr() avec ";"...par exemple
    dans TabAnnée(1), on peu noter le nom , mais perso, je noterais le numéro de ligne de l'onglet (suivi..)

    étape 2 : basculer vers "plan de formation"
    2 possibilités :
    A) de TabAnnée vers onglet formation : on vide (la liste suivi)
    B) de onglet formation vers TabAnnée : on bouche (un trou dans formation)

    @+JP
    Caractéristiques (WEB) phpMyAdmin 4-74 , PHP 5-631 , Apache 2-427 , MySQL 5-719
    Présentation NAS DS-3615xs + 20Go , DSM 6.1.6-15266 Up1 , 12 * WD 4To WD4000F9YZ (10 raid 6+ )+(2 raid 1+) , LinkSys comutateur-switch lgs528p-eu , Onduleur UPS 720W Power Boxx Lcd (4*UPS + 4*MOD)
    Mes contributions (EXCEL) Form GRAPHIQUE: Gestion des boutons , Liste Onglet dynamique...GESTION de FILM

  3. #3
    Membre régulier
    Homme Profil pro
    autre
    Inscrit en
    Juin 2017
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Juin 2017
    Messages : 261
    Points : 98
    Points
    98
    Par défaut
    Bonjour mjpmjp,

    Tes explications sont très claires, je te remercie.
    Mon niveau de maîtrise ne m'autorise cependant pas à transformer l'essai!

    Associer un calcul de référence de jour me semble intéressant, mais la mise en application obscure!
    Pour ce qui est de la référence par ligne et non par nom... Chaud! la liste des salariés est mouvante! Triée par ordre alphabétique, elle peut s'incrémenter ou se décrémenter chaque semaine!

    J'ai commencé à regarder une piste du style :

    "Pour les formations intitulées en ligne 4 page1,
    Si la date de recyclage est l'an prochain, alors:
    - afficher le nom du salarié figurant en colonne A dans la cellule
    à l'intersection entre la ligne de cette formation page2 ET la colonne du mois correspondant à cette date

    Si il y en a plusieurs, alors:
    - concaténer les noms"

    Mais je galère à la mise en œuvre...

  4. #4
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    Bonjour,

    Tu dis que t'aimerais avoir les info de l'année à venir, alors pourquoi ne pas commencer par un tri sur l'année +1 des dates d'échéances.
    Tu pourras ensuite travailler sur cette base pour faire ton tableau de l'année à venir.

    PS : je n'ouvre pas les fichiers (d'autant plus vrai au 1er post - cf règles du forum - et en plus contenant des macros) , donc je n'ai pas regardé
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

  5. #5
    Membre régulier
    Homme Profil pro
    autre
    Inscrit en
    Juin 2017
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Juin 2017
    Messages : 261
    Points : 98
    Points
    98
    Par défaut
    Bonjour RyuAutodidacte,

    Tu parles de démarrer ma fonction par la "collecte" des dates à N+1?

    Je songeais à quelque chose du genre "Pour toutes les dates à venir en N+1" effectivement.

    Je ne suis malheureusement pas autonome dans la rédaction VBA , je galère de façon empirique avec les fragments glanés sur la toile et la bonne volonté de passionnés qui détectent les erreurs fatales!

    en 4 mots comme en 100: comment intégrer cette "collecte"?

    Merci!

  6. #6
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    sans connaitre le vba en utilisant l'enregistreur de macro pour le tri (en exemple)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub Macro1()
        Range("Table1[[#Headers],[Colonne2]]").Select
        ActiveSheet.ListObjects("Table1").Range.AutoFilter Field:=2, Operator:= _
            xlFilterValues, Criteria2:=Array(0, DateSerial(Year(Date) + 1, Month(Date), 1))
    End Sub
    et en utilisant la faq pour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DateSerial(Year(Date) + 1, Month(Date), 1)
    http://mhubiche.developpez.com/vba/f...ions/datetime/

    Edit : Il y a aussi les filtres avancés qui peut t'intéresser
    ça permet l'export vers une autre feuille si besoin - à voir
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

  7. #7
    Membre régulier
    Homme Profil pro
    autre
    Inscrit en
    Juin 2017
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Juin 2017
    Messages : 261
    Points : 98
    Points
    98
    Par défaut
    Rebonjour,


    Suite à tes pistes de recherche, voici où j'en suis:

    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
    Sub PlandeFormation()
    Dim Annee As Integer
    Dim Cell As Range
     
    Annee = InputBox("Saisir l'année cible", "SAISIE DE L'ANNEE", 2017)
     
    'Sélection du tableau actif
     
    Création d'un tableau regroupant les dates
    Sheets("SUIVI FORMATIONS").Select
    Range("J5").Select
        Set tbl = ActiveCell.CurrentRegion
    tbl.Offset(4, 0).Resize(tbl.Rows.Count - 1, tbl.Columns.Count).Select
     
    'Tri des dates valeurs en ordre décroissant
    Selection.Sort Key1:=Range("J5"), Order1:=xlDescending, Header:=xlGuess, _
    OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
    DataOption1:=xlSortNormal
     
    Plage = Range("J5", Range("J5").EntireColumn.Find(What:="*", _
                SearchDirection:=xlPrevious)).Select
     
     
    For Each Cell In Selection  
         If Year(Cell) = Annee Then
        'Copier les lignes correspondantes dans "Feuil1"
        Cell.EntireRow.Copy Sheets("Feuil1").Cells(Sheets("Feuil1"). _
        Range("A65536").End(xlUp).Row + 1, 1)
        End If
    Next Cell 'Recherche sur les cellules suivantes
     
    Application.CutCopyMode = False 'Annule mode copie
    End Sub
    j'ai une erreur de type "Incompatibilité de Type" à la ligne :

    "If Year(Cell) = Annee Then"

    peut être que les cellules vides provoquent cette erreur? n'y a-t-il pas moyen d'arrêter le code à la dernière ligne du tableau?

    D'autre part, je souhaiterai ne récupérer que les NOMS (Colonne A de la feuille "SUIVI FORMATION")
    Qu'il s'ajoutent dans la cellule CIBLE (intersection entre ligne FORMATION et colonne MOIS).

    Je ne parviens pas à définir cette cellule CIBLE...

    j'imagine " pour chaque DATE de la sélection, transférer le NOM correspondant au MOIS prévu ... DATE SUIVANTE""

  8. #8
    Membre régulier
    Homme Profil pro
    autre
    Inscrit en
    Juin 2017
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Juin 2017
    Messages : 261
    Points : 98
    Points
    98
    Par défaut
    J'ai trouvé et adapté une approche différente, mais qui ne me satisfait pas encore:

    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
    Option Explicit
    '-----
    Sub TransfertFormation()
    Dim dd As Date, Lig As Byte, Nbre As Byte, Transfert
     
    Application.ScreenUpdating = False
     
    dd = Sheets("SUIVI FORMATIONS").Range("A1")
    With Sheets("SUIVI FORMATIONS")
        Nbre = Application.CountIf(.Columns("J"), dd)
        If Nbre = 0 Then: GoTo vide
        Lig = .Columns("J").Find(dd, Range("J5")).Row
        Transfert = .Range(.Cells(Lig, "J"), .Cells(Lig + Nbre - 1, "A"))
    End With
     
    With Sheets("Feuil1")
        .Range("A2:X50").ClearContents
        .Range("A2").Resize(Nbre, 10) = Transfert
        .Activate
    End With
    Exit Sub
    vide:
    MsgBox "la date " & dd & " est inconnue dans la liste", vbCritical
    End Sub
    Cette fonction est opérationnelle, mais nécessite de rentrer des dates entières et spécifiques alors que je souhaite sélectionner les années civiles uniquement!

    D'autre part, je n'ai pas réussi à concaténer les noms dans une unique cellule...

    Des suggestions?

  9. #9
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    Bonjour,

    Désolé pas trop de temps en ce moment.
    J'ai regardé vite fait le fichier sur un ordi dédier (pour éviter tout pbm),
    Je trouve que l'onglet Plan formation est mieux fais niveau agencement,
    Je me demande, si c'est possible, de reprendre cette onglet pour remplacer suivi de formation ce qui nous donnerai les noms prénom à l'horizontale à partir E2 et E3 ainsi de suite en ligne 2 et 3.
    On garderai l'onglet Plan formation tél qu'il est, ce qui permettrait de simplifier le code pour la date butoir par catégorie.

    Qu'en pensez-vous ?
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

  10. #10
    Membre régulier
    Homme Profil pro
    autre
    Inscrit en
    Juin 2017
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Juin 2017
    Messages : 261
    Points : 98
    Points
    98
    Par défaut
    Bonjour RyuAutodidacte,

    Sur la forme, pas de problème si cela nous facilite la vie!

    Quant au fond... galère: la liste des salariés est importée depuis un logiciel RH qui me la présente sous cette forme (les agents en colonnes).
    De plus cet import est lié au suivi des formations (l'extrait que vous avez pur consulter) mais également au suivi des visites médicales, des divers tutorat, animations et entretiens individuels, du suivi des arrêts de travail, des activités pratiquées...

    Je veux bien modifier le tableau de manière à étudier les fonctionnalités que je souhaite atteindre... quitte à ce que je trouve une formule par la suite pour remettre la mise en page d'origine...

    FORMATIONS.xlsm

  11. #11
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    On va rester plutôt sur le fond étant donné l'origine de la source, et mieux vaut éviter d'aller dans un sens pour revenir à la mise en forme initiale.

    le problème ici est qu'il faut reconnaitre les "recyclage"/Catégorie et les faire correspondre correctement, chose pas évidente :
    CERTIFICAT D'APTITUDE A LA CONDUITE EN SECURITE=>Chariot Elévateur=>Catégorie 1=Recyclage
    CERTIFICAT D'APTITUDE A LA CONDUITE EN SECURITE=>Chariot Elévateur=>Catégorie 2=Recyclage

    CERTIFICAT D'APTITUDE A LA CONDUITE EN SECURITE=>Plateforme Elévatrice Mobile de Personnes=>Catégorie 1a=Recyclage
    CERTIFICAT D'APTITUDE A LA CONDUITE EN SECURITE=>Plateforme Elévatrice Mobile de Personnes=>Catégorie 1b=Recyclage

    etc …

    je pense qu'il faut travailler par catégorie afin de faire les correspondances dans plans de formation :

    1 - Pour chaque catégorie (donc boucle sur la catégorie en cours, puis la suivante …) on repère année + 1 et le mois
    puis on concatène les noms par rapport au mois
    PS : par contre il faut expliquer comment marche le principe des mois dans plan de formation (début et fin de mois ? pourquoi ? qui va où?)
    2 - on colle le résultat sur la ligne correspondante à la catégorie, ex. :
    CERTIFICAT D'APTITUDE A LA CONDUITE EN SECURITE=>Chariot Elévateur=>Catégorie 1=Recyclage

    Ainsi de suite …

    je pense que c'est le plus simple de le faire dans cette logique

    Par contre ne pas hésiter a donner un max de détails avec tenants et aboutissant et résultats final afin de savoir dans quel direction tourner le code.
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

  12. #12
    Membre régulier
    Homme Profil pro
    autre
    Inscrit en
    Juin 2017
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Juin 2017
    Messages : 261
    Points : 98
    Points
    98
    Par défaut
    le problème ici est qu'il faut reconnaitre les "recyclage"/Catégorie et les faire correspondre correctement, chose pas évidente
    Chaque formation a une durée de validité différente, donc une périodicité de recyclage différente! Par exemple:

    CACES: 5 ans
    Habilitation électrique: 3 ans
    Secourisme : 2 ans

    d'où la nécessité, dans le suivi, d'avoir 2 dates (initiale et recyclage)... pour être rigoureux, je devrais officiellement utiliser:

    Initiale ou Initiation: 1ère formation pour cette personne sur une catégorie
    Recyclage ou Mise niveau ou Actualisation: obligation de repasser un module renouvelant l'habilitation de cette personne selon la formation

    Restons simples: initiale permet de relever la DERNIERE DATE VALIDE et recyclage LA PROCHAINE A PLANIFIER!

    c'est de cette dernière dont nous avons besoin pour établir le plan de formation annuel (tous les recyclages à venir en 2018 sur mon PLAN DE FORMATION - puis 2019 l'an prochain et ainsi de suite...)

    1 - Pour chaque catégorie (donc boucle sur la catégorie en cours, puis la suivante …) on repère année + 1 et le mois
    puis on concatène les noms par rapport au mois
    Tout a fait d'accord

    PS : par contre il faut expliquer comment marche le principe des mois dans plan de formation (début et fin de mois ? pourquoi ? qui va où?)
    oops: reliquat d'une tentative de codification précédente (si DATE RECYCLAGE inclue dans [01/01/2018-31/01/2018] alors ajouter le nom du salarié). Idéalement nous n'en tiendrons plus compte!

    2 - on colle le résultat sur la ligne correspondante à la catégorie, ex. :
    CERTIFICAT D'APTITUDE A LA CONDUITE EN SECURITE=>Chariot Elévateur=>Catégorie 1=Recyclage
    Tout à fait!

    En résumé littéral je vise une macro fonctionnant ainsi:

    "recherche dans le tableau SUIVI FORMATION, pour chaque formation, les agents devant renouveler leur habilitation à n+1
    intégrer les noms de ces agents dans le tableau PLAN DE FORMATION, au mois prévu pour leur recyclage "

    Ainsi, je pourrais avoir un visuel instantané des formations à venir et n'aurai plus qu'à les planifier dans les emplois du temps des salariés.

    J'espère avoir été clair et complet?

  13. #13
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    juste en précision :
    - 2-3 exemples de résultats venant de l'onglet suivi vers plan de formation, par rapport à cette explication :
    Chaque formation a une durée de validité différente, donc une périodicité de recyclage différente! Par exemple:

    CACES: 5 ans
    Habilitation électrique: 3 ans
    Secourisme : 2 ans

    d'où la nécessité, dans le suivi, d'avoir 2 dates (initiale et recyclage)... pour être rigoureux, je devrais officiellement utiliser:

    Initiale ou Initiation: 1ère formation pour cette personne sur une catégorie
    Recyclage ou Mise niveau ou Actualisation: obligation de repasser un module renouvelant l'habilitation de cette personne selon la formation

    Restons simples: initiale permet de relever la DERNIERE DATE VALIDE et recyclage LA PROCHAINE A PLANIFIER!

    c'est de cette dernière dont nous avons besoin pour établir le plan de formation annuel (tous les recyclages à venir en 2018 sur mon PLAN DE FORMATION - puis 2019 l'an prochain et ainsi de suite...)
    possible avec copie d'écran avec les colonnes et lignes incriminées dans suivi et plan pour visualiser le résultat
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

  14. #14
    Membre régulier
    Homme Profil pro
    autre
    Inscrit en
    Juin 2017
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Juin 2017
    Messages : 261
    Points : 98
    Points
    98
    Par défaut
    Exemple Fichier de suivi:

    ici 2 salariés ont suivi une formation CACES Chariot élévateur Catégorie 3 le 18 mars 2013

    Nom : visuel 1.png
Affichages : 893
Taille : 21,2 Ko

    Exemple Résultat souhaité:

    là ces 2 salariés ont leur formation CACES Chariot élévateur Catégorie 3 qui arrive en mars 2018 il faut que leurs noms apparaissent dans la colonne du mois de MARS en face de la ligne relative à leur formation à recycler!

    Nom : visuel 2.png
Affichages : 962
Taille : 30,6 Ko

    AH et je viens de comprendre une seconde interprétation de ta remarque sur la différence entre Initial et recyclage:

    - dans le tableau de suivi, la date de recyclage est calculée d'après la date saisie en initiale

    Lorsque la date de formation recyclage sera passée, cette date prendra la place de 'l'initiale et le calcule recyclage sera de nouveau effectué! Mais c'est une autre histoire...

  15. #15
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    Bonjour,

    Voilà un code à essayé - dans Plan Formation :
    - A1 se fait en auto
    - j'ai mis les Noms et Prénoms (Si 2 noms pareils faut les distinguer)
    Code => Voilà : 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
    Sub PlanForma()
    Dim AnneePlus As Double, PF, DL_SF&, Nom, SF, i&, j&
     
        Do
            If AnneePlus <> 0 Then MsgBox "Merci de mettre un entier"
            AnneePlus = Application.InputBox("Ajouter un nombre d'année(s) supplémentaire(s)" & vbCr & "sur l'année en cours", "ANNÉE SUPPLÉMENTAIRE VOULU", Type:=1)
        Loop Until AnneePlus = Fix(AnneePlus) Or AnneePlus = False
        If AnneePlus = False Then Exit Sub
     
        With Sheets("PLAN FORMATION")
        Application.ScreenUpdating = False
            .Range("A1").Value = "PLAN DE FORMATION " & Year(Date) + AnneePlus
     
            With .Range("E4:P59")
                .Value = ""
                PF = .Value
            End With
     
            With Sheets("SUIVI FORMATIONS")
                DL_SF = .Cells(Rows.Count, 1).End(xlUp).Row
                Nom = .Range("A5:B" & DL_SF).Value
                SF = .Range("F5:BI" & DL_SF).Value
     
                For j = 2 To UBound(SF, 2) Step 2
                    For i = 1 To UBound(SF)
                        If SF(i, j) > "" Then
                            If Year(SF(i, j)) = Year(Date) + AnneePlus Then
                              PF(j, Month(SF(i, j))) = IIf(PF(j, Month(SF(i, j))) = "", Nom(i, 1) & " - " & Nom(i, 2), PF(j, Month(SF(i, j))) & vbCr & Nom(i, 1) & " - " & Nom(i, 2))
                            End If
                        End If
                    Next
                Next
            End With
     
            With .Range("E4:P59")
                .Value = PF
                .Rows.AutoFit
            End With
     
        Application.ScreenUpdating = True
        End With
    End Sub
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

  16. #16
    Membre régulier
    Homme Profil pro
    autre
    Inscrit en
    Juin 2017
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Juin 2017
    Messages : 261
    Points : 98
    Points
    98
    Par défaut
    De toute Beauté!

    Mille Merci!! Je ne connais pas 80% des fonctions proposées, je ne serai pas arrivé à un tel résultat seul!

    Je vais prendre le temps d'analyser les fragments de manière à comprendre leurs mécanisme pour plus tard...

    Question mise en page:

    - le visuel "surligné" que j'avais mis dans le fichier d'exemple me plaît finalement... serait il possible de modifier la couleur des cases impliquées? (nom de la formation, nom du mois, et noms des salariés..)

    Ca donnerait un effet visuel plus ergonomique encore!

    Merci encore pour le temps passé sur mon cas!

  17. #17
    Membre régulier
    Homme Profil pro
    autre
    Inscrit en
    Juin 2017
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Juin 2017
    Messages : 261
    Points : 98
    Points
    98
    Par défaut
    Dernière question !?

    J'ai réussi à "surligner" les cases cibles qui ont été modifiées (ajout de nom: case en jaune, nom en vert caractère gras) grâce au module:

    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
    Option Explicit
     
    Dim plage As Range, cell As Range, Entirerow As Range
     
    Private Sub Worksheet_Change(ByVal Target As Range)
     
        Set plage = Union(Target, Selection)
        If Not Intersect(Target, Range("E5:P59")) Is Nothing Then
            For Each cell In plage
                If cell <> "" Then
                    cell.Interior.ColorIndex = 6 'jaune
                    cell.Font.ColorIndex = 10   'vert
                    cell.Font.Bold = True
                Else
                    cell.Interior.Color = xlNone
                    cell.Font.ColorIndex = 1
                End If
            Next cell
        End If
    End Sub
    Serait il possible de "surligner" également les entêtes des cellules modifiées? je songe au nom de la formation et au mois où la formation devra avoir lieu... à peu près comme dans mon exemple précédent (post #14)

    Merci!!

  18. #18
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    Bonjour,
    Peux-tu m'envoyer une copie d'écran de ta mise en forme afin que je puisse voir
    ok j'avais pas vu :
    Serait il possible de "surligner" également les entêtes des cellules modifiées? je songe au nom de la formation et au mois où la formation devra avoir lieu... à peu près comme dans mon exemple précédent (post #14)
    comme j'ai pas beaucoup de temps en ce moment
    voilà merci


    Edit :

    Bon j'ai fait des modif de mon code pour petites corrections :
    • j'ai enlevé un WithEnd With qui était de trop - si on peut éviter la répétition c'est mieux
    • j'ai revu la partie InputBox avec un Mini et Maxi d'année en moins ou en plus, le 0 y compris pour l'année en cours
    • pour la mise en couleur dans PLAN FORMATION - 2 MFC à mettre :
    - une pour les mois => plage ciblé (selon la structure du fichier) : 'PLAN FORMATION'!$E$2:$P$3 => Formule : =NBVAL(E$4:E$59)>0
    - une pour les noms => plage ciblé : 'PLAN FORMATION'!$E$4:$P$59 => Faire : "Appliquer une mise en forme aux cellules contenant" –––> "Aucune cellule vide"

    Le code modifié :
    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
    Sub PlanForma()
    Dim Mini As Integer, Maxi As Integer, AnneePlus, PF, DL_SF&, Nom, SF, i&, j&, L$, TB_L
     
        Mini = -5: Maxi = 5
        Do
            If AnneePlus Then MsgBox "Merci de mettre un entier compris entre " & Mini & " et " & Maxi
            AnneePlus = Application.InputBox("Ajouter un nombre d'année(s) supplémentaire(s)" & vbCr & "+ ou - sur l'année en cours", "ANNÉE SUPPLÉMENTAIRE VOULU", Type:=1)
            If AnneePlus = "False" Then Exit Sub
        Loop Until AnneePlus = Fix(AnneePlus) And AnneePlus >= Mini And AnneePlus <= Maxi
     
        With Sheets("PLAN FORMATION")
        Application.ScreenUpdating = False
            .Range("A1").Value = "PLAN DE FORMATION " & Year(Date) + AnneePlus
     
            With .Range("E4:P59")
                .Value = ""
                PF = .Value
     
            With Sheets("SUIVI FORMATIONS")
                DL_SF = .Cells(Rows.Count, 1).End(xlUp).Row
                Nom = .Range("A5:B" & DL_SF).Value
                SF = .Range("F5:BI" & DL_SF).Value
     
                For j = 2 To UBound(SF, 2) Step 2
                    For i = 1 To UBound(SF)
                        If SF(i, j) > "" Then
                            If Year(SF(i, j)) = Year(Date) + AnneePlus Then
                              PF(j, Month(SF(i, j))) = IIf(PF(j, Month(SF(i, j))) = "", Nom(i, 1) & " - " & Nom(i, 2), PF(j, Month(SF(i, j))) & vbCr & Nom(i, 1) & " - " & Nom(i, 2))
                              If Not L Like "*" & j + 3 & "*" Then L = L & " " & j + 3 'Récupération des lignes incriminées pour la mise en forme/couleur dans PLAN FORMATION
                            End If
                        End If
                    Next
                Next
            End With
     
                .Value = PF
                .Rows.AutoFit
            End With
     
            With .Range("A4:D59") 'Réinitialisation de la mise en forme/couleur de A4 à D59 
                .Interior.ColorIndex = xlNone
                .Font.Bold = False
                .Font.Color = 1
            End With
     
            TB_L = Split(Trim(L), " ")
            For i = LBound(TB_L) To UBound(TB_L) 'Mise en forme/couleur de A4 à D59 - PS pas bien les cellules fusionnées, en général on les évite ;) mais bon ici c'est pas très grave ;)
                For j = 1 To 4
                    If .Cells(TB_L(i), j).MergeArea.Count > 1 Then
                        With .Cells(TB_L(i), j).MergeArea
                            .Interior.ColorIndex = 6
                            .Font.Bold = True
                             If j > 3 Then .Font.ColorIndex = 10
                        End With
                    Else
                        .Cells(TB_L(i), j).Interior.ColorIndex = 6
                        .Cells(TB_L(i), j).Font.Bold = True
                        If j > 3 Then .Cells(TB_L(i), j).Font.ColorIndex = 10
                    End If
                Next
            Next
     
        Application.ScreenUpdating = True
        End With
    End Sub
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

  19. #19
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    Re,

    il y une partie du code que tu peux améliorer de la ligne 46 à 61 du post ci-dessus comme ceci:
    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
            TB_L = Split(Trim(L), " ")
            For i = LBound(TB_L) To UBound(TB_L) 'Mise en forme/couleur de A4 à D59 - PS pas bien les cellules fusionnées, en général on les évite ;) mais bon ici c'est pas très grave ;)
                For j = 1 To 4
                    With .Cells(TB_L(i), j)
                        If .MergeArea.Count > 1 Then
                            .MergeArea.Interior.ColorIndex = 6
                            .MergeArea.Font.Bold = True
                            If j > 3 Then .MergeArea.Font.ColorIndex = 10
                        Else
                            .Interior.ColorIndex = 6
                            .Font.Bold = True
                            If j > 3 Then .Font.ColorIndex = 10
                        End If
                    End With
                Next
            Next
    Edit : Tiens moi au courant si tout fonctionne parfaitement, comme j'ai seulement travaillé sur un fichier proche du fichier réel
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

  20. #20
    Membre régulier
    Homme Profil pro
    autre
    Inscrit en
    Juin 2017
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Juin 2017
    Messages : 261
    Points : 98
    Points
    98
    Par défaut
    Bonjour RyuAutodidacte et merci de nouveau !

    Tout semble fonctionner parfaitement, je suis envieux de tes ressources et connaissances! Ce "petit" fichier assez simple devient néanmoins un bijou en gestion des ressources humaines... il fait partie d'un ensemble plus complet, mais cette option en plus transfigure ses possibilités!

    Ainsi, je pourrai déployer ce système afin de planifier les visites médicales, les formations internes, les animations QSE... voire même éditer des plannings pour chaque encadrant!

    Au top! Merci!!

Discussions similaires

  1. Changer des valeurs en fonction d'une date
    Par sam01 dans le forum Requêtes
    Réponses: 10
    Dernier message: 05/03/2016, 18h22
  2. [XL-2013] Problème d'ajout de valeur en fonction d'une date VBA
    Par Pierre8585 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 13/01/2016, 17h00
  3. Paramètre multi valeurs en fonction de la date
    Par mekatxis dans le forum Deski
    Réponses: 6
    Dernier message: 29/06/2010, 16h39
  4. Zedgraph valeur en fonction d'une date
    Par petitours dans le forum C#
    Réponses: 8
    Dernier message: 07/06/2010, 09h34
  5. Réponses: 14
    Dernier message: 04/11/2009, 18h08

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