Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim Réf As String, Niveau As Byte, Nbl As Long, Lgn As Long, NbCopies As Long, TbRes(), Tb, Clefs
'S'assurer que le clic est dans le tableau
If Not Intersect(Target, Me.[Armoire]) Is Nothing Then
'N° P de la ligne cliquée
Réf = Intersect(Target.EntireRow, Me.[Armoire[N° P]]).Value
If MsgBox(Prompt:="Créer la descendance de " & Réf, Buttons:=vbYesNo) = vbNo Then Exit Sub
Cancel = True
'Niveau hiérarchique de la ligne cliquée
Niveau = Intersect(Target.EntireRow, Me.[Armoire[Niveau]]).Value
'Valeurs contenues dans le tableau
Tb = Me.[Armoire]
Nbl = UBound(Tb)
'Clefs pour identifier la descendance
ReDim Clefs(1 To Nbl)
For i = 1 To Nbl
Clefs(i) = Tb(i, 1) & "¤" & Tb(i, 3)
Next
'Recherche de la ligne sous laquelle se trouve la descendance
With WorksheetFunction
Lgn = -1
On Error Resume Next
Lgn = .Match(Niveau - 1 & "¤" & Réf, Clefs, 0)
On Error GoTo 0
If Lgn = -1 Then MsgBox "Pas de descendance pour " & Niveau & " - " & Réf: Exit Sub
End With
'Comptage des lignes à copier
NbCopies = 0
For i = Lgn + 1 To Nbl
If Tb(i, 1) < Niveau Then Exit For
NbCopies = NbCopies + 1
Next
If NbCopies > 0 Then
'Récupération des données (le niveau est augmenté de 1)
ReDim TbRes(1 To NbCopies, 1 To 4)
For i = 1 To NbCopies
TbRes(i, 1) = Niveau + 1
For j = 2 To 4
TbRes(i, j) = Tb(Lgn + i, j)
Next j
Next
'Insérer les cellules
Intersect(Target.EntireRow, Me.[Armoire]).Offset(1).Resize(NbCopies).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
'Ecrire les valeurs
Intersect(Target.EntireRow, Me.[Armoire]).Offset(1).Resize(NbCopies).Value = TbRes
Else
MsgBox "Aucune descendance trouvée !"
End If
End If
End Sub