Bonjour Bruno,
Lis d'abord mon post précédent : celui d'hier à 23:27.
J'ajoute ici le commentaire de mon code VBA.
--------------------------------------------------------------------------------
Option Explicit : oblige à déclarer toutes les variables.
Sub CPP() .. End Sub : macro CPP() ; CPP = Cumul Poids par Palette
If ActiveSheet.Name <> "Feuil1" Then Exit Sub : si on n'est pas sur "Feuil1", on quitte la sub.
Dim n& : idem que Dim n As Long ; déclaration d'une variable n, de type Long.
Rows.Count : nombre de lignes d'une feuille de calcul ; avec un fichier .xlsm, c'est 1048576 ; cette instruction dans un ancien fichier .xls donnerait 65535.
n = Cells(Rows.Count, 7).End(3).Row : idem que n = Cells(Rows.Count, "G").End(xlUp).Row
c'est donc le « calcul » de la dernière ligne utilisée, selon la colonne G, à partir du bas et en remontant vers le haut ; dans le fichier exemple : n = 18.
If n = 1 Then Exit Sub : si n = 1, ça signifie qu'on est sur l'en-tête de colonne G1 "#Palette" ➯ il n'y a aucune donnée en dessous ➯ y'a rien à faire ➯ on quitte la sub.
Dim cel As Range, d, i& : déclaration de 3 autres variables ; cel est un objet de type Range ; d est déclaré sans type ➯ c'est par défaut le type Variant ; i est de type Long.
Set d = CreateObject("Scripting.Dictionary") : d va servir pour utiliser le dictionnaire (c'est une technique pour éviter automatiquement les doublons).
For i = 2 To n .. Next i : boucle i de 2 à n ; ici de 2 à 18.
With Cells(i, 7) .. End With : avec la cellule de la ligne i et de la colonne G.
If .Value <> "" Then d(.Value) = "" : si la cellule contient une donnée (par exemple "Z-1") on s'en sert comme ajout d'une clé dans le dictionnaire ; cet essai d'ajout est ignoré si la clé existe déjà dans le dico ➯ c'est ça qui évite les doublons ➯ dans le fichier exemple, ça évite d'avoir 2× "Z-1" ➯ en sortie de la boucle i, le dico contiendra uniquement ces 3 clés : "Z-1" ; "Z-2" ; "Z-3".
Application.ScreenUpdating = 0 : désactivation de la mise à jour de l'écran ➯ la sub s'exécute plus rapidement.
With Worksheets("Feuil2") .. End With : avec la feuille "Feuil2"
.[A2:B29].ClearContents : effacer la plage A2:B29 des résultats (en "Feuil2").
d.Count : contient le nombre de clés du dictionnaire ; ici, c'est 3 clés.
.[A2].Resize(d.Count) = Application.Transpose(d.Keys) : on écrit le dico à partir de A2, et en colonne (en "Feuil2") ; c'est ça qui termine la 1ère étape ; la suite est pour la 2ème étape.
For i = 2 To n .. Next i : boucle i de 2 à n ; comme n n'a pas changé : ici, c'est encore de 2 à 18 ; on est obligé de faire une autre boucle car il fallait d'abord la liste des #Palette sans doublons ; ne cherche pas à réunir les 2 boucles en une seule : laisse comme c'est !
If Cells(i, 7) <> "" Then .. End If : si la cellule de la ligne i colonne G contient une donnée (par exemple "Z-1") alors...
Set cel = .Columns(1).Find(Cells(i, 7), , -4163, 1, 1) : idem que :
Set cel = .Columns("A").Find(Cells(i, "G"), , xlValues, xlWhole, xlByRows) :
on cherche la donnée en "Feuil2" colonne A.
If Not cel Is Nothing Then .. End If : si on a trouvé la donnée, la référence de la cellule est dans la variable cel.
cel.Row retourne le n° de ligne de la donnée trouvée.
.Cells(cel.Row, 2) = .Cells(cel.Row, 2) + Cells(i, 8) : pour la cellule de la ligne cel.Row, colonne B (en "Feuil2") : on y ajoute la donnée de la cellule de la ligne i colonne H : c'est ça qui fait le cumul des poids par palette.
.Select : on sélectionne "Feuil2" pour montrer les résultats.
--------------------------------------------------------------------------------
ATTENTION
en "Feuil2", ligne 30, il y a : en A30 : "Total" ; en B30 : =SOMME(B2:B29) ; ma macro est conçue en supposant qu'il n'y aura jamais plus de 28 palettes (de A2 à A29), sinon les résultats de la macro vont "écraser" cette ligne 30 !
si c'est bien le cas qu'il n'y aura jamais plus de 28 palettes, alors c'est ok : tu peux laisser comme c'est ; sinon, y'a 2 solutions (voir ci-dessous) ; perso, je préfèrerais la solution B) car elle évite qu'il y ait de nombreuses lignes vides.
A) si le maximum de palettes sera en fait, par exemple, 34 palettes, ajouter 6 lignes au-dessus de la ligne 30 ➯ de A2 à A35, ça fait bien une place pour 34 palettes ; la ligne du total sera alors la ligne 36 ; formule en B36 : =SOMME(B2:B35) (cet ajustement a été fait automatiquement suite à l'ajout des 6 lignes ➯ c'est inutile de modifier la formule).
B) faire une autre version du fichier sans la ligne 30 du total et sans les lignes vides 2 à 29.
c'est la macro CPP() qui écrira le total juste sous la dernière palette.
avec les données du fichier exemple, juste sous la ligne 4 qui contient "Z-3" et 337,2 il y aura en ligne 5 : "Total" et 784,3 (écrit « en dur », sans formule).
rhodo