Re Sebastien, Monique, Jean-Marie, Le Forum
La difference entre un Module et un UserForm sur VBA, et bien ou c'est très simple ou c'est très compliquée comme question.
Un UserForm, à partir du moment où tu le crées, il génére son propre "Private Module", tout comme les Feuilles, et même le Classeur lui même ("ThisWorkbook").
Par définition, un Private Module ne devrait servir qu'à contenir les codes de l'objet concerné (Le UserForm, ou la Feuille ou le Classeur), mais je dis bien par définition, puisque l'on peut gérer des autres choses comme je le fais avec Lien supprimé mais je e veux pas t'embrouiller l'esprit...
En fait un Module "Standard" (Module1 par exemple) lui contient par définition des codes "Publique" à tout le Projet (et même à l'extérieur si on veut extrapoler).
La différence sinon est évidente, un UserForm est un Object "palpable" (au figuré lol) un Module non, il peut générer tout au mieux des MsgBox, ou alors on fait appel à des Controls existants par ailleurs (Dans un UserForm ou dans une Feuille)... Un Module peut par contre fabriquer un UserForm à la Volée par programmation... Mais tout ceci doit te rendre encore plus perplexe que lorsque tu as posé la question !! lol
Non disons que dans ton cas présent, pas besoin de UserForm, un Module suffit, il va permetre de lire tes donnés et les reporter dans un autre endroits du classeur avec les Statistique nécessaire...
Pour mieux comprendre comment adater ce code, imagine que ta base de donnée soit de la Colonne "A" à "H" que le "Fruit" soit en colonne "D" le "CA" en "E" et la "Marge"en "F" tout ceci sur une feuille "Import" et que tes calculs doivent se trouver en Feuille "Statistics" de la colonne "A" (libellé du Fruit), "B" (CA) et "C" (Marge) ...
Voici le code remanié dans le cadre de cette supposition :
Sub MakingSubTotalPerFruit()
Dim TabloDatabase As Variant
Dim CollectionFruits As Collection
Dim Fruit As Variant
Dim i As Long, L As Long
Dim CA As Double, Marge As Double
With Sheets("Import")
TabloDatabase = .Range("D3:F" & .Range("D65536").End(xlUp).Row)
.Range("F19:H500").ClearContents
End With
Set CollectionFruits = New Collection
On Error Resume Next
For i = 1 To UBound(TabloDatabase)
CollectionFruits.Add CStr(TabloDatabase(i, 1)), CStr(TabloDatabase(i, 1))
Next
For Each Fruit In CollectionFruits
For i = 1 To UBound(TabloDatabase)
If TabloDatabase(i, 1) = Fruit Then
CA = CA + TabloDatabase(i, 2)
Marge = Marge + TabloDatabase(i, 3)
End If
Next i
With Sheets("Statistics")
L = .Range("A65536").End(xlUp).Row + 1
.Range("A" & L) = Fruit
.Range("B" & L) = CA
.Range("C" & L) = Marge
End With
CA = 0
Marge = 0
Next Fruit
End Sub
Voilà ce n'est pas vraiment sorcier à adapter... Ce qui est important c'est le dimensionnement de la Plage TabloDatabase au départ et ensuite de savoir travailler dans les colonnes respectives de ce Tableau (ici (i, 1) = le Fruit puisque 1 est la première colonne....) Si par exemple tu as une colonne de donnée au milieu qui ne sert à rien dans tes stats, ce n'est pas grave, tu élargit d'autant la plage de TabloDatabase et tu décalles le numéro...
Bon "Amusement"
@+Thierry
PS ce n'est pas une coïncidence, j'ai pu savoir par ton classeur dans quel boite tu travailles (regarde Menu / Fichier / Propriétés)