OVH Cloud OVH Cloud

Tableau de garde

18 réponses
Avatar
David 02
Bonsoir à tous

je cherche à créer un tableau de garde du 01/01/2004 au31/12/2004 à partir
de A2 de ce style :

En colonne A : date de début de garde ( jj/mm/aa )
En colonne B : heure de début de garde ( hh:mm )
En colonne C : date de fin de garde
En colonne D : heure de fin de garde
En colonne E : un nom

Je pourais faire une recopie incrémentée (pour les dates) vers le bas mais
voila le problème

- pour les samedis, dimanches et jours fériés, il y a 2 gardes : une de
08h00 à 20h00 le meme jour, et, une de 20h00 à 08h00 le lendemain
- pour les jours en semaine 1 garde de 20h00 à 08h00 le lendemain

soit :
En A2 : 01/01/2004, en B2 : 08:00, en C2 : 01/01/2004, en D2 : 20:00
En A3 : 01/01/2004, en B3 : 20:00, en C3 : 02/01/2004, en D3 : 08:00
En A4 : 02/01/2004, en B4 : 20:00, en C4 : 03/01/2004, en D4 : 08:00
etc...

Comment créer ceci via une macro ou formule sans oublier les jours fériés ?

Merci de votre aide.

David

10 réponses

1 2
Avatar
ru-th
Salut

pourrait donner quelque chose comme cela :

Sub test()
Application.ScreenUpdating = False
rep = InputBox("année à saisir") * 1
'base
For i = 1 To (DateSerial(rep, 12, 31) - DateSerial(rep - 1, 12, 31))
Cells(i, 1) = DateSerial(rep, 1, i)
Next
Cells(1, 2) = "20:"
Cells(1, 3) = "8:"
Range("b1:C1").AutoFill Range("b1:c" & Cells(65536, 1).End(xlUp).Row)
'traitement samedi et dimanche
i = 1
Do Until Cells(i, 1) = ""
If Weekday(Cells(i, 1), 2) > 5 Then
'en traitant les fériés pas tester
'If Weekday(Cells(i, 1), 2) > 5 or
application.countif(cells(i,1),[feriés])=1 then
Rows(i).Insert
Cells(i, 1) = Cells(i + 1, 1)
Cells(i, 2) = "8:"
Cells(i, 3) = "20:"
i = i + 1
End If
i = i + 1
Loop
End Sub

--
a+
rural thierry
Veaux et Broutards d'Anjou
Wicasa on kin nape yapi inahni yo (à l'essai)

"David 02" a écrit dans le message de news:
bnhgou$a65$
Bonsoir à tous

je cherche à créer un tableau de garde du 01/01/2004 au31/12/2004 à partir
de A2 de ce style :

En colonne A : date de début de garde ( jj/mm/aa )
En colonne B : heure de début de garde ( hh:mm )
En colonne C : date de fin de garde
En colonne D : heure de fin de garde
En colonne E : un nom

Je pourais faire une recopie incrémentée (pour les dates) vers le bas mais
voila le problème

- pour les samedis, dimanches et jours fériés, il y a 2 gardes : une de
08h00 à 20h00 le meme jour, et, une de 20h00 à 08h00 le lendemain
- pour les jours en semaine 1 garde de 20h00 à 08h00 le lendemain

soit :
En A2 : 01/01/2004, en B2 : 08:00, en C2 : 01/01/2004, en D2 : 20:00
En A3 : 01/01/2004, en B3 : 20:00, en C3 : 02/01/2004, en D3 : 08:00
En A4 : 02/01/2004, en B4 : 20:00, en C4 : 03/01/2004, en D4 : 08:00
etc...

Comment créer ceci via une macro ou formule sans oublier les jours fériés
?


Merci de votre aide.

David




Avatar
AV
A tester dans un classeur vierge puis adapter à ton usage (Noms de feuille,
plage de départ....)
Pour le test, le classeur doit contenir une feuille nommée "Feuil1"

Sub Gardes()
varAn = InputBox("Saisir un millésime", "Calendrier Gardes", Year(Date))
If varAn = "" Then Exit Sub
Application.ScreenUpdating = False

'création feuille et plage jours féries
On Error Resume Next
Application.DisplayAlerts = False
Sheets("Fériés").Delete
Application.DisplayAlerts = True
Sheets.Add.Name = "Fériés"
'1° janvier
[A1] = Evaluate("date(" & varAn & ",1,1)")
'Lundi de Pâques
[A2] = Evaluate("ROUND(DATE(" & varAn & ",4,MOD(234-11*MOD(" & varAn &
",19),30))/7,)*7-5")
'1° Mai
[A3] = Evaluate("date(" & varAn & ",5,1)")
'8 Mai
[A4] = Evaluate("date(" & varAn & ",5,8)")
'Jeudi de l'Ascension
[A5] = [A2] + 38
'Lundi de Pentecôte
[A6] = [A2] + 49
'14 Juillet
[A7] = Evaluate("date(" & varAn & ",7,14)")
'15 Aôut
[A8] = Evaluate("date(" & varAn & ",8,15)")
'1° Novembre
[A9] = Evaluate("date(" & varAn & ",11,1)")
'11 Novembre
[A10] = Evaluate("date(" & varAn & ",11,11)")
'Noël
[A11] = Evaluate("date(" & varAn & ",12,25)")

'définit le nom "JFrs"
ActiveWorkbook.Names.Add Name:="JFrs", RefersTo:="=Fériés!$A$1:$A$11"

'écrit série jours An
Sheets("Feuil1").Select
[A:E] = ""
With [A1]
.Value = DateSerial(varAn, 1, 1)
.DataSeries Rowcol:=xlColumns, Type:=xlChronological, Date:= _
xlDay, Step:=1, Stop:ÚteSerial(varAn, 12, 31), Trend:úlse
End With

'Ecrit Jours et heures de gardes
For z = DateSerial(varAn, 12, 31) - DateSerial(varAn, 1, 1) + 1 To 1 Step -1
Dim x1 As Range
Set x1 = Cells(z, 1)
x2 = x1.Value
testJFrs = IsError(Application.Match(x1, [JFrs], 0))
If Weekday(x1, 2) < 6 And testJFrs <> 0 Then
x1.Offset(0, 1) = 20 / 24
x1.Offset(0, 2) = x2 + 1
x1.Offset(0, 3) = 8 / 24
ElseIf Weekday(x1, 2) > 5 Or testJFrs = 0 Then
x1.Offset(0, 1) = 8 / 24
x1.Offset(0, 2) = x2
x1.Offset(0, 3) = 20 / 24
x1.Offset(1, 0).Range("A1:E1").Insert
'x1.Offset(1, 0) = x2 'Optionnel
x1.Offset(1, 1) = 20 / 24
x1.Offset(1, 2) = x2 + 1
x1.Offset(1, 3) = 8 / 24
End If
Next
End Sub

AV
Avatar
David 02
merci à tous les deux, je vais tester les deux solutions


"David 02" a écrit dans le message de
news:bnhgou$a65$
Bonsoir à tous

je cherche à créer un tableau de garde du 01/01/2004 au31/12/2004 à partir
de A2 de ce style :

En colonne A : date de début de garde ( jj/mm/aa )
En colonne B : heure de début de garde ( hh:mm )
En colonne C : date de fin de garde
En colonne D : heure de fin de garde
En colonne E : un nom

Je pourais faire une recopie incrémentée (pour les dates) vers le bas mais
voila le problème

- pour les samedis, dimanches et jours fériés, il y a 2 gardes : une de
08h00 à 20h00 le meme jour, et, une de 20h00 à 08h00 le lendemain
- pour les jours en semaine 1 garde de 20h00 à 08h00 le lendemain

soit :
En A2 : 01/01/2004, en B2 : 08:00, en C2 : 01/01/2004, en D2 : 20:00
En A3 : 01/01/2004, en B3 : 20:00, en C3 : 02/01/2004, en D3 : 08:00
En A4 : 02/01/2004, en B4 : 20:00, en C4 : 03/01/2004, en D4 : 08:00
etc...

Comment créer ceci via une macro ou formule sans oublier les jours fériés
?


Merci de votre aide.

David




Avatar
David 02
merci de ta réponse

mais cela bloque à cette endroit :

application.countif(cells(i,1),[feriés])=1 then

erreur de compilation, erreur de synthaxe

salutations

David
Avatar
David 02
merci alain

cela me va parfaitement mais toutefois lors d'un jour férié, d'un samedi et
d'un dimanche
la ligne se crée bien mais la date de début de garde ne s'inscrit pas.

y a t'il une petite modif possible ?

merci de ton aide

david
Avatar
guy
Hello AV et TOUS,
Je suis tojours en admiration devant toutes vos réponses et CONNAISSANCES.
Une chose m'intrigue depuis toujours : est-t-il possible de copier, où l'on
veut, cette très longue formule sans devoir l'écrire.
J'aimerais, svp, si quelqu'un à la patience et le temps, une réponse très
simple car je suis un vieil apprenti.
Un tout grand merci.
Guy
AV" a écrit dans le message de
news:
A tester dans un classeur vierge puis adapter à ton usage (Noms de
feuille,

plage de départ....)
Pour le test, le classeur doit contenir une feuille nommée "Feuil1"

Sub Gardes()
varAn = InputBox("Saisir un millésime", "Calendrier Gardes", Year(Date))
If varAn = "" Then Exit Sub
Application.ScreenUpdating = False

'création feuille et plage jours féries
On Error Resume Next
Application.DisplayAlerts = False
Sheets("Fériés").Delete
Application.DisplayAlerts = True
Sheets.Add.Name = "Fériés"
'1° janvier
[A1] = Evaluate("date(" & varAn & ",1,1)")
'Lundi de Pâques
[A2] = Evaluate("ROUND(DATE(" & varAn & ",4,MOD(234-11*MOD(" & varAn &
",19),30))/7,)*7-5")
'1° Mai
[A3] = Evaluate("date(" & varAn & ",5,1)")
'8 Mai
[A4] = Evaluate("date(" & varAn & ",5,8)")
'Jeudi de l'Ascension
[A5] = [A2] + 38
'Lundi de Pentecôte
[A6] = [A2] + 49
'14 Juillet
[A7] = Evaluate("date(" & varAn & ",7,14)")
'15 Aôut
[A8] = Evaluate("date(" & varAn & ",8,15)")
'1° Novembre
[A9] = Evaluate("date(" & varAn & ",11,1)")
'11 Novembre
[A10] = Evaluate("date(" & varAn & ",11,11)")
'Noël
[A11] = Evaluate("date(" & varAn & ",12,25)")

'définit le nom "JFrs"
ActiveWorkbook.Names.Add Name:="JFrs", RefersTo:="=Fériés!$A$1:$A$11"

'écrit série jours An
Sheets("Feuil1").Select
[A:E] = ""
With [A1]
.Value = DateSerial(varAn, 1, 1)
.DataSeries Rowcol:=xlColumns, Type:=xlChronological, Date:= _
xlDay, Step:=1, Stop:ÚteSerial(varAn, 12, 31), Trend:úlse
End With

'Ecrit Jours et heures de gardes
For z = DateSerial(varAn, 12, 31) - DateSerial(varAn, 1, 1) + 1 To 1
Step -1

Dim x1 As Range
Set x1 = Cells(z, 1)
x2 = x1.Value
testJFrs = IsError(Application.Match(x1, [JFrs], 0))
If Weekday(x1, 2) < 6 And testJFrs <> 0 Then
x1.Offset(0, 1) = 20 / 24
x1.Offset(0, 2) = x2 + 1
x1.Offset(0, 3) = 8 / 24
ElseIf Weekday(x1, 2) > 5 Or testJFrs = 0 Then
x1.Offset(0, 1) = 8 / 24
x1.Offset(0, 2) = x2
x1.Offset(0, 3) = 20 / 24
x1.Offset(1, 0).Range("A1:E1").Insert
'x1.Offset(1, 0) = x2 'Optionnel
x1.Offset(1, 1) = 20 / 24
x1.Offset(1, 2) = x2 + 1
x1.Offset(1, 3) = 8 / 24
End If
Next
End Sub

AV




Avatar
AV
cela me va parfaitement mais toutefois lors d'un jour férié, d'un samedi et
d'un dimanche
la ligne se crée bien mais la date de début de garde ne s'inscrit pas.


Ca c'est au choix !
Il y a une ligne précédée d'une apostrophe (à enlever) pour que ça le fasse
'x1.Offset(1, 0) = x2 'Optionnel

Il me semblait que c'était plus lisible ainsi mais tu choisis..

AV

Avatar
AV
Dans un classeur vierge, tu fais alt+F11 > insertion > module > copier/coller le
code puis l'exécuter à partir de Outils> Macro > Macros > sélectionner le nom
(Gardes) puis Exécuter
Attention, à partir du forum, figure un retour à la ligne à supprimer aprés :
......*MOD(" & varAn &
La ligne commence à
[A2] = Evaluate...
et se finit à ......",19),30))/7,)*7-5")

AV
Avatar
ru-th
Normal, saut intempestif de lignes

If Weekday(Cells(i, 1), 2) > 5 or
application.countif(cells(i,1),[feriés])=1 then

doivent être sur un seul ligne, j'ai présupposé que tu avais une plage
nommée fériés dans ton classeur avec les jours fériées concernés
si c'est le cas l'apostrophe doit être viré et la ligne du dessus supprimée

a+
rural thierry


"David 02" a écrit dans le message de news:
bnilel$q5o$
merci de ta réponse

mais cela bloque à cette endroit :

application.countif(cells(i,1),[feriés])=1 then

erreur de compilation, erreur de synthaxe

salutations

David





Avatar
David 02
merci d'avoir penser pour moi !!!
je retient la solution de alain, car elle permet de gérer les J.F.
merci encore
salutations.

"ru-th" a écrit dans le message de
news:
Normal, saut intempestif de lignes

If Weekday(Cells(i, 1), 2) > 5 or
application.countif(cells(i,1),[feriés])=1 then

doivent être sur un seul ligne, j'ai présupposé que tu avais une plage
nommée fériés dans ton classeur avec les jours fériées concernés
si c'est le cas l'apostrophe doit être viré et la ligne du dessus
supprimée


a+
rural thierry


"David 02" a écrit dans le message de
news:

bnilel$q5o$
merci de ta réponse

mais cela bloque à cette endroit :

application.countif(cells(i,1),[feriés])=1 then

erreur de compilation, erreur de synthaxe

salutations

David









1 2