Réalisation d'un planning d'occupation

Bonjour,

Je cherche à réaliser un planning d'occupation ( quelque chose de très visuel).
J'ai pensé à un calendrier ( sur Excel). Dans ce calendrier les cases des jours d'interventions prévus s'incrémenteraient par exemple en rouge.

Ce calendrier serait en relation et incrémenté grace à une autre feuille du classeur ou l'on retrouve tout un tas de dates d'interventions prévues.

Il faudrait que mes dates d'interventions prévues puisse s'afficher en rouge sur mon calendrier.

Merci de me donner toutes vos idées,

DGVDR

6 réponses

  1. Pijaku,

    Non il n'y a pas d'erreur cependant ça ne fonctionne pas.
    Exemple :

    Onglet préventif : case G10

    Case indiqué au 13/07/13, qui est un samedi.

    Ca ne modifie pas ma case , alors que ce code :

    maDate = CDate(Worksheets("Préventif").Range("G" & i))
    NumeroJour = Weekday(maDate, vbMonday)
    If NumeroJour = 6 Then Worksheets("Préventif").Range("G" & i) = Worksheets("Préventif").Range("G" & i) + 2
    If NumeroJour = 7 Then Worksheets("Préventif").Range("G" & i) = Worksheets("Préventif").Range("G" & i) + 1


    Devrait rajouter 2 à la date et donc l'amener à Lundi,

    As tu des idées ?

    DGVDR
    1. Modérateur
      Qu'elle procédure lance la fonction incriminée?
      Soit précis
      Parce que là, dans l'état ton classeur comporte tellement de macro qu'on ne peux pas le refaire pour toi...
  2. Modérateur
    Je n'ai pas d'errur au niveau de cette procédure.
    par contre, j'ai bien une erreur 13 au niveau du module ThisWorkBook dans l'événement Workbook_Open :
    J'ai donc modifié ton code comme suit :

    Private Sub Workbook_Open()
    Dim a As Integer ' variable pour commande'
    Dim b As Integer
    Dim rep As Integer
    Dim msg As String ' pour commande grosse pièce'
    Dim msg0 As String 'pour stock'
    Dim msg1 As String
    Dim msg2 As String
    Dim msg3 As String
    Dim msgt As String
    Dim rngTrouve As Range
    
    For a = 2 To 20
    
    If Worksheets("Commandes").Range("G" & a) <> "" And Worksheets("Commandes").Range("F" & a) < Worksheets("Préventif").Range("B1") Then
        msg = Worksheets("Commandes").Range("A" & a) ' pour la pièce'
        msg1 = Worksheets("Commandes").Range("E" & a) ' pour la société'
        With Sheets("Contacts")
            Set rngTrouve = .Columns(1).Cells.Find(msg, Lookat:=xlWhole)
            If Not rngTrouve Is Nothing Then
                msg2 = rngTrouve.Offset(0, 4)
                msg3 = rngTrouve.Offset(0, 5)
            End If
            'msg2 = Application.VLookup(msg, Sheets("Contacts").Range("A2:G36"), 5, True) ' pour l'adresse'
            'msg3 = Application.VLookup(msg, Sheets("Contacts").Range("A2:G36"), 6, True) ' pour le tel'
        End With
        msgt = msg & " à commander chez " & msg1 & Chr(10) & Chr(10) & " Coordonnées : " & Chr(10) & Chr(10) & msg2 & Chr(10) & msg3 & Chr(10) & Chr(10) & "Repousser l'alerte ?"


    1. Ok, très bien ! Quelques questions...

      Sub test()
      Dim NumeroJour As Integer
      Dim maDate As Variant
      Dim Feries(), i As Byte, FlagFerie As Boolean
      
      FlagFerie = False

      A quoi sert FlagFerie ?

      maDate = CDate("13/07/2013")

      A quoi sert CDate ?

      NumeroJour = Weekday(maDate, vbMonday)

      A quoi sert vbMonday ?

      If NumeroJour = 6 Then maDate = maDate + 2
      If NumeroJour = 7 Then maDate = maDate + 1

      Feries = ListeJoursFeries(Year(maDate))

      Si j'ai bien compris ta liste de jours fériés est dans la colonne i ?

      For i = 1 To 13
          If maDate = Feries(i, 1) Then FlagFerie = True: Exit For
      Next i
      If FlagFerie = True Then MsgBox "Attention jour férié : "  & Feries(i, 1)
      End Sub
      
      Function ListeJoursFeries(An As Integer) As Variant
      'myDearFriend! - www.mdf-xlpages.com
      '(Tableau des jours fériés français pour l'année An)


      Dim DF(1 To 13, 1 To 2) As Variant
      Je ne comprends pas cette ligne

      Dim D As Date
      Dim L As Byte
          D = DimPaques(An)
          For L = 1 To 13
              DF(L, 1) = Choose(L, _
                  DateSerial(An, 1, 1), D, D + 1, DateSerial(An, 5, 1), _
                  DateSerial(An, 5, 8), D + 39, D + 49, D + 50, DateSerial(An, 7, 14), _
                  DateSerial(An, 8, 15), DateSerial(An, 11, 1), DateSerial(An, 11, 11), _
                  DateSerial(An, 12, 25))
              DF(L, 2) = Choose(L, _
                  "Jour de l'An", "Dimanche de Pâques", "Lundi de Pâques", _
                  "Fête du Travail", "Armistice 1945", "Jeudi Ascension", _
                  "Dimanche de Pentecôte", "Lundi de Pentecôte", "Fête Nationale", _
                  "Assomption", "Toussaint", "Armistice 1918", _
                  "Noël")
          Next L
          ListeJoursFeries = DF
      End Function
      
      Private Function DimPaques(ByVal An As Integer) As Date
      'myDearFriend! - www.mdf-xlpages.com
      '(Calcul du dimanche de Pâques d'après un algorithme de Thomas O'Beirne)
      Dim n As Integer, c As Integer, a As Byte, b As Byte
          n = An - 1900
          a = n Mod 19
          b = (11 * a + 4 - ((a * 7 + 1) \ 19)) Mod 29
          c = 25 - b - ((n - b + 31 + (n \ 4)) Mod 7)
          DimPaques = DateAdd("d", c, DateSerial(An, 3, 31))
      End Function
      1. Modérateur
        A quoi sert FlagFerie ?
        FlagFerie est une variable déclarée de type Boolean. Donc n'accepte que 2 valeurs : true ou false.
        Elle ne sert pas à grand chose ici...
        Si tu veux la virer, pas de problème. Suffira de remplacer :
        For i = 1 To 13
            If maDate = Feries(i, 1) Then FlagFerie = True: Exit For
        Next i
        If FlagFerie = True Then MsgBox "Attention jour férié : "  & Feries(i, 1)
        End Sub

        par :
        For i = 1 To 13
            If maDate = Feries(i, 1) Then MsgBox "Attention jour férié : "  & Feries(i, 1): Exit For
        Next i
        End Sub

        Effectivement je n'aurais pas du procéder comme ça, c'est plus simple sans.

        <italA quoi sert CDate ? </ital>
        CDate est une fonction VBA transformant une date en une date au format date... Je m'explique : "13/07/2013" est une date mais, dans ce format là, n'est pas au format Date, mais String (chaîne de caractères). Lorsque l'on travaille sur des dates, il convient d'utiliser...des dates. D'où le CDate(machin). Fait ce test pour voir la différence :
        Sub test()
        Dim maDate As String, monJour As Date
        
        maDate = "13/07/2013"
        On Error GoTo traiterreur
        maDate = maDate + 1
        traiterreur:
        MsgBox "On ne peux pas ajouter 1 à du texte"
        monJour = CDate(maDate) + 1
        MsgBox "Par contre, on peut ajouter 1 à une date : " & monJour
        End Sub


        A quoi sert vbMonday ?
        vbMonday dit à la fonction Weekday que le premier jour de la semaine est lundi...

        Si j'ai bien compris ta liste de jours fériés est dans la colonne i ?
        Euh non... Là i est un nombre qui me sert à incrémenter une boucle : For i = 1 To 13. Boucle qui parcourt une variable tableau (variable qui comporte plusieurs valeurs). Cette variable tableau a été remplie par la Function ListeJoursFeries.

        Dim DF(1 To 13, 1 To 2) As Variant
        Je ne comprends pas cette ligne

        Si tu n'as jamais rencontré de variable tableau c'est normal. Ici on déclare une variable à 2 dimensions, la 1ère de 12 et la seconde sur 2. Cette variable est donc capable "d'accueillir" 24 valeurs...

        Test???
        Voilà :
        Sub test2()
        Dim DF(1 To 4, 1 To 2)
        Dim i As Byte, j As Byte
        
        For i = 1 To 4
            For j = 1 To 2
                DF(i, j) = "Valeur pour i : " & i & " Valeur pour j : " & j
            Next j
        Next i
        For i = 1 To 4
            For j = 1 To 2
                MsgBox DF(i, j)
            Next j
        Next i
        End Sub
      2. Bonjour pijaku,

        Je suis en plein travail sur ton code.

        J'ai une erreur 13 : Incompatibilité de type.

        Quand j'avances pas à pas grace à F8 , ca bloque à :
        For L = 1 To 13


        J'ai essayé de déclarer la variable en Integer , même chose...

        Vois tu le problème ?

        DGVDR
      3. Modérateur
        Bonjour,
        L est bien un byte (ou integer, pas de souci)...
        Je ne comprends pas ou ça bloque...
        Peux tu nous passer ton classeur de test???
    2. Pijaku,

      Excel va être capable de reconnaitre que le 13/07/13 est un samedi, grace à I
      f NumeroJour = 6
      ?

      Tout comme excel va être capable de trouvé que le 28/07/13 est un dimanche ?

      Merci,
      DGVDR
      1. Modérateur
        Ben oui. Grâce à la fonction WeekDay.
    3. Bonjour pijaku,

      Tout d'abord, merci de ta réponse.

      J'ai finalement réussi mon calendrier. En mettant dans chaque case du jour sa date, dans le case du 01/07/13 tu écris 01/07/13 en blanc à l'intérieur. Tu créés une boucle sur ton calendrier qui compare ta date au date en blanc.

      Si les dates sont similaires la cellule se met en rouge.

      Autre problème...

      Nous travaillons du lundi au vendredi ( jours ouvrés). Or mon fonctionnement en fréquence d'intervention pose problème.

      Le fonctionnement est :

      On rentre la date de dernière intervention . On connait la fréquence d'intervention ( ex : tout les 3 jours). On connait donc la date de prochaine intervention ( date de dernière + fréquence)

      Ce calcul tout bète me fait parfois tomber des samedis ou des dimanches, ou des jours fériés. Chose que j'aimerais éviter.

      Si tu as des idées...

      Merci,
      DGVDR
      1. Modérateur
        Exemple d'une procédure VBA qui ajoute 2 jours à une date si c'est un samedi et un jour si cette date tombe un dimanche et qui envoie un message si jour férié (à toi de voir le traitement nécessaire pour chaque cas de férié...) :
        Sources jour fériés : mdf
        Option Explicit
        
        Sub test()
        Dim NumeroJour As Integer
        Dim maDate As Variant
        Dim Feries(), i As Byte, FlagFerie As Boolean
        
        FlagFerie = False
        maDate = CDate("13/07/2013")
        NumeroJour = Weekday(maDate, vbMonday)
        If NumeroJour = 6 Then maDate = maDate + 2
        If NumeroJour = 7 Then maDate = maDate + 1
        Feries = ListeJoursFeries(Year(maDate))
        For i = 1 To 13
            If maDate = Feries(i, 1) Then FlagFerie = True: Exit For
        Next i
        If FlagFerie = True Then MsgBox "Attention jour férié : "  & Feries(i, 1)
        End Sub
        
        Function ListeJoursFeries(An As Integer) As Variant
        'myDearFriend! - www.mdf-xlpages.com
        '(Tableau des jours fériés français pour l'année An)
        Dim DF(1 To 13, 1 To 2) As Variant
        Dim D As Date
        Dim L As Byte
            D = DimPaques(An)
            For L = 1 To 13
                DF(L, 1) = Choose(L, _
                    DateSerial(An, 1, 1), D, D + 1, DateSerial(An, 5, 1), _
                    DateSerial(An, 5, 8), D + 39, D + 49, D + 50, DateSerial(An, 7, 14), _
                    DateSerial(An, 8, 15), DateSerial(An, 11, 1), DateSerial(An, 11, 11), _
                    DateSerial(An, 12, 25))
                DF(L, 2) = Choose(L, _
                    "Jour de l'An", "Dimanche de Pâques", "Lundi de Pâques", _
                    "Fête du Travail", "Armistice 1945", "Jeudi Ascension", _
                    "Dimanche de Pentecôte", "Lundi de Pentecôte", "Fête Nationale", _
                    "Assomption", "Toussaint", "Armistice 1918", _
                    "Noël")
            Next L
            ListeJoursFeries = DF
        End Function
        
        Private Function DimPaques(ByVal An As Integer) As Date
        'myDearFriend! - www.mdf-xlpages.com
        '(Calcul du dimanche de Pâques d'après un algorithme de Thomas O'Beirne)
        Dim n As Integer, c As Integer, a As Byte, b As Byte
            n = An - 1900
            a = n Mod 19
            b = (11 * a + 4 - ((a * 7 + 1) \ 19)) Mod 29
            c = 25 - b - ((n - b + 31 + (n \ 4)) Mod 7)
            DimPaques = DateAdd("d", c, DateSerial(An, 3, 31))
        End Function