Option Explicit
Sub Enregistrer()
If ActiveSheet.Name <> "Feuil1" Then Exit Sub 'on doit être sur "Feuil1"
Dim m&, n&: m = Rows.Count 'm = nombre de lignes maximum
n = Cells(m, 2).End(3).Row 'n° dernière ligne, selon la colonne B
If n < 5 Then Exit Sub 'sortie de la sub, car y'a aucune donnée à copier !
Dim lig&: Application.ScreenUpdating = 0
With Worksheets("f2")
lig = .Cells(m, 4).End(3).Row + 1
With .Cells(lig, 1)
.Value = [B1] 'Technicien
.Offset(, 1) = DateSerial([F1], [E1], 1) 'date
.Offset(, 2) = [F1] + [E1] - 2026 'n° du rapport (en fonction de la date)
End With
Range("B5:B" & n).Copy 'Copie les données en colonne de "Feuil1" (B5 et dessous)
.Cells(lig, 4).PasteSpecial -4163, , , True 'Colle les données en ligne sur "f2"
Application.CutCopyMode = 0: .Select: [A1].Select 'va sur la feuille "f2"
End With
End Sub
Sub Récupérer()
If ActiveSheet.Name <> "f2" Then Exit Sub 'on doit être sur "f2"
Dim m&, n&: m = Rows.Count 'm = nombre de lignes maximum
n = Cells(m, 4).End(3).Row 'n° dernière ligne, selon la colonne D
Dim lig&: lig = ActiveCell.Row 'ligne de la cellule active
If lig = 1 Or lig > n Then Exit Sub 'sortie car y'a aucune donnée à copier !
'rapatrie les données de la ligne désignée par la cellule active de "f2" ;
'donc il faut D'ABORD sélectionner la BONNE ligne de "f2" AVANT de lancer
'cette macro, donc AVANT de cliquer sur le bouton "Récupérer".
Application.ScreenUpdating = 0
With Worksheets("Feuil1")
n = .Cells(m, 2).End(3).Row 'n° dernière ligne, selon la colonne B
.Range("B1, E1, B5:B" & n).ClearContents 'efface les anciennes données
.[B1] = Cells(lig, 1) 'récupère le nom du technicien en B1 de "Feuil1"
.[E1] = 2026 + Cells(lig, 3) - .[F1] 'mois (selon n° rapport et année)
n = Cells(lig, Columns.Count).End(1).Column 'n° de la dernière colonne
Cells(lig, 4).Resize(, n - 3).Copy '-3 car SAUF colonnes A à C : D à N
.[B5].PasteSpecial -4163, , , True 'Coller en colonne sur "Feuil1"
Application.CutCopyMode = 0: .Select: [A1].Select 'va sur "Feuil1"
End With
End Sub