Bonjour,
Voilà donc un essai de fonction :
Function TRANSCODE(plC As Range)
Dim Cde(), k%, n%, i%, tn%, tk%
Application.Volatile
With plC
For i = 1 To .Rows.Count
Select Case .Cells(i, 1)
Case "***"
If tk > k Then k = tk
n = n + tn
tn = 1: tk = 1
Case "**"
tk = tk + 1
Case Else
tn = tn + 1
End Select
Next i
n = n + tn
If tk > k Then k = tk
ReDim Cde(1 To n, 1 To k)
k = 0: n = 0: tn = 0: tk = 0
For i = 1 To .Rows.Count
Select Case .Cells(i, 1)
Case "***"
k = 1: n = n + 1 + tk
Cde(n, k) = .Cells(i, 2)
Case "**"
If tn > tk Then tk = tn
tn = 0: k = k + 1
Cde(n, k) = .Cells(i, 2)
Case Else
tn = tn + 1
Cde(n + tn, k) = .Cells(i, 2)
End Select
Next i
End With
For n = 1 To UBound(Cde, 1)
For k = 1 To UBound(Cde, 2)
If IsEmpty(Cde(n, k)) Then Cde(n, k) = vbNullString
Next k
Next n
TRANSCODE = Cde
End Function
Comme je l'ai dit précédemment, l'utilisateur devra faire un petit calcul mental pour évaluer la dimension du résultat attendu : nombre de colonne égal au nombre de "**" situé sous un "***" (+1 pour le "***"), nombre de lignes égal au nombre max. de "" situés sous un "**" (+1 pour le "**"), donc ici 7 colonnes et 4 lignes, avant de taper la formule :
=TRANSCODE(A4:B18)
et de la valider matriciellement.
Pour le nombre de colonnes c'est également le nombre max de "**" sous "***" +1, au cas où il y aurait plusieurs "***"... Ce cas est pris en compte par la fonction, je ne l'ai cependant pas testé.
Cordialement.