Sub Degrouper()
Dim zoneBrute As Range, zoneDest As Range, tabBrut() As Variant, tabDest() As Variant
Dim x As Long, y As Long, nbVal As Long, iDest As Long, iVal As Long
'défini ou sont les données sources et où écrire le résultat
Set zoneBrute = ThisWorkbook.Sheets("BASE").Range("A1:T97")
Set zoneDest = ThisWorkbook.Sheets("RESULTAT").Range("A4")
With zoneBrute
'compte le nombre de ligne qu'il y aura au total (18935 dans ce cas)
nbVal = Application.WorksheetFunction.Sum(.Offset(1, 1).Resize(.Rows.Count - 1, .Columns.Count - 1))
'récupère l'ensemble des données de la zone "A1:T97" dans un tableau
tabBrut = .Value
End With
'prépare le tableau résultat (18935 lignes et 2 colonnes)
ReDim tabDest(1 To nbVal, 1 To 2)
iDest = 0
'boucle sur chaque y (du 2ème élément du tableau au dernier)
For y = LBound(tabBrut, 1) + 1 To UBound(tabBrut, 1)
'boucle sur chaque x (du 2ème élément du tableau au dernier)
For x = LBound(tabBrut, 2) + 1 To UBound(tabBrut, 2)
's'il y a de la donnée sur le couple (y, x)
If tabBrut(y, x) <> Empty Then
'boucler le nombre de fois
For iVal = 1 To tabBrut(y, x)
'incrémenter le compteur et écrire y et x dans le tableau résultat
iDest = iDest + 1
tabDest(iDest, 1) = tabBrut(y, LBound(tabBrut, 2))
tabDest(iDest, 2) = tabBrut(LBound(tabBrut, 1), x)
Next iVal
End If
Next x
Next y
'écrire le tableau résultat sur le classeur
zoneDest.Resize(nbVal, 2).Value = tabDest
End Sub