XL 2010 Utiliser Application.Sum d'items d'un dictionnaire

cathodique

XLDnaute Barbatruc
Bonsoir, Bonne Année 2021:),

Cela fait un bon bout de temps que je n'ai pas participé pour des raisons personnelles.
Ce soir, je viens solliciter votre précieuse aide. En essayant de mieux comprendre l'utilisation du dictionnaire sur le site de Boisgontier.
Je suis arrivé au lien ci-dessous:
http://boisgontierjacques.free.fr/pages_site/Dictionnaire.htm#DicoIndice

Juste au dessus de ce lien, il y avait ces lignes:

Utilisation de Sum,Average,Match,Max,Min avec le dictionnaire​


ttal = Application.Sum(d.items) donne la somme des items
Moy = Application.Average(d.items) donne la moyenne
p=Application.Match("toto",d.keys,0) donne la position de toto dans le dictionnaire

Cependant, je n'ai pas trouvé d'exemple d'utilisation de ces bouts de code. Auriez-vous un exemple pour Application.Sum(d.items).

En vous remerciant par avance.

Bonne soirée.
 
Solution
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...

cathodique

XLDnaute Barbatruc
Bonjour @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 @mapomme, meilleurs vœux à toi aussi pour cette nouvelle année:).

Merci beaucoup, ça fonctionne très bien mais une question. Pour quelle raison as-tu utilisé d(Cstr(i))=10*i .

Cependant, je suis confus de ne pas avoir été très clair dans mon premier post. Mon objectif est d'utilisé

Application.Sum pour les items de chaque clé du dictionnaire. Je joins un fichier.
1610263012179.png

Bonne journée.
 

Pièces jointes

  • Application.Sum.xlsm
    15.7 KB · Affichages: 9

cathodique

XLDnaute Barbatruc
Bonjour 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
Bonjour Staple1600 :),

Pour être honnête, je ne sais pas pourquoi un dico.
En fait, je voulais mieux comprendre l'utilisation d'un dico. Je me suis rendu sur le site de Boisgontier qui est assez fourni en exemple. Et, je suis tombé sur les lignes de codes (voir post#1) dont cette ligne:
Application.Sum((d.items)
Je me suis dit que ça serait intéressant d'utiliser ceci. J'ai peut-être pris un mauvais exemple.
C'est surtout dans un cadre d'apprentissage que j'ai pris cet exemple.

En fait, l'idée est la suivante, sur une feuille "bd" sont saisies toutes les opérations effectuées par un commerçant: date - montant crédit - montant débit
et voudrait sur une autre feuille extraire les opérations effectués par jour, ou par mois ou par trimestre ou semestre ou annuelle. En utilisant pour les choix une liste de validation dans une cellule.

C'est pour cela que je voudrai approfondir mes connaissances du dico et l'utilisation de Application.Sum.
Et cela, dans un souci de rapidité en cas de données conséquentes.
Voilà, je crois ne rien avoir oublié de l'idée.

Merci.

Bon dimanche.
 

Staple1600

XLDnaute Barbatruc
Re

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 ?
 

cathodique

XLDnaute Barbatruc
Re

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 ?
==> Staple1600;),

Oui, j'ai vu ta capture d'écran. En toute honnêteté, je ne maitrise pas les TCD, j'en ai même horreur.

Je préfère un clic, un choix dans une cellule.

Merci. Bonne journée.
 

mapomme

XLDnaute Barbatruc
Supporter XLD
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.
  • Se placer en F2
  • Données / consolider
1610273631160.png
 
Dernière édition:

cathodique

XLDnaute Barbatruc
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.
  • Se placer en F2
  • Données / consolider
Regarde la pièce jointe 1091236
==> @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.

Encore merci.
Bon dimanche.
 

Staple1600

XLDnaute Barbatruc
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à ;)
 

cathodique

XLDnaute Barbatruc
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à ;)
==> @Staple1600 : Merci pour le conseil, je vais essayer juste pour ne pas mourir idiot avant mon trépas.

Tu t'es adressé à Mapomme (code). Je n'ai pas compris comment l'utiliser. En effet, il y a un adaptation du chemin. J'ai conclu que ton code est exécuté à partir d'un autre fichier. il plante sur cette ligne Range("A1").RemoveSubtotal
 

Statistiques des forums

Discussions
312 514
Messages
2 089 223
Membres
104 069
dernier inscrit
kit.survie