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 :en la remplaçant par
Code : Sélectionner tout - Visualiser dans une fenêtre à part year = ws.Range("A2").Valuecela 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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part year = ws.Range("A2").Value +22
J'ai tenté de remplacer la lignepar
Code : Sélectionner tout - Visualiser dans une fenêtre à part year = 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 = 2000 + ws.Range("A2").Value
et
Code : Sélectionner tout - Visualiser dans une fenêtre à part year = Int(ws.Range("A2").Value)
Mais je me résous toujours au même problème
Code : Sélectionner tout - Visualiser dans une fenêtre à part year = CInt(ws.Range("A2").Value)![]()
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 :
Merci d'avance pour vos retours éclairés
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![]()
Partager