Agrégation de données

Résolu
Cricri1670 Messages postés 32 Date d'inscription samedi 15 décembre 2007 Statut Membre Dernière intervention 10 avril 2014 - 2 avril 2014 à 15:59
Cricri1670 Messages postés 32 Date d'inscription samedi 15 décembre 2007 Statut Membre Dernière intervention 10 avril 2014 - 4 avril 2014 à 12:53
Bonjour,

J'ai des tableaux sur différentes feuilles qui présentent des données de la même façon. Pour simplifier, une colonne avec le code d'une action boursière, l'autre colonne avec la quantité détenue, chaque feuille représentant un portefeuille. Les données sont à chaque fois triées par ordre alphabétique.

J'aimerai créer une feuille de synthèse sur laquelle je retrouverai l'ensemble des titres détenus sur tous les portefeuilles et, pour chaque titre, la quantité totale détenue. J'ai beau essayer les fonctions de consolidation ou autres, je n'y arrive pas, que ce soit en direct ou par macro...

Quelqu'un aurait-il une solution ?
Merci d'avance.
--

5 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 212
2 avril 2014 à 19:55
Bonjour,
Essaye d'éviter de nous parler d' "actions boursières", de "quantités détenues", de "portefeuilles", de "titres", de "consolidation", etc ...
Tu auras mon aide lorsque tu exprimeras ta demande différemment. ===>>
Excel est un tableur : il traite des colonnes, de lignes, de cellules (quel que puisse être leur contenu).
Expose-nous donc, dans cet esprit, ce que tu as (sur tes différentes feuilles) et ce que tu veux en tirer (en ne parlant que de colonnes, lignes, cellules).
Fais-le de manière claire, technique et concise. Tu auras alors mon aide.
0
jordane45 Messages postés 37712 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 20 septembre 2023 342
3 avril 2014 à 02:30
Bonjour,

En gros... tu as X feuilles...
Sur chacune de ces feuilles (tes portefeuilles) Une colonne qui contient la liste des titres et (sur la même ligne) dans une seconde colonne la quantité total correspondante.
Ces données... tu souhaites les ajouter dans une feuille de synthèse.

(Les colonnes sont identiques dans chaque feuille ? colonne A et colonne B par exemple ?)

Je dirais pour commencer :
Qu'as tu essayé de coder ? (montre nous...)

Au cas où tu n'aurais pas encore commencé.... histoire de t'aider à démarrer...
- As tu, à l'aide de l'enregistreur de Macros essayé de "copier/coller" des cellules d'une feuille à une autre ? ( fais le... tu auras un début de réponse).
- Ensuite...As tu essayé de boucler sur les feuilles de ton classeur ?
- Et pour finir, pour que tu puisses ajouter les lignes que tu colles à la suite des précédentes... as-tu cherché une instruction en VBA qui te fournirai le Numéro de la dernière ligne d'une feuille ?

NB : Comme cela t'a été dit dans une autre discussion.. ce forum n'a pas pour vocation de réaliser le code à ta place.

En suivant mes quelques remarques précédentes tu devrais pouvoir commencer à écrire du code.
Ensuite..si avec ce code tu rencontres des soucis..n'hésites à pas à venir nous demander de l'aide. (aide que nous t'apporterons alors avec plaisir).

Et voila un début de code (le travail est désormais bien maché..)
Sub test()
Dim strFSynt As String
    strFSynt = "synthese" ' nom de la feuille de synthese
    
'--------------------------------
'Boucle sur les feuilles du classeur
'--------------------------------
For Each sh In ThisWorkbook.Sheets
    'on exclut la feuille synthese
    If sh.Name <> strFSynt Then
        Debug.Print "Feuille : " & sh.Name & " --> nbLignes = " & lastRow(sh.Name)
        
        '--------------------------------
        'ici les actions de copier/coller
        '--------------------------------
        DernLigneSynthese = lastRow(strFSynt)
        Debug.Print "Feuille Synthèse : dernière ligne = " & DernLigneSynthese
        '...
        '...
    End If
Next

End Sub

Function lastRow(sheetname As String) As Integer
    lastRow = Sheets(sheetname).Range("A" & Rows.Count).End(xlUp).Row
End Function



0
Cricri1670 Messages postés 32 Date d'inscription samedi 15 décembre 2007 Statut Membre Dernière intervention 10 avril 2014
3 avril 2014 à 11:10
Bonjour et merci pour ton aide.

J'ai déjà fait tout ce que tu décris, la recopie (soit par code soit à la main pour tester) du contenu des feuilles sur une autres feuille de test. J'obtiens alors une liste avec les données d'entrée (code action) en colonne A et les quantités en colonne B. Dans la colonne A, il y a évidemment des doublons. Comment "consolider" cette colonne de façon à ce que je n'ai plus que des valeurs uniques en colonne A et la somme des valeurs correspondantes en colonne B.

J'ai bien compris que je ne demande pas aux autres de faire le travail à ma place (sinon pourquoi programmer ?) mais ce que j'ai essayé (principalement avec les fonctions sur les données pour l'instant) ne donne pas le résultat voulu.

En fait, il s'agit "juste" d'une agrégation de données (colonne B) en fonction d'une étiquette (colonne A).

Merci de ton aide.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 212
Modifié par ucfoutu le 3/04/2014 à 11:45
Je viens de recevoir un message privé étrange du demandeur, dont on ne voit toujours pas le code tenté.
Je vais donc me contenter d'appeler son attention sur une méthode toute simple :
1) dresser sur la feuille de "synthèse", sans doublons, la liste de ses "étiquettes" en colonne A
2) parcourir cette liste ainsi dressée et, pour chaque cellule de cette colonne :
--a) parcourir en boucle les feuilles
-- b) sur chaque feuille : utiliser la fonction Worksheetfunction.SUMIF. Elle retournera le nombre (appelons-le toto) en regard des étiquettes (qu'il y en ait une ou plusieurs sur la feuille) correspondantes.
--- si toto = 0 ===>> ne rien faire. Si toto > 0 ==>> incrémenter de toto la valeur en colonne B de cette ligne
Voilà tout.
Je n'interviendrai à nouveau que lorsque j'aurai constaté un début dans ce sens.

EDIT : je regrette que, par un nouveau message privé, le demandeur ait tenté le chantage d'un -1 (incroyable, mais vrai).
0
Cricri1670 Messages postés 32 Date d'inscription samedi 15 décembre 2007 Statut Membre Dernière intervention 10 avril 2014
3 avril 2014 à 12:09
Je suis l'auteur de "l'étrange" message privé...
J'ai posé trois questions sur le forum et seul UCFOUTU est capable de me faire des réponses m'expliquant que ce que je fais est inutile ou que je m'explique mal. Les administrateurs du forum sauront le constater eux-mêmes... Il n'y a que lorsque je m'étonne de cette attitude que cette personne avance dans la direction qui est le but de ce forum : aider les autres. En cela, je le remercie pour son dernier post (en mettant à part sa colère) qui m'apporte un début de réponse avec la fonction SUMIF que je vais m'empresser de regarder de plus près.

Je précise qu'il n'y a aucun chantage de ma part au -1. Lors d'une question précédente, une des réponses de UCFOUTU me paraissant particulièrement "inadaptée", je lui en avais attribué un que j'ai retiré suite à un changement d'attitude. Je m'étonnais juste de retrouver ce +1/-1 à coté de la réponse de jordane45, et pas à coté de celle de UCFOUTU. C'est dire mon ignorance du fonctionnement du forum. L'utilisation du message privé était donc pour moi la seule solution de répondre à ce monsieur.

Ce n'est que mon avis, mais je ne trouve pas que son attitude colle avec l'esprit d'un forum d'entraide qui ne devrait pas non plus à régler des comptes.

Merci néanmoins pour cette fonction que je vais regarder.
--
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 212
3 avril 2014 à 12:42
Les "notes" que tu "mets" : sont-elles selon toi celles que méritent ceux auxquels tu les "mets" ou celles que tu mériterais ?
Bref ...
Je te souhaite bonne chance dans tes démarches.
0
jordane45 Messages postés 37712 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 20 septembre 2023 342
3 avril 2014 à 13:23
J'ai posé trois questions sur le forum et seul UCFOUTU est capable de me faire des réponses m'expliquant que ce que je fais est inutile ou que je m'explique mal
En général c'est parce qu'il a été le premier à te répondre..sinon ça aurait tout aussi bien pu être moi qui me serais permis de te faire des remarques sur la rédaction de tes questions.

Je t'invite d'ailleurs à lire ceci :
http://codes-sources.commentcamarche.net/contents/11-charte-de-commentcamarche-net-conseils-d-ecriture

Il y est bien indiqué (entre autres choses) que :
1 - Nous ne faisons ni les recherches ni l'écriture des codes à votre place
2 - Que lorsque vous posez une question... vous devez être le plus explicite / Précis / Détaillé possible et; s'il existe,..joindre votre code.

Un bon exemple :
lorsque tu me dis :
J'ai déjà fait tout ce que tu décris, la recopie (soit par code soit à la main pour tester)
N'aurais-tu pas pu nous le dire dès le départ ??? ça m'aurait éviter de perdre du temps à te proposer ce code...
Et ainsi... on aurait pus essayer de te proposer quelque chose qui collerait directement avec tes besoins.......

J'espère donc que par la suite... tu seras plus vigilant quant à la rédaction (le contenu, le fond et la forme..) de tes questions.
Tu obtiendras plus (et surement de meilleurs) réponses que ce soit de ma part, celle d'Ucfoutu ou des autres membres du forum.


0
Cricri1670 Messages postés 32 Date d'inscription samedi 15 décembre 2007 Statut Membre Dernière intervention 10 avril 2014
3 avril 2014 à 13:59
Je prends note de ces remarques et je serai plus vigilant lors de la rédaction de mes questions même si je ne comprends pas ce que l'on peut reprocher sur la forme. Par contre, ma question était effectivement plus vaste que ce qui me bloque : agréger les données d'une colonne selon le contenu d'une autre.

Concernant ucfoutu, tu as dû remarquer que je n'ai pas le même ton à ton égard. Ce n'est pas un hasard. Je vais tester sa suggestion et je mettrai le sujet en résolu si c'est le cas.

J'aimerai juste savoir (hors macro ou VBA) quelle fonction Excel qui peut faire cet agrégat (je transposerai ensuite sous forme de macro ou code).

Merci de ton aide et désolé de t'avoir fait perdre du temps.
0
jordane45 Messages postés 37712 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 20 septembre 2023 342
3 avril 2014 à 14:51
je serai plus vigilant lors de la rédaction de mes questions même si je ne comprends pas ce que l'on peut reprocher sur la forme
Tes questions manquent de détail.
Tu n'indiques pas non plus ce que tu as déjà essayé
Tu ne montres aucun CODE
En gros..voila ce qui manque.. ^^

Concernant ucfoutu, tu as dû remarquer que je n'ai pas le même ton à ton égard. Ce n'est pas un hasard.
En fait.. je le comprend... ce n'est pas forcément contre toi.. c'est juste que vu le nombre de personnes qui viennent ici en espérant pouvoir faire leur marché ( qu'on leur fournisse un code tout prêt..fait sur mesure) et qui ne respectent pas la charte du site.....on a tendance à ressentir une certaine "lassitude"..
Et puis... même si Ucfoutu a un sale caractère..( mais on l'aime bien quand même :-) ) on sait que ses réponses techniques sont des plus pertinentes.


quelle fonction Excel qui peut faire cet agrégat
Il existe plein de façons de faire... et d'exemples sur le net.
http://lmgtfy.com/?q=excel+synth%C3%A8se+plusieurs+feuilles


Par exemple (par formule):
http://office.microsoft.com/fr-fr/excel-help/consolider-des-donnees-dans-plusieurs-feuilles-de-calcul-HP010095249.aspx#BMconsolidate_by_formula
0
Cricri1670 Messages postés 32 Date d'inscription samedi 15 décembre 2007 Statut Membre Dernière intervention 10 avril 2014
Modifié par Cricri1670 le 3/04/2014 à 17:24
Merci pour ces précisions et ce ton apaisé.

En fait, je n'ai pas été précis volontairement car je ne savais pas si la meilleure solution était de passer par le code (je sais recopier des Range, les trier...) ou par une fonction Excel. C'est la raison pour laquelle je n'ai pas recopié mes embryons de code (je débarque en VBA, programmant plus souvent en VB.NET).

Je te remercie pour tes liens et j'en ai trouvé également de mon coté qui suggèrent l'utilisation de la fonction "Données>Consolider", fonction que je n'ai pas encore réussi à faire fonctionner. Je vais donc continuer de creuser dans ce sens...

Merci encore. Je classe comme résolu puisque la réponse passe par une fonction "basique".
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 212
Modifié par ucfoutu le 3/04/2014 à 18:06
Bon ...
Il suffisait pourtant d'être précis dès le départ ...(et les précisions étaient demandées).
L'affaire est on ne peut plus simple, y compris si l'on ne sait pas traiter les doublons. Y compris si l'on ne veut pas s'embarquer dans des SUMIF. Y compris si l'on ne sait pas encore déterminer la dernière ligne de chaque feuille.
Je vais faire ici exprès de ne faire appel à rien de tout cela. Me contenter, en fait, des notions les plus élémentaires ===>>
Dim F As Worksheet, C As Range, E As Range, ou As Long, S As Worksheet
Set S = Worksheets("synthese")
S.Cells.ClearContents
ou = 1
For Each F In Worksheets
If Not F Is S Then
On Error Resume Next 'juste pour le cas fort improbable où une feuille serait comploètement vide
For Each C In F.Columns("A").SpecialCells(xlCellTypeConstants)
On Error GoTo 0
Set E = S.Columns("A").Find(what:=C.Value, LookIn:=xlValues, lookat:=xlWhole)
With S
If E Is Nothing Then
.Range("A" & ou).Value = C.Value
.Range("B" & ou).Value = C.Offset(0, 1).Value
ou = ou + 1
Else
.Range("B" & E.Row).Value = .Range("B" & E.Row).Value + C.Offset(0, 1).Value
End If
End With
Next
End If
Next
Voilà !

Qu'il me soit maintenant permis d'ajouter (à l'intention des forumeurs qui passeraient par là) un point qui est très loin d'être sans importance :
Si l'on veut éviter des désagréments avec une application de ce genre, il est absolument indispensable d'utiliser une feuille annexe ou une base de données. Y mettre les "étiquettes" acceptées et vérifier que chaque nouvelle saisie correspond bien à une étiquette ainsi répertoriée est la seule garantie contre les erreurs éventuelles de saisie (et donc des résultats inattendus).
Etre à ce propos adroit permettra de faciliter la tâche de l'utilisateur ===>> au lieu de l'obliger à saisir, on lui propose une sélection au moment-même où il entre dans une cellule "étiquette". J'ai eu au moins deux fois l'occasion de montrer comment procéder pour ce faire.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Cricri1670 Messages postés 32 Date d'inscription samedi 15 décembre 2007 Statut Membre Dernière intervention 10 avril 2014
Modifié par Cricri1670 le 3/04/2014 à 18:45
Merci ucfoutu !

J'avais entre temps testé la fonction "Données>Consolider" mais elle ne me convient pas du fait qu'elle ajoute une sorte d'arborescence sur le coté. Comme je l'ai expliqué à jordane45, ma question était vague car je ne savais pas si il fallait passer par du code ou une fonction telle que celle essayée.

Je vais tester ton code que je ne comprends pas intégralement pour le moment. Néanmoins, j'apprécie ton geste et je ne sollicite plus les membres avant d'avoir compris et testé ce que tu me proposes.

Concernant ton idée de stocker les données sur une feuille annexe, j'y avais songé car je savais que c'est une idée plus que recommandable. Je ne l'ai pas appliqué pour le moment mais j'y viendrais sans doute, à moins que tout ceci ne prenne finalement la forme d'une application VB.NET...

Pour le coup, j'aurais aimé mettre un +1 (mérité) mais ton code a été mis en commentaire au lieu de réponse (si je commence à bien saisir le fonctionnement du forum).

Merci à tous d'avoir pris le temps de me répondre.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 212
3 avril 2014 à 18:49
Je n'aime ni les -1 lorsqu'ils sont à côté de la plaque, ni les +1 pour saluer un code élémentaire.
Mon code est donc en commentaires de manière totalement délibérée.
0
Cricri1670 Messages postés 32 Date d'inscription samedi 15 décembre 2007 Statut Membre Dernière intervention 10 avril 2014
4 avril 2014 à 09:54
Si l'élémentaire rend service...
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 212
Modifié par ucfoutu le 4/04/2014 à 10:44
Ce qui rend service, c'est la gymnastique de l'esprit. Le reste n'est que récitation.
Le code que j'ai écrit plus haut pourrait par exemple et parmi mille et une autres possibilités toutes différentes, faire l'objet d'une autre gymnastique très différente de l'esprit et être en conséquence un tout autre code.
Ce qui compte, ce n'est pas le code (qui n'est jamais rien d'autre que de l'élémentaire) , mais cette gymnastique de l'esprit.

Je reviens dans quelques minutes te le prouver.

EDIT ===>>> tiens ===>> écrit à toute allure et même un peu bâclé. ===>>>
Dim F As Worksheet, ou As Long, S As Worksheet, T As Range, asuppr As Range
Set S = Worksheets("synthese")
S.Cells.ClearContents
ou = 1
For Each F In Worksheets
If Not F Is S Then
On Error Resume Next 'juste pour le cas fort improbable où une feuille serait comploètement vide
Set T = F.Columns("A").SpecialCells(xlCellTypeConstants)
F.Range("A1:B" & T.Rows.Count).Copy Destination:=S.Range("A" & ou)
ou = ou + T.Rows.Count
On Error GoTo 0
End If
Next
For ou = S.Columns("A").SpecialCells(xlCellTypeConstants).Rows.Count To 1 Step -1
If WorksheetFunction.CountIf(S.Range("A1:A" & ou), S.Range("A" & ou).Text) = 1 Then
S.Range("B" & ou).Value = WorksheetFunction.SumIf(S.Columns("A"), S.Range("A" & ou).Text, S.Columns("B"))
Else
If asuppr Is Nothing Then Set asuppr = S.Rows(ou) Else Set asuppr = Union(asuppr, S.Rows(ou))
End If
Next
asuppr.EntireRow.Delete
===>> autre approche ===>> autre gymnastique ===>> autre code
Celui-ci implique qu'aucune de tes feuilles ne comporte de "trou" en colonne A
Essaye d'en inventer maintenant toi-même un autre. C'est ainsi, que l'on se forme.

Pour que tu comprennes mieux ce que j'essaye de dire : sache que je n'ai personnellement aucun modèle, que, donc, j'écris rarement le même code, préférant laisser complètement libre mon imagination du moment.
0
Cricri1670 Messages postés 32 Date d'inscription samedi 15 décembre 2007 Statut Membre Dernière intervention 10 avril 2014
4 avril 2014 à 12:53
Je partage totalement ce point de vue : il y a plusieurs codes pour une même solution, même si certaines approches sont plus propres que d'autres.

Ton premier code fonctionne parfaitement et même si tu le considères comme "élémentaire", il apprend beaucoup au néophyte VBA que je suis. Je vais, de la même façon décortiquer ton second code pour le comprendre aussi bien et pour la "gymnastique de l'esprit" que j'affectionne aussi ;-)

Si j'ai pesté contre certaines de tes réactions, je ne peux que te remercier de passer du temps pour m'aider à progresser et souligner tes connaissances techniques. Même "basiques", elles sont utiles pour avancer. Merci.
0
Rejoignez-nous