Réalisation d'un planning d'occupation

Fermé
DGVDR Messages postés 158 Date d'inscription vendredi 10 août 2012 Statut Membre Dernière intervention 20 juillet 2015 - 10 juil. 2013 à 10:11
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 - 12 juil. 2013 à 15:43
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

A voir également:

6 réponses

pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
10 juil. 2013 à 14:10
Bonjour,

Regarde cet Exemple de Michel_m et dis moi si c'est un bon début pour toi???
0
DGVDR Messages postés 158 Date d'inscription vendredi 10 août 2012 Statut Membre Dernière intervention 20 juillet 2015
10 juil. 2013 à 14:29
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
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
Modifié par pijaku le 10/07/2013 à 15:31
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
0
DGVDR Messages postés 158 Date d'inscription vendredi 10 août 2012 Statut Membre Dernière intervention 20 juillet 2015
10 juil. 2013 à 15:33
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
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
10 juil. 2013 à 15:34
Ben oui. Grâce à la fonction WeekDay.
0
DGVDR Messages postés 158 Date d'inscription vendredi 10 août 2012 Statut Membre Dernière intervention 20 juillet 2015
10 juil. 2013 à 15:48
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
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
10 juil. 2013 à 16:16
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
0
DGVDR Messages postés 158 Date d'inscription vendredi 10 août 2012 Statut Membre Dernière intervention 20 juillet 2015
11 juil. 2013 à 13:41
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
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
12 juil. 2013 à 08:13
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???
0
DGVDR Messages postés 158 Date d'inscription vendredi 10 août 2012 Statut Membre Dernière intervention 20 juillet 2015
12 juil. 2013 à 10:28
Bonjour pijaku,

merci de ton aide

https://www.cjoint.com/?0GmkBoIEjgs

Le code concerné est dans la feuille Planning inter.

Bon courage,
DGVDR
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
12 juil. 2013 à 10:43
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 ?"



0
DGVDR Messages postés 158 Date d'inscription vendredi 10 août 2012 Statut Membre Dernière intervention 20 juillet 2015
12 juil. 2013 à 15:38
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
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
12 juil. 2013 à 15:43
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...
0