Macro VBA et mauvaises années
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:
year = ws.Range("A2").Value
en la remplaçant par
Code:
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:
year = ws.Range("A2").Value
par
Code:
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:
year = Int(ws.Range("A2").Value)
et
Code:
year = CInt(ws.Range("A2").Value)
Mais je me résous toujours au même problème :? :|:help:
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:
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:
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 :chin::hola: