Bonjour,
Un essai ...
Note : sur la feuille de destination, la colonne A ne devrait pas contenir un liste ne numéros inutiles comme sur le fichier soumis ...
Sub Archiver()
Dim x As Integer ' déclaration des variables
Dim Dl As Integer, Wsdl As Integer
Dim Dc As Integer
Dim Ws As Worksheet
Application.ScreenUpdating = False
With Worksheets("Saisie")
Dc = .Cells(3, Columns.Count).End(xlToLeft).Column ' dernière ligne de la feuille Saisie
Set Ws = Worksheets("20" & Left(.Cells(1, "A"), 2)) ' détermine le nom de la feuille de destination
Wsdl = Ws.Cells(Rows.Count, "A").End(xlUp).Row + 1 ' dernière ligne de la feuille de destination
For x = 4 To .Cells(Rows.Count, "B").End(xlUp).Row ' boucle pour trouver la ligne de la donnée recherchée
If .Cells(x, "A") = .Cells(1, "A") Then ' comparaison
' si trouvé, copie dans la feuille de destination
.Range(.Cells(x, 1), .Cells(x, Dc)).Copy Destination:=Ws.Range(Ws.Cells(Wsdl, 1), Ws.Cells(Wsdl, Dc))
' supprime le ligne archivée
.Range(.Cells(x, 1), .Cells(x, Dc)).Delete Shift:=xlUp
Exit For ' sort de la boucle FOR
End If
If x = .Cells(Rows.Count, "B").End(xlUp).Row Then ' si pas trouvé ... message et fin de la macro
MsgBox " Le numéro recherché n'a pas été trouvé où il n'a pas de données en colonne B !"
Exit Sub
End If
Next x
Ws.Sort.SortFields.Clear ' vide l'éventuel dernier trie sur la feuille de destination
' prépare le trie sur la feuille de destination
Ws.Sort.SortFields.Add2 Key:=Ws.Range(Ws.Cells(4, "A"), Ws.Cells(Wsdl, "A")), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With Ws.Sort ' applique le trie sur la feuille de destination
.SetRange Ws.Range(Ws.Cells(3, 1), Ws.Cells(Wsdl, Dc))
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End With
End Sub
ric