Bonjour le forum,

Après avoir consulter les nombreux posts traitant sur ce sujet, je n'ai pas trouvé de quoi répondre à ma problématique

Je m'explique:

Je souhaite incrémenter une date se trouvant dans une cellule par l'intermédiaire d'une autre cellule contenant simplement un nombre. La date issue de cette "somme" sera inscrite dans une autre cellule.

Mais cette incrémentation doit tenir compte des week ends et jours fériés. Autrement dit uniquement les jours ouvrables (donc d'un calendrier ?)

Par exemple:

Aujourd hui nous sommes le Mercredi 27 juin. Je souhaite incrémenter cette date de 3 jours. La simple somme des 2 cellules va me projeter au Samedi 30 juin. Or, je souhaite que le résultat affiché dans la cellule soit le Lundi 2 juillet.


Ce que je souhaite voir apparaitre sur ma page excel:
Cellule "A1" Cellule"A2" Cellule"A3"
27-06-2012 3 02-07-2012


Je possède déjà dans mon programme un calendrier me servant à simplement sélectionner une date qui reste fixée sur une feuille.

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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
Dim mois_courant
Dim témoin, Début, Fin
 
Private Sub UserForm_Initialize()
  Dim décal
  If ActiveCell = "" Then
    mois_courant = Date
  Else
    mois_courant = ActiveCell
  End If
  affiche_calendrier (mois_courant)
  décal = Weekday(DateSerial(Year(mois_courant), Month(mois_courant), 1), vbMonday) - 1
End Sub
Sub affiche_calendrier(dt)
  Dim premier_jour_mois, premier_jour_mois_suiv, décal, nb_jours, I
  premier_jour_mois = DateSerial(Year(dt), Month(dt), 1)
  premier_jour_mois_suiv = DateAdd("m", 1, premier_jour_mois)
  nb_jours = premier_jour_mois_suiv - premier_jour_mois + 1
  décal = Weekday(premier_jour_mois, vbMonday) - 1
  I = 1
  Do While I < nb_jours
     Me("texte" & I + décal).Caption = I
     If EstFérié(DateSerial(Year(dt), Month(dt), I)) = True Then Me("texte" & I + décal).BackColor = vbGreen
     sem = NoSemaine(DateSerial(Year(dt), Month(dt), I))
     K = (I + décal - 1) \ 7 + 1
     Me("Label" & K) = " " & sem
     I = I + 1
  Loop
  Me("texte" & Day(dt) + décal).BackColor = 255
  Me.Caption = Format(dt, "mmmm yy")
  'Me DateSerial(Year(dt), Month(dt), Day(dt))
End Sub
Private Sub raz_tot()
  Dim I
  For I = 1 To 37
    Me("texte" & I).BackColor = vbWhite
    Me("texte" & I).Caption = ""
 Next I
 For I = 1 To 35 Step 7
   Me("texte" & I + 5).BackColor = vbGreen
   Me("texte" & I + 6).BackColor = vbGreen
 Next I
 For K = 1 To 6: Me("label" & K) = "": Next K
End Sub
Private Sub raz()
   Dim I
   For I = 1 To 37
     If Me("texte" & I).BackColor = 65535 Then
       Me("texte" & I).BackColor = vbWhite
     End If
   Next I
   For I = 1 To 35 Step 7
   Me("texte" & I + 5).BackColor = vbGreen
   Me("texte" & I + 6).BackColor = vbGreen
 Next I
 For K = 1 To 6: Me("label" & K) = "": Next K
End Sub
Private Sub moins_Click()
  mois_courant = DateAdd("m", -1, mois_courant)
  raz_tot
  'Me.Date_début = mois_courant
  témoin = 0
  affiche_calendrier (mois_courant)
End Sub
Private Sub plus_Click()
  mois_courant = DateAdd("m", 1, mois_courant)
  raz_tot
  affiche_calendrier (mois_courant)
End Sub
Function pression(no_cellule)
 Dim K, décal
 décal = Weekday(DateSerial(Year(mois_courant), Month(mois_courant), 1), vbMonday) - 1
 raz_tot
 affiche_calendrier (mois_courant)
 Me("texte" & no_cellule).BackColor = 65535
 Début = no_cellule
 'Me.Date_début = DateSerial(Year(mois_courant), Month(mois_courant), Début - décal)
 ActiveCell.Value = DateSerial(Year(mois_courant), Month(mois_courant), Début - décal)
 Unload Me
End Function
Private Sub texte1_Click()
 pression (1)
End Sub
Private Sub texte2_Click()
 pression (2)
End Sub
Private Sub texte3_Click()
 pression (3)
End Sub
Private Sub texte4_Click()
 pression (4)
End Sub
Private Sub texte5_Click()
 pression (5)
End Sub
Private Sub texte6_Click()
 pression (6)
End Sub
Private Sub texte7_Click()
 pression (7)
End Sub
Private Sub texte8_Click()
 pression (8)
End Sub
Private Sub texte9_Click()
 pression (9)
End Sub
Private Sub texte10_Click()
 pression (10)
End Sub
Private Sub texte11_Click()
 pression (11)
End Sub
Private Sub texte12_Click()
 pression (12)
End Sub
Private Sub texte13_Click()
 pression (13)
End Sub
Private Sub texte14_Click()
 pression (14)
End Sub
Private Sub texte15_Click()
 pression (15)
End Sub
Private Sub texte16_Click()
 pression (16)
End Sub
Private Sub texte17_Click()
 pression (17)
End Sub
Private Sub texte18_Click()
 pression (18)
End Sub
Private Sub texte19_Click()
 pression (19)
End Sub
Private Sub texte20_Click()
 pression (20)
End Sub
Private Sub texte21_Click()
 pression (21)
End Sub
Private Sub texte22_Click()
 pression (22)
End Sub
Private Sub texte23_Click()
 pression (23)
End Sub
Private Sub texte24_Click()
 pression (24)
End Sub
Private Sub texte25_Click()
 pression (25)
End Sub
Private Sub texte26_Click()
 pression (26)
End Sub
Private Sub texte27_Click()
 pression (27)
End Sub
Private Sub texte28_Click()
 pression (28)
End Sub
Private Sub texte29_Click()
 pression (29)
End Sub
Private Sub texte30_Click()
 pression (30)
End Sub
Private Sub texte31_Click()
 pression (31)
End Sub
Private Sub texte32_Click()
 pression (32)
End Sub
Private Sub texte33_Click()
 pression (33)
End Sub
Private Sub texte34_Click()
 pression (34)
End Sub
Private Sub texte35_Click()
 pression (35)
End Sub
Private Sub texte36_Click()
 pression (36)
End Sub
Private Sub texte37_Click()
 pression (37)
End Sub
Function EstFérié(dt)
Static j(11), m(11), témoinjf, pâques, I
j(1) = 1: m(1) = 1
j(2) = 1: m(2) = 5
j(3) = 8: m(3) = 5
j(4) = 14: m(4) = 7
j(5) = 15: m(5) = 8
j(6) = 1: m(6) = 11
j(7) = 11: m(7) = 11
j(8) = 25: m(8) = 12
pâques = Round(DateSerial(Year(dt), 4, (234 - 11 * (Year(dt) Mod 19)) Mod 30) / 7, 0) * 7 - 6
j(9) = Day(pâques + 1): m(9) = Month(pâques + 1)
j(10) = Day(pâques + 39): m(10) = Month(pâques + 39)
j(11) = Day(pâques + 50): m(11) = Month(pâques + 50)
témoinjf = False
For I = 1 To 11
  If Day(dt) = j(I) And Month(dt) = m(I) Then
    témoinjf = True
  End If
Next
EstFérié = témoinjf
End Function
Function NoSemaine(MyDate As Date) As Integer
  NoSemaine = Format(MyDate, "ww", vbMonday, vbFirstFourDays)
  If NoSemaine > 52 Then
    If Format(MyDate + 7, "ww", vbMonday, vbFirstFourDays) = 2 Then NoSemaine = 1
  End If
End Function
Est-il possible de repartir de ce calendrier pour effectuer ce que je souhaite faire ou faut-il partir sur une autre programmation ?

Merci d'avance pour vos réponses