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

Staple1600

XLDnaute Barbatruc
Bonsoir le fil

Puisque j'entends parler fatigue et autre prise de tête
Pourquoi se compliquer la vie?
Pourquoi ne pas faire plaisir à Excel en utilisant ses fonctions natives?
WhyNot.jpg

1) Données/ Sous-total
1) Insertion/Tableau croisé dynamique
Cela se fait rapidement à la souris, intuitivement. ;)

NB: Si il y a des homonymes au niveau des noms, on rajoutera une colonne concaténée Nom&prénom sur laquelle se régleront le sous-total ou le TCD.
 

cp4

XLDnaute Barbatruc
Bonjour Mapomme;), PatrickToulon;), Staple1600;), Laurent950 ;),

Messieurs toute ma gratitude. Merci infiniment.
Je ne connais pas toutes les possibilités offertes par le VBA. Comme j'ai utilisé la concaténation en ajouter un caractères spéciales, ça m'a fait pensé à la fonction Split.

@Staple1600 : Merci pour ta proposition TCD, mais que je ne suis pas vraiment un adepte. Il faudrait que je fasse un effort pour m'y mettre.

Encore merci et passez un très bon week-end.
 

cp4

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
Je te remercie beaucoup pour ton code mais il y a quelque chose qui ne va pas.
Une image vaut mieux qu'un long discours
Sans titre.jpg

Je t'avais bien dit que pour apprendre toute proposition était la bienvenue
Bonne journée.

edit: j'ai trouvé ---> ReDim tbl(dico.Count - 1, 2) au lieu de
ReDim tbl(dico.Count , 3)
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Bonsoir mapomme et patricktoulon

Faudra qu'on m'explique l’intérêt* de sortir le dico, le VBA et tutti quanti quand dans ce cas, on peut faire natif ?
(cf 1er message de moi-même dans ce fil)
Et ce quelles que soient les substances psycho-actives absorbées par la personne assise devant son tableur préféré? ;)

NB: *A part pour confiner dans VBE en attendant le messie*.
(*Je parle de celui chanté par Ange dans les seventies) ;)
 

Staple1600

XLDnaute Barbatruc
Re

Certes
Mais est-on toujours obliger de répondre aux questions posées directement?
Ne peut-on pas prendre le temps de conseiller/suggérer qu'il faut mieux un marteau pour enfoncer un clou qu'une barre à mine?
Pour ce que j'en dis itou...

[addenda]
Personnellement, j'ai résumé la question à:
faire la somme pour chaque personne (nom, prénom dans les colonnes différentes).
Tâche typique d'un tableur
Et comme il y a des outils prêts à l'emploi dans le dit tableur pour ce faire.
Pourquoi s'en priver?
NB: J'ai rien contre les dico et je ne suis pas maciste.
(Pour les ceusses qui le sont en revanche... ;))
[/addenda]


PS1:Non pas d'insomnie.
Juste un petit pissou.
Qui m'a permis de me rendre compte que j'avais laissé mon PC allumé.
PS2: Pas saisi l'allusion au crampon
(ou alors dans une acceptation narquoise à mon endroit.
Ce qui n'est pas gentil dans un monde en pleine pandémie)
;)
 
Dernière édition:

cp4

XLDnaute Barbatruc
Bonjour JM,

En fait, j'ai simplifié pour illustrer le problème aux données d'une feuille de calcul.
En réalité, c'est pour être utilisé dans un userform.
Je suis aussi passé par une feuille surtout pour m'assurer que les résultats sont justes.
Je n'ai pas vos compétences pour coder "à main levée".
J'espère un jour atteindre votre niveau. Pour le moment, j'avance à mon rythme et j'ai tout mon temps.
C'est à dire que je n'ai aucune contrainte. Très souvent, je pose des questions pour aider d'autres membres à qui on n'a pas répondu.

Bon week-end.
Paul
 

zebanx

XLDnaute Accro
Bonjour à tous ces intervenants bien connus :) , le forum

Pour l'utilisation d'une clé "double" qui m'a longtemps posé problème, j'utilise un code très utile de la bien trop rare Laetitia 90 :).
On cumule les méthodes, différentes et qui font le travail, mais c'est effectivement comme cela qu'on apprend. Et sur les SD, je n'ai pas oublié Mapomme le temps consacré à m'expliquer et à dé-brouillarisé un sujet complexe que le debug print n'aide jamais, pour ceux à un stade intermédiaire, à comprendre avec facilité. ;)

Bonne journée, xl-ment
zebanx

VB:
Sub sd_laetitia90()
' code transmis par laetitia90
Dim t(), i As Long, m As Object, C As Byte, z
Set m = CreateObject("Scripting.Dictionary")

Sheets(1).Select
t = Range("A2:P" & Cells(Rows.Count, 1).End(3).Row).Value2
For i = 1 To UBound(t)
    z = t(i, 2) & t(i, 3)
    If m.Exists(z) Then
         t(m(z), 3) = t(m(z), 3) + t(i, 16)
    Else
        x = x + 1
        For C = 1 To 2: t(x, C) = t(i, C + 1): Next C
        t(x, 3) = t(i, 16)
        m(z) = x
    End If
  Next i
[v1].Resize(x, 3) = t
End Sub
 

mapomme

XLDnaute Barbatruc
Supporter XLD
NB: J'ai rien contre les dico et je ne suis pas maciste.
(Pour les ceusses qui le sont en revanche... ;))
Puisque tu me le suggères, un essai, assez rapide, qui marche aussi pour les macistes. A moitié Excel, à moitié VBA (ça le fait, Staple1600 ? 😜 ). Pour 100 000 lignes, environ 1.20 sec.

Le tableau résultat s'appelle "Result" dans le VBA.

nota : garanti sans OGM ni dictionary.
 

Pièces jointes

  • cp4- sommer- v3.xlsm
    25.4 KB · Affichages: 26
Dernière édition:

Discussions similaires