Private Sub Worksheet_Change(ByVal Target As Range)
Dim dico As Object
Set dico = CreateObject("Scripting.Dictionary")
Lo = Me.ListObjects(1).Name
If Target.CountLarge > 1 Or Intersect(Evaluate(Lo), Target) Is Nothing Then Exit Sub
Plats = Evaluate(Lo & "[[Déjeuner]:[Dîner]]") 'colonnes Déjeuner et diner
Recettes = [tb_Recettes] 'tableau des recettes
'composer un dictionnaire des ingrédients utilisés pour le séjour
For i = 1 To UBound(Plats, 1): For j = 1 To UBound(Plats, 2) 'on parcourt tous les repas
Plat = Plats(i, j)
If Plat <> "" Then 'si le plat de ce repas est défini
With WorksheetFunction
idx = .Match(Plat, .Index(Recettes, 0, 1), 0) 'type de plat pour lire la quantité/Pers pour les ingrédients
For h = 0 To 19 'pour chaque ingrédient possible
col = 3 + h * 3 'colonne ingrédient
ingrédient = Recettes(idx, col): unité = Recettes(idx, col + 2): qté = Recettes(idx, col + 1)
If ingrédient <> "" Then 'si cet ingrédient est défini en incrémenter la qté
'la clé du dico est la concaténation de l'ingrédient et de l'unité utilisée
dico(ingrédient & "¤" & unité) = dico(ingrédient & "¤" & unité) + qté
End If
Next
End With
End If
Next j: Next i
nb = dico.Count 'nb d'ingrédients trouvés
Lo = Me.ListObjects(2).Name 'nom du tableau d'avitaillement
Set LObj = Me.ListObjects(Lo)
Application.EnableEvents = False
Application.ScreenUpdating = False
Evaluate(Lo).ClearContents 'RàZ du tableau d'avitaillement
If nb > 0 Then
nbPers = Me.[nb_Personnes] 'pour la quantité pour le nb de personnes
tb1 = dico.keys: tb2 = dico.Items 'les infos du dico dans des tableaux,tb1 : les clés, tb2 les quantités
ReDim ingrédients(1 To nb, 1 To 3) 'dimensionnement du tableau résultat (nb ingrédients; nom, qté, unité)
For i = 1 To nb 'remplissage du tableau
Txt = Split(tb1(i - 1), "¤") 'découper la clé 0 : nom de l'ingrédient, 1 : unité utilisée
ingrédients(i, 1) = Txt(0): ingrédients(i, 2) = Txt(1): ingrédients(i, 3) = tb2(i - 1) * nbPers
If ingrédients(i, 2) = "pièce" Then ingrédients(i, 3) = WorksheetFunction.Ceiling(ingrédients(i, 3), 1)
Next i
'redimensionner le tableau structuré, et le remplir
With LObj
.Resize .Range.Resize(nb + 1)
.DataBodyRange.Value = ingrédients
With .Sort
.SortFields.Clear
.SortFields.Add Key:=LObj.ListColumns(1).DataBodyRange, SortOn:=xlSortOnValues, Order:=xlAscending
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.Apply
End With
End With
Else
'tableau structuré vide
With LObj
.Resize .Range.Resize(2)
End With
End If
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub