grrrr les dico !

gosselien

XLDnaute Barbatruc
Bonjour,

un problème simple, qui malgré mes lectures sur le site de JB, ne trouve pas de solution parce que ça ne veut pas rentrer dans ma tête ...Triste :(
Mais j'espère comprendre cette méthode au lieu de la copier bêtement dans certaines questions/réponses ici.

Le fichier attaché montre 2 tableau exemples avec à gauche ce que nous avons et à droite ce à quoi je voudrais arriver mais par la méthode des dictionnaires uniquement , pour la rapidité et pour comprendre, donc des commentaires seraient les bienvenus dans le code.
On garde toutes les cellules "factures" et "produit" et une seule fois le montant qui est en fait le total de la facture.

Merci :D
 

Pièces jointes

  • Question DicoForum.xlsm
    8.7 KB · Affichages: 39

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Re : grrrr les dico !

Bonsoir,

Cette méthode , qui suppose les lignes de factures sont regroupées; doit être très rapide.
Le dictionnaire aurait un intérêt si les lignes de factures n'étaient pas regroupées (mais dans ce cas, j'ai des doutes sur cette présentation)

Code:
Sub essai()
  a = [A2:D29]
  i = 1
  Do While i <= UBound(a)
    tmp = a(i, 1): m = i
    tt = 0
    Do While a(i, 1) = tmp
      tt = tt + a(i, 3)
      i = i + 1: If i > UBound(a) Then Exit Do
    Loop
    a(m, 4) = tt
  Loop
  a = Application.Index(a, Evaluate("Row(1:" & UBound(a) & ")"), Array(1, 2, 4)) ' sup col3 de a()
  [m2].Resize(UBound(a), UBound(a, 2)) = a
End Sub

ou

Code:
Sub essai2()
  a = [A2:C29]
  i = 1
  Do While i <= UBound(a)
    tmp = a(i, 1): m = i
    tt = 0
    Do While a(i, 1) = tmp
      tt = tt + a(i, 3): a(i, 3) = ""
      i = i + 1: If i > UBound(a) Then Exit Do
    Loop
    a(m, 3) = tt
  Loop
  [m2].Resize(UBound(a), UBound(a, 2)) = a
End Sub

Un exemple où le dictionnaire augmente la vitesse:

indexation d'un tableau par un dictionnaire


JB
 

Pièces jointes

  • Question DicoForum.xls
    34 KB · Affichages: 37
  • Question DicoForum.xls
    34 KB · Affichages: 45
Dernière édition:

job75

XLDnaute Barbatruc
Re : grrrr les dico !

Bonsoir gosselien, JB,

Puisque gosselien veut du Dictionary :

Code:
Sub Somme()
Dim t, t1, d As Object, i&, x
t = [A1].CurrentRegion: t1 = t
Set d = CreateObject("Scripting.Dictionary")
For i = 2 To UBound(t1)
  t1(i, 3) = Empty
  x = t(i, 1)
  If Not d.exists(x) Then d(x) = i
  t1(d(x), 3) = t1(d(x), 3) + t(i, 3)
Next
[H1].CurrentRegion.ClearContents
[H1].Resize(UBound(t), 3) = t1
End Sub
A+
 

gosselien

XLDnaute Barbatruc
Re : grrrr les dico !

Question à Job 75

Est-il est possible à la place du total de n'avoir qu'un exemplaire de chaque montant ici ?
Je cherche mais...
Donc en face de

Produit01-->1000
Produit02-->2000
Produit03-->3000
Désolé pour mon incompétence, je ne trouve pas seul ...

Merci
 

job75

XLDnaute Barbatruc
Re : grrrr les dico !

Re,

Il faut être clair, vous voulez peut-être dire :

FACTURE 01-->1000
FACTURE 02-->2000
FACTURE 03-->3000

Alors peut-être :

Code:
Sub Facture()
Dim t, d As Object, i&
t = [A1].CurrentRegion
Set d = CreateObject("Scripting.Dictionary")
For i = 2 To UBound(t)
  If d.exists(t(i, 1)) Then t(i, 3) = ""
  d(t(i, 1)) = ""
Next
[H1].CurrentRegion.ClearContents
[H1].Resize(UBound(t), 3) = t
End Sub
A+
 

gosselien

XLDnaute Barbatruc
Re : grrrr les dico !

Re,

Il faut être clair, vous voulez peut-être dire :

FACTURE 01-->1000
FACTURE 02-->2000
FACTURE 03-->3000

Alors peut-être :

Code:
Sub Facture()
Dim t, d As Object, i&
t = [A1].CurrentRegion
Set d = CreateObject("Scripting.Dictionary")
For i = 2 To UBound(t)
  If d.exists(t(i, 1)) Then t(i, 3) = ""
  d(t(i, 1)) = ""
Next
[H1].CurrentRegion.ClearContents
[H1].Resize(UBound(t), 3) = t
End Sub
A+


Oui :)

pas toujours facile d'exprimer le besoin, mais j'ai 2 versions à présent à étudier

Merci !!!
 

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Re : grrrr les dico !

Si c'est le total par facture

Code:
Sub SousTotalFacture()
  Set d = CreateObject("Scripting.Dictionary")
  For Each c In Range("a2", [a65000].End(xlUp))
    d(c.Value) = d(c.Value) + c.Offset(, 2).Value
  Next c
  [t2].Resize(d.Count, 1) = Application.Transpose(d.keys)
  [u2].Resize(d.Count, 1) = Application.Transpose(d.items)
End Sub

Si c'est le total au fur et à mesure des produits de chaque facture

Code:
Sub Cumul_AuFurEtAMesure_produits()
  a = [A2:C29]
  i = 1
  Do While i <= UBound(a)
    CodeFact = a(i, 1): m = i
    tt = 0
    Do While a(i, 1) = CodeFact
      tt = tt + a(i, 3): a(i, 3) = tt
      i = i + 1: If i > UBound(a) Then Exit Do
    Loop
  Loop
  [p2].Resize(UBound(a), UBound(a, 2)) = a
End Sub

JB
 

Pièces jointes

  • Question DicoForum.xls
    38.5 KB · Affichages: 26
  • Question DicoForum.xls
    38.5 KB · Affichages: 36
Dernière édition:

job75

XLDnaute Barbatruc
Re : grrrr les dico !

Bonjour gosselien, JB, le forum,

En complément de mon post #3, une macro plus élaborée avec tri et bordures :

Code:
Sub Somme()
Dim t, d As Object, i&, x
t = [A1].CurrentRegion
Set d = CreateObject("Scripting.Dictionary")
For i = 2 To UBound(t)
  x = t(i, 1)
  If Not d.exists(x) Then d(x) = i Else _
    t(d(x), 3) = t(d(x), 3) + t(i, 3): t(i, 3) = ""
Next
Application.ScreenUpdating = False
[H1].CurrentRegion.Borders.LineStyle = xlNone
[H1].CurrentRegion.ClearContents
With [H1].Resize(UBound(t), 3)
  .Value = t
  .Sort [H1], Header:=xlYes 'tri
  .Borders.Weight = xlThin 'bordures
End With
End Sub
[Edit] Fichier joint.

Bonne journée.
 

Pièces jointes

  • Question DicoForum(1).xlsm
    27 KB · Affichages: 23
Dernière édition:

Membres actuellement en ligne

Statistiques des forums

Discussions
312 493
Messages
2 088 956
Membres
103 989
dernier inscrit
jralonso