Bonjour ,
Une proposition via VBA.
La copie se fait chaque fois qu'on active la feuille "Result".
Le code est dans le module de la feuille "Result" :
Private Sub Worksheet_Activate()
Dim xrg As Range, derlig&, t, i&, InsCol As Boolean, c$
On Error GoTo err001
Application.ScreenUpdating = False
With Me
Set xrg = Worksheets("ABCD").Range("a1").CurrentRegion ' partie à copier de la feuille "ABCD"
If .FilterMode Then .ShowAllData ' on affiche toutes les lignes
If .[a1] = "TempoAuxBid" Then .Columns(1).Delete ' si la colonne auxiliaire est là, on la supprime
.Columns(1).Resize(, xrg.Columns.Count).Clear ' on efface le résultat de la précédente copie
xrg.Copy .[a1] ' on copie depuis "ABCD" vers "Result"
derlig = .Cells(Rows.Count, "a").End(xlUp).Row ' N° dernière ligne copiée
.Columns(1).Insert: InsCol = True: .[a1] = "TempoAuxBid" ' insertion colonne auxiliaire (colonne A) - son titre
t = .[a1].Resize(derlig, 2) ' on transfère les données des colonnes A:B dans t
' colonne 1 de t futur ordre de tri
' colonne 2 de t valeurs du champ "stoloc"
For i = 2 To UBound(t) ' boucle sur les données de t en sautant la ligne de titre
c = Right(t(i, 2), 1) ' dernier caractère c du champ "stoloc"
Select Case c ' indication de l'ordre de tri en fonction de c
Case "A": t(i, 1) = 1 ' "A" -> 1, "B" -> 2, "D" -> 3, "C" -> 1 sinon 999
Case "B": t(i, 1) = 2
Case "D": t(i, 1) = 3
Case "C": t(i, 1) = 4
Case Else: t(i, 1) = 999
End Select
Next i
.[a1].Resize(UBound(t)) = t ' on transfert la 1ère colonne de t (ordre d etri) en colonne auxiliaire
.[a1].Resize(UBound(t), xrg.Columns.Count + 1).Sort .[a1], xlAscending, Header:=xlYes ' Tri selmon la colonne A
err001:
If .[a1] = "TempoAuxBid" Then Columns(1).Delete ' si la 1ère colonne a pour titre "TempoAuxBid", on la supprime
Application.Goto .[a1], True ' aller en cellule A1
End With
MsgBox "Une nouvelle copie (et tri) des données de ""ABCD"" a été faite.", vbInformation ' information
End Sub