Sub Macro1()
Dim be As String 'déclare la variable be (Boîte d'Entrée)
Dim ob As Object 'déclare la variable ob (Onglet Besoins)
Dim ad As Range 'déclare la variable ad (Anciennes Données)
Dim os As Object 'déclare la variable os (Onglet Source)
Dim dl As Long 'déclare la variable dl (Dernière Ligne)
Dim pl As Range 'déclare la variable pl (PLage)
Dim r As Range 'déclare la variable r (Recherche)
Dim i As Byte 'déclare la variable i (Incrément)
Dim t13d(1 To 13) As Double 'déclare le tableau de variables tv (Tableau des 13 Dates)
Dim cel As Range 'déclare la variable cel (CELlule)
Dim li As Long 'déclare la variable li (LIgne)
be = InputBox("De quel composant voulez-vous faire le calcul ?", "COMPOSANT") 'définit la boîte d'entrée be
If be = "" Then Exit Sub 'si la boîte n'est pas renseignée, sort de la procédure
Set ob = Sheets("besoins") 'définit l'onglet besoins ob
If MsgBox("Voulez-vous effacer toutes les anciennes données ?", vbYesNo, "ATTENTION") = vbYes Then
Set ad = ob.Range("A1").CurrentRegion 'définit la plage des anciennes données ad
Set ad = ad.Offset(1, 1).Resize(ad.Rows.Count - 1, ad.Columns.Count - 1) 'redéfinit la plage sans la première ligne te la première colonne
ad.ClearContents 'efface le contenue de la plage ad
End If
For Each os In Sheets 'boucle 1 : sur tous les onglets du classeur
If Not os.Name = "Feuil1" And Not os.Name = "besoins" Then 'condition 1 : si le nom de l'onglet né st ni "Feuil1" ni "besoins"
dl = os.Cells(Application.Rows.Count, 2).End(xlUp).Row 'de'finit la dernière ligne éditée dl de la colonne 2 (=B) de l'onglet os
Set pl = os.Range("B3:B" & dl) 'définit la plage pl
Set r = pl.Find(be, , xlValues, xlWhole) 'définit la recherche r (recherche le composant défini dans be dans la plage pl)
If Not r Is Nothing Then 'condition 2 : si il existe au moins une occurrence
os.Range("A2").AutoFilter Field:=2, Criteria1:=be 'filtre l'onglet os par rapport au compossant
For i = 1 To 13 'boucle 2 : sur les 13 variable du tableau des 13 dates t13d
'boucles 3 : sur toutes les celllule visible de la plage pl décalée de (5+i) colonnes
For Each cel In pl.SpecialCells(xlCellTypeVisible).Offset(0, 5 + i)
'attribut à la variable indexée t13d(i) la valeur de la cellule cel ajoutée à la variable t13d(i) déja entrée
t13d(i) = t13d(i) + CDbl(cel.Value)
Next cel 'prochaine cellule de la boucle 3
Next i 'prochaine variable de la boucle 2
os.Range("A2").AutoFilter 'supprime le filtre automatique
End If 'fin de la condition 2
'redéfinit la recherche r (recherche le composant définit par be dans la première colonne de l'onglet ob)
Set r = ob.Columns(1).Find(be, , xlValues, xlWhole)
If Not r Is Nothing Then 'condition : si il existe au moins une occurrence trouvée
li = r.Row 'définit la ligne li de l'occurrence trouvée
For i = 1 To 13 'boucle 4 : sur les 13 variable du tableau t13d
'renvoie dans la cellule de l'occurrence trouvée décalée de (i+1) colonne, sa propre valeur ajoutée à la variable t13d(i)
ob.Cells(li, i + 1).Value = CDbl(t13d(i) + ob.Cells(li, i + 1).Value)
Next i 'prochaine varaible de la boucle 4
ob.Select 'sélectionne l'onglet ob
ob.Cells(li, 1).Select 'sélectionne la cellule en colonne A de l'occurrence trouvée
Else 'sinon
MsgBox "Composant non trouvé dans l'onglet " & Chr(34) & "besoins" & Chr(34) & " !": Exit Sub 'message. sort de la procédure
End If 'fin de la condition
For i = 1 To 13 'boucle 5 : sur les 13 variables du tableau t13d
t13d(i) = 0 'réinitialise la variable t13d(i)
Next i 'prochaine variable de la boucle 5
End If 'fin de la condition 1
Next os 'prochain onglet de la boucle 1
End Sub