XL 2010 Passer de Dico à Array avec Split

cp4

XLDnaute Barbatruc
Bonsoir:),

J'ai eu beau chercher je ne suis pas parvenu à trouver une réponse.
J'ai utilisé un dictionnaire pour faire la somme pour chaque personne (nom, prénom dans les colonnes différentes).
Jusque là, pas de problème. Maintenant, je voudrais repasser vers un autre tableau pour séparer les noms, prénoms et le montants.
Je crois savoir que la fonction split est tout indiquée à mon problème. Mais, j'avoue que je suis perdu.
VB:
For i = 1 To UBound(Tb)
d(Tb(i, 2) & "|" & Tb(i, 3)) = d(Tb(i, 2) & "|" & Tb(i, 3)) + Tb(i, 16)
Next i

En vous remerciant par avance.
 
Solution
Moi je faisais comme ça :
VB:
Sub EssaiDranreb()
   Dim TDon(), LDon As Long, TRés(), LRés As Long, Clé As String, Dic As New dictionary
   TDon = ActiveSheet.[A1].CurrentRegion.Value
   ReDim TRés(1 To UBound(TDon, 1), 1 To 3)
   For LDon = 1 To UBound(TDon, 1)
      Clé = TDon(LDon, 2) & "|" & TDon(LDon, 3)
      If Dic.exists(Clé) Then
         LRés = Dic(Clé)
         TRés(LRés, 3) = TRés(LRés, 3) + TDon(LDon, 16)
      Else
         LRés = Dic.Count + 1: Dic(Clé) = LRés
         TRés(LRés, 1) = TDon(LDon, 2)
         TRés(LRés, 2) = TDon(LDon, 3)
         TRés(LRés, 3) = TDon(LDon, 16)
         End If
      Next LDon
   ActiveSheet.[V1].Resize(Dic.Count, 3) = TRés
   End Sub

cp4

XLDnaute Barbatruc
Bonsoir Staple1600,
Oui c'est moi qui est effacé ce message. cp4 va nous faire un tour de magie
Passer de Dico à Array avec Split, ca je connais pas encore :)
@laurent950 : Moi aussi je ne connais. Je repose mon problème autrement en essayant de faire simple.
Capture.JPG

Je récupère ces données de la feuille dans un tableau Tb, Je voudrais utiliser un dico pour récupérer le nom et le prenom comme clé (nom & "|" & prenom) et l'item sera la somme (ici koko rené a payé= 5764,15)
donc
d.keys(0)=dupont|jean ---> d.items(0)=1968.05
d.keys(1)=dujus|paul ---> d.items(1)=3796.1
d.keys(3)=koko|rené ---> d.items(0)=5764.15

je voudrais construire un tableau (array)
Tt(1,1)=dupont----Tt(1,2)=jean----Tt(1,3)=1968.05
Tt(2,1)=dujus----Tt(2,2)=paul----Tt(2,3)=3796.1
Tt(3,1)=koko----Tt(3,2)=rené----Tt(3,3)=5764.15

J'espère c'est beaucoup plus clair.
En vous remerciant.
 

cp4

XLDnaute Barbatruc
re
ça te dérange tant que ça de nous donner le fichier que l'on est pas a tout se taper
a première vu même le dico est superflu ;)
Re Patrick,
J'ai voulu juste décompressé un peu sur xld. Sincèrement, j'aurai dû reporter cette discussion.
En effet, je suis crevé 🥵surtout aujourd'hui (en plein travaux chez nous).
Si tu es contrarié à cause du fichier, je suis vraiment désolé.
Demain peut-être.

Bonne soirée.
 

cp4

XLDnaute Barbatruc
non je suis pas du tout contrarié
tu es fatigué je comprends
j'ai du le faire le tableau
je regarde quelle solution la plus simple sans dico
Je fais un gros effort pour le fichier (l'original contient des données privées).
Je te remercie pour ta proposition sans dico (pour apprendre je suis preneur de toute solution).
Cependant, je voudrais resté sur mon idée.
Merci pour ta patience.
Là, c’est vraiment au lit.
 

Pièces jointes

  • Split.xlsm
    16.9 KB · Affichages: 20

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonsoir à tous,

Comme je pète le feu 🙃, j'ai fait un fichier.
Mais rien que pour t’embêter, je n'utilise pas un Split mais un Join :p.

r est le tableau résultat. Il s'affiche sur la Feuil2.

VB:
Sub tablosomme()
Dim t, i&, clef, ii&

   t = Feuil1.Range("a1").CurrentRegion
   Set dico = CreateObject("scripting.dictionary")
   dico.CompareMode = TextCompare
   For i = 2 To UBound(t)
      clef = Join(Array(t(i, 2), t(i, 3)), "|")
      If Not dico.Exists(clef) Then dico(clef) = dico.Count + 1
   Next i
   ReDim r(1 To dico.Count, 1 To 3)
   For i = 2 To UBound(t)
      clef = Join(Array(t(i, 2), t(i, 3)), "|"): ii = dico(clef)
      r(ii, 1) = t(i, 2): r(ii, 2) = t(i, 3): r(ii, 3) = r(ii, 3) + t(i, 16)
   Next i
   With Feuil2.Range("a1")
      .CurrentRegion.Clear: .Resize(UBound(r), 3) = r: .CurrentRegion.Borders.LineStyle = xlContinuous
   End With
End Sub
 

Pièces jointes

  • cp4- sommer- v1.xlsm
    20.8 KB · Affichages: 10
Dernière édition:

patricktoulon

XLDnaute Barbatruc
mmmouuais
avec un dico y a pas de sport
mais si tu y tiens et à tes split aussi alors
VB:
Sub test()
    Dim tbl(), f, r, a&
    Set f = Sheets(1)
    'on prend tout le tableau
    Set dico = CreateObject("scripting.dictionary")
    Set r = f.Range("A2:P" & f.Cells(Rows.Count, 1).End(xlUp).Row)
    For i = 1 To r.Rows.Count
        dico(r(i, 2) & "|" & r(i, 3)) = dico(r(i, 2) & "|" & r(i, 3)) + r(i, 16)
    Next
    ReDim tbl(dico.Count, 3)
    For Each elem In dico
        tbl(a, 0) = Split(elem, "|")(0)
        tbl(a, 1) = Split(elem, "|")(1)
        tbl(a, 2) = dico(elem)
        a = a + 1
    Next
[r1].Resize(dico.Count, 3) = tbl
End Sub
 

Discussions similaires

Statistiques des forums

Discussions
314 450
Messages
2 109 721
Membres
110 551
dernier inscrit
Khyolyanna