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
| Option Explicit 'Comme ça, erreur à la compilation si des variables ne sont pas déclarées. Réduit le risque d'erreur par la suite
'Appel de la fonction pour copier 2010 sur 2011
'On peut choisir n'importe quelles valeurs pour les deux années du moment que l'année source est dans la feuille.
Public Sub test()
copieAnnee 2010, 2011
End Sub
'La procédure de copie
Public Sub copieAnnee(ByVal anneeSource As Integer, ByVal anneeCopie As Integer)
Dim firstRow, lastRow, corresRow, i As Integer
Dim rg As Range
Set rg = Worksheets("Feuil1").Range("A:A")
Dim dt As Date
'Donne la ligne de la plus grande date inférieure ou égale au 1er janvier de l'année source
firstRow = WorksheetFunction.Match(CDbl(DateSerial(anneeSource, 1, 1)), rg, 1)
'Donne la ligne de la plus grande date inférieure ou égale au 31 décembre de l'année source
lastRow = WorksheetFunction.Match(CDbl(DateSerial(anneeSource, 12, 31)), rg, 1)
'Si le 1er janvier n'existait pas, on récupère la première date de l'année. C'est surtout pour si un jour tu enlèves les WE par exemple.
If Year(rg.Cells(firstRow, 1)) < anneeSource Then firstRow = firstRow + 1
'Pour chaque date dans l'année source
For i = firstRow To lastRow
dt = rg.Cells(i, 1).Value
On Error Resume Next 'Indique qu'en cas d'erreur, on continue
'On cherche s'il existe la même date pour l'année cible. Actuellement, on l'a forcément à part le 29 février
corresRow = WorksheetFunction.Match(CDbl(DateAdd("yyyy", 1, dt)), rg, 0)
If Err.Number = 0 Then 'S'il n'y a pas eu d'erreur, il a trouvé la date demandée
rg.Cells(corresRow, 1).Offset(0, 1).Value = rg.Cells(i, 1).Offset(0, 1).Value 'On recopie la valeur, Offset fait ici un décalage d'une colonne vers la droite
End If
On Error GoTo 0 'On réenclenche la gestion normale des erreurs
Next i
End Sub |