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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
| Sub subReorganise()
Dim sh1 As Excel.Worksheet, sh2 As Excel.Worksheet
Dim l1 As Long, nbl1 As Long, nbl2 As Long, l2 As Long, j2 As Integer
Dim vTL As Variant, vData As Variant, vTE As Variant
Dim nbPers As Integer, nbMaxPers As Integer
Set sh1 = ThisWorkbook.Worksheets(1)
Set sh2 = ThisWorkbook.Worksheets(2)
'nb lignes à traiter
nbl1 = sh1.Cells(Application.Rows.Count, 1).End(xlUp).Row
'tri des données
sh1.Range("A1:B" & nbl1).Sort sh1.Range("B:B"), xlAscending, sh1.Range("A:A"), , xlAscending
'chargement des données
vTL = sh1.Range("A1:B" & nbl1).Value
'calcul du nombre max de personnes associées à une valeur, et du nombre de datas différents
nbMaxPers = 0
nbPers = 0
vData = Null
nbl2 = 0
For l1 = 1 To nbl1
If vData = vTL(l1, 2) Then
nbPers = nbPers + 1
Else
If nbPers > nbMaxPers Then nbMaxPers = nbPers
vData = vTL(l1, 2)
nbl2 = nbl2 + 1
nbPers = 1
End If
Next l1
'vérifier que le nombre de personnes max n'est pas trop grand
If nbMaxPers + 1 > Application.Columns.Count Then
MsgBox "la feuille n'a pas assez de colonnes pour afficher le résultat."
GoTo Sortie
End If
'nettoyage de la feuille 2
sh2.UsedRange.Clear
'chargement d'un tableau de la bonne taille
vTE = sh2.Range(sh2.Range("A1"), sh2.Cells(nbl2, nbMaxPers + 1)).Value
'remplissage du tableau d'écriture
l2 = 0
j2 = 1
vData = Null
For l1 = 1 To nbl1
If vData = vTL(l1, 2) Then
vTE(l2, j2) = vTL(l1, 1)
j2 = j2 + 1
Else
l2 = l2 + 1
vData = vTL(l1, 2)
vTE(l2, 1) = vTL(l1, 2)
vTE(l2, 2) = vTL(l1, 1)
j2 = 3
End If
Next l1
'copier vTE dans feuille 2
sh2.Range(sh2.Range("A1"), sh2.Cells(nbl2, nbMaxPers + 1)).Value = vTE
sh2.Range("A1").Value = vTE
Sortie:
vTL = Null
vTE = Null
Set sh1 = Nothing
Set sh2 = Nothing
End Sub |
Partager