Sub test()
Dim dd, dc, i As Long, clef, elem
Set dd = CreateObject("scripting.dictionary")
Set dc = CreateObject("scripting.dictionary")
For i = 2 To 15
clef = Cells(i, 1)
dd(clef) = dd(clef) + Cells(i, 2)
dc(clef) = dc(clef) + Cells(i, 3)
Next i
Range("f:h").Clear
Range("a1:c1").Copy Range("f1")
Range("f2").Resize(dd.Count) = Application.Transpose(dd.keys)
Range("g2").Resize(dd.Count) = Application.Transpose(dd.items)
Range("h2").Resize(dd.Count) = Application.Transpose(dc.items)
Range("g2:h2").Resize(dd.Count).Replace 0, "", lookat:=xlWhole
Range("a2:c2").Copy...
Sub test()
Dim d, i As Long
Set d = CreateObject("scripting.dictionary")
For i = 10 To 1 Step -1: d(CStr(i)) = 10 * i: Next
MsgBox Application.Sum(d.items)
MsgBox Application.Average(d.items)
MsgBox Application.Match(CStr(3), d.keys, 0)
End Sub
Bonjour @mapomme, meilleurs vœux à toi aussi pour cette nouvelle annéeBonjour @cathodique et meilleurs vœux pour cette nouvelle année,
Voir le code :
VB:Sub test() Dim d, i As Long Set d = CreateObject("scripting.dictionary") For i = 10 To 1 Step -1: d(CStr(i)) = 10 * i: Next MsgBox Application.Sum(d.items) MsgBox Application.Average(d.items) MsgBox Application.Match(CStr(3), d.keys, 0) End Sub
Bonjour Staple1600Bonjour le fil, cathodique, mapomme
=>cathodique (meilleurs vœux pour 2021)
Si je puis me permettre cette question dominicale
Un dico oui mais pourquoi?
Regarde la pièce jointe 1091232
==> Staple1600Re
cathodique
Tu as regardé ma copie d'écran?
Moi, je me demandais juste pourquoi tu ne passes par un TCD
(ce que j'ai fait)
puisqu'on obtient le même résultat (avec en plus des options esthétiques si on le souhaite, le tout manipulé uniquement à la souris)
NB: Un TCD une fois fait est rapide et actualisable, non ?
Sub test()
Dim dd, dc, i As Long, clef, elem
Set dd = CreateObject("scripting.dictionary")
Set dc = CreateObject("scripting.dictionary")
For i = 2 To 15
clef = Cells(i, 1)
dd(clef) = dd(clef) + Cells(i, 2)
dc(clef) = dc(clef) + Cells(i, 3)
Next i
Range("f:h").Clear
Range("a1:c1").Copy Range("f1")
Range("f2").Resize(dd.Count) = Application.Transpose(dd.keys)
Range("g2").Resize(dd.Count) = Application.Transpose(dd.items)
Range("h2").Resize(dd.Count) = Application.Transpose(dc.items)
Range("g2:h2").Resize(dd.Count).Replace 0, "", lookat:=xlWhole
Range("a2:c2").Copy
Range("f2:h2").Resize(dd.Count).PasteSpecial xlPasteFormats
End Sub
==> @Staple1600Re
[aparté dominical]
Pourtant tout aficionado d'Excel se doit de maitriser le TCD.
C'est ce que j'ai appris lors de mon noviciat à l'Abbaye de la Cambre, à IXELLES
Et cela m'a ouvert bien des portes, même en VBA
mais ceci est une autre histoire
[/aparté dominical]
J'ai dit plus simple que le VBA avec dictionary. Je n'ai pas évoqué le TCD.=>mapomme
Données/Consolider plus simple qu'un TCD?
Je peux me permettre de te demander pourquoi?
==> @mapomme , Ce n'est pas que je tienne absolument au dico. Comme, je l'ai dis c'est pour essayer d'apprendre un peu plus sur les dicos. En tout cas, tous mes remerciements. Ton code fonctionne parfaitement.Bonjour @cathodique, @Staple1600,
Si tu tiens au dictionary, teste :
VB:Sub test() Dim dd, dc, i As Long, clef, elem Set dd = CreateObject("scripting.dictionary") Set dc = CreateObject("scripting.dictionary") For i = 2 To 15 clef = Cells(i, 1) dd(clef) = dd(clef) + Cells(i, 2) dc(clef) = dc(clef) + Cells(i, 3) Next i Range("f:h").Clear Range("a1:c1").Copy Range("f1") Range("f2").Resize(dd.Count) = Application.Transpose(dd.keys) Range("g2").Resize(dd.Count) = Application.Transpose(dd.items) Range("h2").Resize(dd.Count) = Application.Transpose(dc.items) Range("g2:h2").Resize(dd.Count).Replace 0, "", lookat:=xlWhole Range("a2:c2").Copy Range("f2:h2").Resize(dd.Count).PasteSpecial xlPasteFormats End Sub
Sinon le plus simple est d'utiliser la commande : Données / consolider.
Regarde la pièce jointe 1091236
- Se placer en F2
- Données / consolider
Sub Macro1()
Dim NomFichier$
'Consolidation
'adapter NomFichier avant usage
NomFichier = "'C:\Users\STAPLE\Documents\TESTS\[Application.Sum.xlsm]" & [A1].Parent.Name & "'"
Range("A1").RemoveSubtotal
Range("F:K").Clear
Range("F1").Consolidate Sources:=NomFichier & "!R1C1:R15C3", Function:=xlSum, TopRow:=True, LeftColumn:=True
End Sub
Sub Macro2()
'Sous-Total
Range("F:K").Clear
Range("A1:C15").Subtotal GroupBy:=1, Function:=xlSum, TotalList:=Array(2, 3), Replace:=True, PageBreaks:=False, SummaryBelowData:=True
ActiveSheet.Outline.ShowLevels RowLevels:=2
End Sub
==> @Staple1600 : Merci pour le conseil, je vais essayer juste pour ne pas mourir idiot avant mon trépas.Re
=>mapomme
On a oublié Sous-Total aussi
Petites questions:
1) Pourquoi je ne récupère pas Code avec ce code (ni à la main d'ailleurs)
2) Pour la consolidation, on est obligé de renseigné le FullName dans le code?
VB:Sub Macro1() Dim NomFichier$ 'Consolidation 'adapter NomFichier avant usage NomFichier = "'C:\Users\STAPLE\Documents\TESTS\[Application.Sum.xlsm]" & [A1].Parent.Name & "'" Range("A1").RemoveSubtotal Range("F:K").Clear Range("F1").Consolidate Sources:=NomFichier & "!R1C1:R15C3", Function:=xlSum, TopRow:=True, LeftColumn:=True End Sub Sub Macro2() 'Sous-Total Range("F:K").Clear Range("A1:C15").Subtotal GroupBy:=1, Function:=xlSum, TotalList:=Array(2, 3), Replace:=True, PageBreaks:=False, SummaryBelowData:=True ActiveSheet.Outline.ShowLevels RowLevels:=2 End Sub
=>cathodique
La técédéphobie est un trouble répandu mais curable
Et le traitement est indolore et sans effet secondaire notoire.
Il suffit de quelques touches
CTRL+A
ALT+S UA
ENTER
Et voilà