Bonjour à tous,

Dans une feuille de calcul sous Excel 2021, j'ai créé 5 tableaux l'un en dessous de l'autre, qui comportent chacun une colonne "Semaine du ... au ... 20.." avec les jours correspondants du lundi au dimanche (par ex lundi 02 janv mardi 03 janv mercredi 04 janv etc).

J'ai créé 2 boites déroulantes, l'une pour sélectionner l'année (cellule A4), l'autre une "plage" de mois (cellule A2).

J'ai créé un macro VBA avec lequel je rencontre le problème suivant : quel que soit l'année que je sélectionne, prenons par exemple l'année 2023, ma colonne "Semaine du ... au ... 20.." devient "Semaine du ... au ... 2001" et se met par conséquent à afficher les jours de l'année 2001 au lieu de l'année 2023.

Idem pour les années qui suivent, je me retrouve à chaque fois avec une année de 12 ans d'ancienneté (2024 devient 2002, 2025 devient 2003, etc).

Le problème semble venir de cette ligne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
year = ws.Range("A2").Value
en la remplaçant par
Code : Sélectionner tout - Visualiser dans une fenêtre à part
year = ws.Range("A2").Value +22
cela corrige partiellement le problème car, par exemple, pour la semaine 5 de la plage Avril/Mai, ma colonne devient "Semaine du 29 avril au 5 mai 2024" alors que j'ai sélectionné l'année 2023.

J'ai tenté de remplacer la ligne
Code : Sélectionner tout - Visualiser dans une fenêtre à part
year = ws.Range("A2").Value
par

Code : Sélectionner tout - Visualiser dans une fenêtre à part
year = 2000 + ws.Range("A2").Value
Et essayer de convertir explicitement le contenu de ma cellule "A2" en entier avec les fonctions "Int" et "CInt" :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
year = Int(ws.Range("A2").Value)
et

Code : Sélectionner tout - Visualiser dans une fenêtre à part
year = CInt(ws.Range("A2").Value)
Mais je me résous toujours au même problème

Voici d'autres trucs que j'ai aussi tenté, comme stocker la valeur comme une date, plutôt que dans une variable entière "year" :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
Dim year As Date
year = CDate(2000 + ws.Range("A2").Value)
Dim startYear As Date
startYear = DateSerial(Year(year), 1, 1)
================================

Je vous partage mon fichier Excel ici => et l'intégralité de mon macro VBA :

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
Sub ShowAllWeeks()
 
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Feuil1")
 
Dim year As Integer
year = ws.Range("A2").Value
 
Dim month As Integer
month = ws.Range("A4").Value
 
Dim startDate As Date
startDate = DateSerial(year, month, 1)
 
Dim endDate As Date
endDate = DateSerial(year, month + 1, 0)
 
Dim currentWeek As Integer
currentWeek = 1
 
Dim row As Integer
row = 12
 
Do Until startDate > endDate
 
' Find the first Monday of the week
If Weekday(startDate) = 1 Then
startDate = startDate + 1
ElseIf Weekday(startDate) = 7 Then
startDate = startDate + 2
Else
startDate = startDate - Weekday(startDate) + 2
End If
 
ws.Range("A" & row).Value = "SEMAINE " & vbNewLine & " DU " & UCase(Format(startDate, "dd mmmm yyyy")) & vbNewLine & " AU " & UCase(Format(startDate + 6, "dd mmmm yyyy"))
 
' Check if the cell is merged
If ws.Range("A" & row).MergeCells Then
row = row + ws.Range("A" & row).MergeArea.Rows.Count - 1
End If
 
ws.Range("A" & row + 1).Value = UCase(Format(startDate, "dddd dd mmm."))
ws.Range("A" & row + 2).Value = UCase(Format(startDate + 1, "dddd dd mmm"))
ws.Range("A" & row + 3).Value = UCase(Format(startDate + 2, "dddd dd mmm"))
ws.Range("A" & row + 4).Value = UCase(Format(startDate + 3, "dddd dd mmm"))
ws.Range("A" & row + 5).Value = UCase(Format(startDate + 4, "dddd dd mmm"))
ws.Range("A" & row + 6).Value = UCase(Format(startDate + 5, "dddd dd mmm"))
ws.Range("A" & row + 7).Value = UCase(Format(startDate + 6, "dddd dd mmm"))
 
row = row + 8
currentWeek = currentWeek + 1
startDate = startDate + 7
 
Loop
 
End Sub
Merci d'avance pour vos retours éclairés