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 :

Incrémenter un calendrier suivant les indisponibilités des personnels [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Militaire
    Inscrit en
    Juin 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Militaire
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2014
    Messages : 14
    Points : 13
    Points
    13
    Par défaut Incrémenter un calendrier suivant les indisponibilités des personnels
    Gestion des services-1.xls
    Je joints mon tableau, l'onglet explicit décrit ce que je veux obtenir et ce que j'ai fait.
    Pour faire court, 3 onglets.
    1) PERSONNELS:
    chaque personnel est suivit par numéro ID
    On y trouve les informations nécessaires au suivis de ceux ci.
    2) SAISIE_INDISPO:
    j'ai fait comme un formulaire de saisie: sélection de l'ID, date de début, date de fin de période, calcul de jours indisponible, motif indisponibilité, INDIC est une case contenant un code couleur à copier sur l'onglet CALENDAR aux dates correspondantes pour le personnel correspondant.
    En fond jaune, j'ai des formules me permettant d'identifier la colonne (le personnel) , la première ligne et la dernière ligne de l'indisponibilité saisie (dates), et enregistré.
    3)CALENDAR :
    1ère ligne: les ID de mes personnels (classés par ordre chronologique)
    1ère colonne: dates, du 01/09/2013 au 31/08/2016.
    Les cases doivent contenir les indisponibilités saisies dans l'onglet précédent ainsi que les services (astreintes et permanences diverses)- celles-ci seront saisies manuellement par un opérateur suivant un code couleur pré définit (une lettre/une couleur/un fond=un code service). Par exemple, une permanence sera identifiée par un "1" blanc sur fond vert. Alors qu'une indisponibilité d'ordre personnelle sera identifiée par un "X" rouge sur fond gris.

    Mon problème est de mettre en place une macro qui incrémente les cases de mon calendrier des indisponibilités saisies.
    Help me please!

    Merci d'avance.
    Un autodidacte en panique devant VBA...

  2. #2
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    Bonjour,

    Poste ton classeur. Si tu l'as déjà fait, peut-être qu'un modérateur l'a ôté (tu n'es pas censé mettre une pièce jointe avec ton premier message).

  3. #3
    Membre à l'essai
    Homme Profil pro
    Militaire
    Inscrit en
    Juin 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Militaire
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2014
    Messages : 14
    Points : 13
    Points
    13
    Par défaut Fichier joint
    Merci pour la remarque.
    Effectivement il n'a pas été joint.
    C'est fait.

    Respectueusement.

  4. #4
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Pour copier l'ensemble des lignes vers leur destination
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Sub Traitement()
    Dim N As Long, i As Long
    Dim D As Long, F As Long
    Dim C As Integer
     
    Application.ScreenUpdating = False
    With Worksheets("SAISIE_INDISPO")
        N = .Cells(.Rows.Count, 1).End(xlUp).Row
        If N > 4 Then
            For i = 5 To N
                C = .Cells(i, 10)                    'Colonne
                D = .Cells(i, 11)                    'Ligne Début
                F = .Cells(i, 12)                    'Ligne Fin
                .Cells(i, 8).Copy Worksheets("CALENDAR").Cells(D, C).Resize(F - D + 1)
            Next i
        End If
    End With
    End Sub

  5. #5
    Membre à l'essai
    Homme Profil pro
    Militaire
    Inscrit en
    Juin 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Militaire
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2014
    Messages : 14
    Points : 13
    Points
    13
    Par défaut Merci
    😂 j'étais entrain d'en pleurer....
    Merci ça fonctionne. Je vais essayer de comprendre comment maintenant... Après viendra le temps de faire les comptes... Mais je posterais à nouveau si je trouve pas.

    Merci beaucoup !

    Respectueusement, maître.

  6. #6
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    Essaie cette macro. Pour être complet, il faudrait effacer la feuille avant exécution au cas où tu aurais fait des modifs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Sub test()
        Dim C As Range, Plage As Range, Ligne As Long, Dat As Date
        With Sheets("SAISIE_INDISPO")
            Set Plage = .Range("A5", .Cells(.Rows.Count, 1).End(xlUp))
        End With
        With Sheets("CALENDAR")
            For Each C In Plage
    '            If C.Row = 7 Then Stop
                Ligne = Application.Match(C.Offset(, 3) * 1, .Columns(1), 0) - 1
                Dat = C.Offset(, 3)
                Do While Dat <= C.Offset(, 4)
                    C.Offset(, 7).Copy .Range("A1").Offset(Ligne, C.Value)
                    Ligne = Ligne + 1
                    Dat = Dat + 1
                Loop
            Next C
        End With
    End Sub
    PS. Tâche d'effacer ton classeur initial pour effacer les noms.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Militaire
    Inscrit en
    Juin 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Militaire
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2014
    Messages : 14
    Points : 13
    Points
    13
    Par défaut Oui mais...
    Citation Envoyé par mercatog Voir le message
    Pour copier l'ensemble des lignes vers leur destination
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Sub Traitement()
    Dim N As Long, i As Long
    Dim D As Long, F As Long
    Dim C As Integer
     
    Application.ScreenUpdating = False
    With Worksheets("SAISIE_INDISPO")
        N = .Cells(.Rows.Count, 1).End(xlUp).Row
        If N > 4 Then
            For i = 5 To N
                C = .Cells(i, 10)                    'Colonne
                D = .Cells(i, 11)                    'Ligne Début
                F = .Cells(i, 12)                    'Ligne Fin
                .Cells(i, 8).Copy Worksheets("CALENDAR").Cells(D, C).Resize(F - D + 1)
            Next i
        End If
    End With
    End Sub
    Problème: une mise en forme conditionnelle est en place sur la feuille CALENDAR. Après intégration des indisponibilités saisies, celles-ci modifies le champ d'application de la mise en forme conditionnelle, ce qui fait qu'en cas de modification ou annulation, ce qui arrive souvent, la mise en forme ne s'applique plus aux cellules modifiées par l'intégration des indisponibilités. Une solution ?
    Je pensais à ne plus copier que la valeur de la case INDIC, sans sa mise en forme, pour ne plus modifier les conditionnelles de CALENDAR, mais est-ce possible ?

    Cordialement

  8. #8
    Membre à l'essai
    Homme Profil pro
    Militaire
    Inscrit en
    Juin 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Militaire
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2014
    Messages : 14
    Points : 13
    Points
    13
    Par défaut
    Citation Envoyé par Daniel.C Voir le message
    Essaie cette macro. Pour être complet, il faudrait effacer la feuille avant exécution au cas où tu aurais fait des modifs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Sub test()
        Dim C As Range, Plage As Range, Ligne As Long, Dat As Date
        With Sheets("SAISIE_INDISPO")
            Set Plage = .Range("A5", .Cells(.Rows.Count, 1).End(xlUp))
        End With
        With Sheets("CALENDAR")
            For Each C In Plage
    '            If C.Row = 7 Then Stop
                Ligne = Application.Match(C.Offset(, 3) * 1, .Columns(1), 0) - 1
                Dat = C.Offset(, 3)
                Do While Dat <= C.Offset(, 4)
                    C.Offset(, 7).Copy .Range("A1").Offset(Ligne, C.Value)
                    Ligne = Ligne + 1
                    Dat = Dat + 1
                Loop
            Next C
        End With
    End Sub
    PS. Tâche d'effacer ton classeur initial pour effacer les noms.
    J'essaie dès ce soir.

    Par contre mon onglet CALENDAR ne doit pas être effacé. En effet, dans un soucis d'équité il me faut un historique des services montés par les personnels. Certains ne se montent qu'une à deux fois par ans. Pour ne pas mettre deux fois sur 3 ans le même personnel alors qu'ils sont 30 à pouvoir le monter... Vous comprenez ?
    J'ai essayé de faire le CALENDAR de façon à pouvoir l'étendre rapidement pour augmenter l'historique (après 2016 par exemple)
    Jusque là, les services montés sont conservés en archive papier par tableau mensuel... Je compte simplifier les recherches et les comptes de service fait, par chaque personnel en mesurant son taux de participation...

    Je sais pas si je m'exprime assez clairement pour transmettre ma façon de voir de la finalité à atteindre.

    Cordialement

  9. #9
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    Celle-ci est plus rapide que ma précédente :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub test2()
        Dim C As Range, Plage As Range, Ligne As Long, Dat As Date
        With Sheets("SAISIE_INDISPO")
            Set Plage = .Range("A5", .Cells(.Rows.Count, 1).End(xlUp))
        End With
        With Sheets("CALENDAR")
            For Each C In Plage
                Ligne = Application.Match(C.Offset(, 3) * 1, .Columns(1), 0) - 1
                C.Offset(, 7).Copy .Range("A1").Offset(Ligne, C.Value).Resize(C.Offset(, 4) - C.Offset(, 3) + 1)
            Next C
        End With
    End Sub
    Par contre, est-ce que tu pourrais montrer ce que tu veux :

    * Il faut pouvoir avoir un visuel mensuel de la disponibilité des personnels. (mise en forme automatique?)

  10. #10
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Citation Envoyé par madron Voir le message
    Je pensais à ne plus copier que la valeur de la case INDIC, sans sa mise en forme, pour ne plus modifier les conditionnelles de CALENDAR, mais est-ce possible ?
    Remplace la ligne 14 par celle ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets("CALENDAR").Cells(D, C).Resize(F - D + 1).Value = .Cells(i, 8).Value

  11. #11
    Membre à l'essai
    Homme Profil pro
    Militaire
    Inscrit en
    Juin 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Militaire
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2014
    Messages : 14
    Points : 13
    Points
    13
    Par défaut Merci
    Citation Envoyé par mercatog Voir le message
    Remplace la ligne 14 par celle ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets("CALENDAR").Cells(D, C).Resize(F - D + 1).Value = .Cells(i, 8).Value
    Ça, c'est fait et ça fonctionne bien. Merci !

    Je prépare un topo sur une deuxième version du fichier pour répondre à M. Daniel C.

    Merci pour votre indulgence.

  12. #12
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    Je prépare un topo sur une deuxième version du fichier pour répondre à M. Daniel C.
    Pas de "Monsieur" entre nous ! d'abord, aujourd'hui, j'ai décidé d'être une dame... Sérieusement, pas la peine de faire une deuxième mouture puisque la version de mercatog te convient.

    ah, pardon, oui, il y a le prénom dans le profil...

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 11/03/2014, 10h12
  2. [Débutant] Une css, des fonds différents suivant les pages
    Par Skyou dans le forum Mise en page CSS
    Réponses: 9
    Dernier message: 20/10/2008, 22h31
  3. Afficher des bouton suivant les droits
    Par Elwe31 dans le forum JSF
    Réponses: 2
    Dernier message: 03/08/2007, 08h28
  4. Réponses: 2
    Dernier message: 08/05/2006, 21h08
  5. implanter des calendriers pour les dates
    Par student007 dans le forum Access
    Réponses: 7
    Dernier message: 24/10/2005, 19h24

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