Sub AllignerConcessions()
' Feuille de destination des données alignées
Dim WsDest As Worksheet
'
' n° de ligne de données, destination et n° de colonne destination
Dim lgDatas As Long, lgDest As Long, colDest As Long
'
' Référence de la concession en cours de traitement
Dim Concession As String
'
' N° du rang en cours de traitement
Dim Rang As Integer
With ThisWorkbook
'
' Référencer la feuille destination
Set WsDest = .Sheets("Destination")
'
' Effacement éventuel des données déjà existantes.
With WsDest.Range("A1").CurrentRegion
If .Rows.Count > 1 Then .Offset(1).Resize(.Rows.Count - 1).ClearContents
End With
'
' Travailler à partir de la feuille Datas
With .Sheets("Datas")
'
' Travailler sur l'intersection de la région occupée par le tableau et les colonnes A à X
With Intersect(.Range("A1").CurrentRegion, .Range("A:X"))
'
' Trier les données sur 'Concession' et 'Rang'
.Sort Key1:=.Range("A2"), Order1:=xlAscending, Key2:=.Range("B2"), Order2:=xlAscending, Header:=xlYes
'
' Balayer les lignes de la zone
For lgDatas = 2 To .Rows.Count
'
' Récupération du rang en cours
Rang = .Cells(lgDatas, 2)
'
' Calcul du n° de colonne de destination
colDest = 22 * (Rang - 1) + 3
'
' si la concession a changé
If Concession <> .Cells(lgDatas, 1).Value Then
'
' retenir la référence
Concession = .Cells(lgDatas, 1).Value
'
' récupérer le prochain numéro de ligne non occupée dans la destination
lgDest = WsDest.Cells(Rows.Count, 1).End(xlUp)(2).Row
'
' copier par valeur la référence et le rang (1) dans les deux premières colonnes
WsDest.Cells(lgDest, 1).Resize(, 2).Value = Array(Concession, Rang)
End If
'
' Copier par valeur les 22 colonnes suivantes dans la destination
WsDest.Cells(lgDest, colDest).Resize(, 22) = .Cells(lgDatas, 3).Resize(, 22).Value
Next
End With
End With
End With
End Sub