XL pour MAC Créer un sous groupe à partir d'un groupe

  • Initiateur de la discussion Initiateur de la discussion rtlv17
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

rtlv17

XLDnaute Junior
Bonjour, je souhaite créer une liste de sous groupe à partir d'un groupe d'éléments.

Je m'explique :

A partir d'une liste que j'appelle compte et qui contient des éléments tels que : Alimentation ; Cadeaux ; Voitures ; Loisirs ...

Je souhaite, au regard de chaque compte lister des noms tels que : Intermarché,Leclerc,Boulangerie... ; Pierre,Paul,Jacques... ; Porsche,Ferrari,Renault... ; SNCF,Parc,Livres...

Les informations viennent d'un onglet "journal" dans lequel je saisi au quotidien mes dépenses.

De préférence une formule car je ne suis pas expert en VBA

Merci beaucoup.

A bientôt

Un exemple :
 

Pièces jointes

Solution
Bonjour à tous🙂,

Avec une formule matricielle en J4 à copier vers la droite et vers le bas :
VB:
=SIERREUR(INDEX($E:$E;PETITE.VALEUR(SI(SI($D$1:$D$23=J$3;EQUIV($E$1:$E$23;$E$1:$E$23;0);"")=LIGNE($D$1:$D$23);LIGNE($D$1:$D$23);"");LIGNES($1:1)));"")

nota : la formule ôte les doublons dans chaque colonne du résultat.

1752767718509.png
 

Pièces jointes

Dernière édition:
Bonjour à tous🙂,

Avec une formule matricielle en J4 à copier vers la droite et vers le bas :
VB:
=SIERREUR(INDEX($E:$E;PETITE.VALEUR(SI(SI($D$1:$D$23=J$3;EQUIV($E$1:$E$23;$E$1:$E$23;0);"")=LIGNE($D$1:$D$23);LIGNE($D$1:$D$23);"");LIGNES($1:1)));"")

nota : la formule ôte les doublons dans chaque colonne du résultat.

Regarde la pièce jointe 1220491
Merci pour cette solution.

Mon véritable fichier, beaucoup plus complet que dans mon exemple et que je peux pas transmettre est constitué de 9 différents onglets.
Notamment le journal est dans un autre onglet nommé "journal" et le tableau comporte beaucoup plus de colonnes;
Les colonnes qui contiennent les données qui m'intéressent sont "C" et "D" et la première ligne débute à la ligne 83.
Le tableau dans lequel je souhaite collecter les données donc la formule se trouve dans un onglet nommé "Matrice".

J'ai essayé de modifier le noms des cellules et colonnes (Journal!$C$83:$C$1200...) mais ça ne fonctionne pas.

Merci tout de même.
 
Bonjour à tous🙂,

Avec une formule matricielle en J4 à copier vers la droite et vers le bas :
VB:
=SIERREUR(INDEX($E:$E;PETITE.VALEUR(SI(SI($D$1:$D$23=J$3;EQUIV($E$1:$E$23;$E$1:$E$23;0);"")=LIGNE($D$1:$D$23);LIGNE($D$1:$D$23);"");LIGNES($1:1)));"")

nota : la formule ôte les doublons dans chaque colonne du résultat.

Regarde la pièce jointe 1220491
Bonjour,

je renouvelle ma requête car je n'arrive pas à adapter la solution (pourtant sûrement juste) de "ma pomme" que je remercie.

En effet, je tente de comprendre les fonctions utilisées pour les transposer mais cela ne fonctionne pas.

Je joins donc un nouvel exemple avec la même requête mais en expliquant ma problématique pour l'adapter à mon application (qui est un peu "usine à gaz").

Merci encore pour vos tentatives et solutions...

à bientôt
 

Pièces jointes

Re,

Il faut toujours fournir un petit classeur exemple qui est le reflet fidèle de la structure de votre classeur source. Il faut aussi, dans ce petit classeur exemple, fournir un exemple de résultat conforme à ce qu'on désire.

Sans quoi, on part dans des allers-retours "demandeurs/répondeurs" répétitifs qui vont vite lasser les répondeurs.

Pour ce que vous souhaitez, il faut bien sûr ne pas éliminer les doublons. Les formules ont été revues et, comme on conserve les doublons, les formules sont devenues plus simples.

Quelques explications sont aussi fournies sur la feuille "Tableau de bord". Les formule fournies prennent en compte les lignes du "Journal" jusqu'à la ligne 2000.
 

Pièces jointes

Re,

Il faut toujours fournir un petit classeur exemple qui est le reflet fidèle de la structure de votre classeur source. Il faut aussi, dans ce petit classeur exemple, fournir un exemple de résultat conforme à ce qu'on désire.

Sans quoi, on part dans des allers-retours "demandeurs/répondeurs" répétitifs qui vont vite lasser les répondeurs.

Pour ce que vous souhaitez, il faut bien sûr ne pas éliminer les doublons. Les formules ont été revues et, comme on conserve les doublons, les formules sont devenues plus simples.

Quelques explications sont aussi fournies sur la feuille "Tableau de bord". Les formule fournies prennent en compte les lignes du "Journal" jusqu'à la ligne 2000.
Merci beaucoup pour ces nouvelles explications.
J'ai tenté de transposer votre tableau de l'onglet "Tableau de bord" vers l'onglet qui s'appelle en réalité "Matrice" de mon appli : ça ne fonctionne pas ; je n'arrive pas à valider la formule matricielle.

Je transmettrai demain un exemple de cette appli que j'ai créée avec un exemple de ce que je souhaite.

A bientôt
 
Bonjour à tous,

comme promis, un exemple de mon appli avec, dans l'onglet "Journal" les informations sources et dans l'onglet "Matrice" en BY3, le résultat souhaité.

Pour ce qui est des montants, je pense que je peux m'en sortir ;
J'ai seulement besoin de trier les Comptes et leurs détails.

Merci
 

Pièces jointes

Bonjour rtlv17, le forum,
De préférence une formule car je ne suis pas expert en VBA
Voici une solution VBA, si elle ne vous intéresse pas elle pourra en intéresser d'autres.

La macro se lance par les touches Ctrl+F :
VB:
Sub Filtre_comptes()
'---se lance par les touches Ctrl+F---
Dim dest As Range, tablo, d As Object, col%, c As Range, x$, n&, resu(), i&, y$, nn&, v
Set dest = Sheets("Matrice").[BX3].CurrentRegion
With Sheets("Journal")
    If .FilterMode Then .ShowAllData 'si la feuille est filtrée
    tablo = .Range("B7:I" & .Cells(Rows.Count, 2).End(xlUp).Row) 'matrice, plus rapide
End With
Set d = CreateObject("Scripting.Dictionary")
d.CompareMode = vbTextCompare 'la casse est ignorée
For col = 1 To dest.Columns.Count Step 2
    Set c = dest.Cells(1, col)
    x = LCase(Trim(c))
    n = 0
    ReDim resu(1 To UBound(tablo), 1 To 2) 'réinitialise le tableau des résultats
    For i = 1 To UBound(tablo)
        If LCase(Trim(tablo(i, 2))) = x Then
            y = Trim(tablo(i, 3))
            If Not d.exists(y) Then
                n = n + 1
                d(y) = n 'mémorise la ligne
                resu(n, 1) = y
            End If
            nn = d(y)
            v = tablo(i, 8)
            If IsNumeric(v) Then resu(nn, 2) = resu(nn, 2) + CDbl(v)
        End If
    Next i
    If n Then c(2).Resize(n, 2) = resu 'restitution
    c(2).Offset(n).Resize(Rows.Count - n - c.Row, 2).ClearContents 'RAZ en dessous
Next col
dest.CurrentRegion.Columns.AutoFit 'ajustement largeurs
dest.Parent.Visible = xlSheetVisible 'au cas où
Application.Goto dest 'active la feuille
dest(1).Select
End Sub
A+
 

Pièces jointes

Bonjour rtlv17, le forum,

Voici une solution VBA, si elle ne vous intéresse pas elle pourra en intéresser d'autres.

La macro se lance par les touches Ctrl+F :
VB:
Sub Filtre_comptes()
'---se lance par les touches Ctrl+F---
Dim dest As Range, tablo, d As Object, col%, c As Range, x$, n&, resu(), i&, y$, nn&, v
Set dest = Sheets("Matrice").[BX3].CurrentRegion
With Sheets("Journal")
    If .FilterMode Then .ShowAllData 'si la feuille est filtrée
    tablo = .Range("B7:I" & .Cells(Rows.Count, 2).End(xlUp).Row) 'matrice, plus rapide
End With
Set d = CreateObject("Scripting.Dictionary")
d.CompareMode = vbTextCompare 'la casse est ignorée
For col = 1 To dest.Columns.Count Step 2
    Set c = dest.Cells(1, col)
    x = LCase(Trim(c))
    n = 0
    ReDim resu(1 To UBound(tablo), 1 To 2) 'réinitialise le tableau des résultats
    For i = 1 To UBound(tablo)
        If LCase(Trim(tablo(i, 2))) = x Then
            y = Trim(tablo(i, 3))
            If Not d.exists(y) Then
                n = n + 1
                d(y) = n 'mémorise la ligne
                resu(n, 1) = y
            End If
            nn = d(y)
            v = tablo(i, 8)
            If IsNumeric(v) Then resu(nn, 2) = resu(nn, 2) + CDbl(v)
        End If
    Next i
    If n Then c(2).Resize(n, 2) = resu 'restitution
    c(2).Offset(n).Resize(Rows.Count - n - c.Row, 2).ClearContents 'RAZ en dessous
Next col
dest.CurrentRegion.Columns.AutoFit 'ajustement largeurs
dest.Parent.Visible = xlSheetVisible 'au cas où
Application.Goto dest 'active la feuille
dest(1).Select
End Sub
A+
Bonsoir job75
Merci beaucoup pour votre réponse.
Malheureusement je ne suis pas capable d'adapter votre solution à mon application car ne ne connait pas du tout VBA.
J'ai déjà eu l'occasion d'adapter des macros à mes applications car j'arrivais à repérer les noms de pages de lignes ou de colonnes.

Votre solution est trop pointue pour moi.

Merci tout de même

Bon WE
 
Bonjour rtlv17, le forum,

Ma macro est adaptée au fichier que vous avez déposé au post #10.

Si celui-ci ne correspond pas au fichier réel pourquoi l'avoir déposé ?

A+
Bonjour job75,

Tout simplement car celui ci est trop lourd, même vide donc je ne peux pas joindre ce fichier et il contient des données personnelles.
Pour que je puisse le transmettre, il a fallut que je supprime toutes les formules qu'il contient.
Eventuellement, je retransmet le fichier et tous ses onglets après l'avoir allégé au maximum.

N'étant pas expert de vba, je suis dans l'impossibilité de rechercher pourquoi votre macro ne fonctionne pas avec mon fichier complet.

Certain que vous faites le maximum pour m'aider et je vous en remercie.

Je tâche de décortiquer et comprendre les formules qui m'ont été envoyées précédemment avec les fonctions Index, Petite.valeur, Ligne et Lignes afin de pouvoir réécrire la bonne formule adaptée à mon fichier qui comporte en réalité 12 onglets.

Merci encore,
Bon dimanche.
 

Pièces jointes

Re bonjour à tous,
J'ai essayé de copier et de coller la solution de "ma pomme" mais cela ne fonctionne pas.
Mais je pense que je ne suis pas loin !!
Je triture les formules sans vraiment savoir ce que je fais, je fins par en comprendre quelques unes tout de même.

Je joins un fichier vierge qui correspond à mon application.
Sur ce fichier, j'y ai entré des valeurs, dans l'onglet "Journal" et j'ai collé le tableau de "ma pomme" dans l'onglet "Matrice".
Mais je bloque.

La formule ne semble pas être matricielle (avec cmd-shift-enter).

Si quelqu'un peut m'expliquer ce serait avec plaisir.

A bientôt
 

Pièces jointes

- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Retour