XL 2013 Regroupement de données selon plusieurs critères..

anri0610

XLDnaute Junior
L’idéal que j'essayait d'expliquer aurait seulement été :

COLONNE I-----------------COLONNE J

NOM identique
valeur identique
valeur identique
valeur identique
somme1-----------------------couleur1
somme2-----------------------couleur2

etc

Au lieu de :

NOM identique
valeur identique
valeur identique
valeur identique
somme-------------------------couleur1

NOM identique
valeur identique
valeur identique
valeur identique
somme-------------------------couleur2

etc

mais si ce n'est pas possible ce n'est pas grave séparer les valeur de cette colonne F serait déjà un énorme soulagement!
 

Dranreb

XLDnaute Barbatruc
Alors c'est impossible.
Il faut choisir. Soit on regroupe sur la colonne A soit on regroupe sur la colonne F. On ne peut pas faire les deux en même temps. À moins qu'ils soient hiérarchisés l'un par rapport à l'autre, dans un sens ou dans l'autre. C'est soit -2, -3, -4, 1, 6 soit -2, -3, -4, 6, 1. Ça ne peut pas être à la fois -2, -3, -4, 1 pour les noms et -2, -3, -4, 6 pour les couleurs. À moins de le faire en deux fois, en passant par un tableau intermédiaire.
Le projet VBA de votre classeur PERSONAL.xlsm est protégé par un mot de passe.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour.
J'ai mis en œuvre cette 1ère solution évoquée, en 2 passes, dans le classeur joint.
C'est dommage, avec une présentation plus classique ç'aurait été plus facile en utilisant un système de ventilation par colonne n'ayant pas besoin de regroupement. Mais on perd le principe de mettre tous les chiffres en colonne I, et du coup ça compliquerait un système de coloriage en rouge de certains chiffres, que je n'ai donc pas fait pour ça. J'ai en effet quand même aussi proposé cette seconde solution.
 

Fichiers joints

anri0610

XLDnaute Junior
Bonjour ,
merci beaucoup, impatient de tester votre solution !
oui je comprend le plus gros soucis est de devoir avoir cette mise en forme pour la transposer tel quelle apres..

milles excuses je vous joint le classeur sans mot de passe.

PS: Pardon j'obtient une erreur au lancement de la macro, pouvez vous regarder s'il vous plait, je vous joint le print screen.
 

Fichiers joints

Dranreb

XLDnaute Barbatruc
Bonjour.
Vraiment pénibles ces lettres accentuées mal reproduites au Japon dans les noms de variables !

Par ailleurs je n'ai pas trouvé vos essais de le faire vous même dans votre PERSONAL .xlsm.
Et toujours ces instructions idiotes qui remettent 50 fois les mêmes mises en formes conditionnelles.
Je ne sais pas pourquoi vous le joignez. Si au moins vous faisiez au début un FormatConditions.Delete pour tout nettoyer préalablement…
 
Dernière édition:

anri0610

XLDnaute Junior
ah c'est encore un problème de syntaxe ..
Désoler pour les problèmes inutiles... l'accent grave ne passe pas , même en shortcut il ne s'affiche pas dans le code VBA,
j'ai essayer par hasard en anglais... sans résultat.
que faire ><!
 

Dranreb

XLDnaute Barbatruc
Ben remplacez tous les é, è, ê par e et à par a dans tout le projet.

Ah puis j'avais encore oublié le À par A.
 

Fichiers joints

Dernière édition:

anri0610

XLDnaute Junior
Impressionnant.
votre solution 1 est parfaite et votre solution 2 très intéressante !
encore merci votre aide m'est vraiment précieuse!

mon seul soucis dans les deux cas serait de garder la même ligne (emplacement/ordre vertical) pour chaque couleur a chaque regroupement,
première couleur de référence =position 5
deuxième = position 5+1
troisième= position 5+2
etc

si cela est possible ça serait parfaitement opérationnel!
je vous joint les print screen qui seront je l’espère plus explicite!
 

Fichiers joints

anri0610

XLDnaute Junior
Pardon,
j'ai voulu tester la macro avec un autre fichier et j'obtient des erreurs, je vous joint les printscreen,

a noter que j'ai pris soin de copier le module Mgigogne correspondant et le module de classe SsGr
dans mon classeur de macro, je n'ai donc pas de soucis via mon classeur a effectuer les macro,
pour le fichier TEST,

ensuite j'ai vérifier avec le fichier original du test que je vous ai envoyer, et toujours pas de soucis.
les erreur proviennent uniquement de l'utilisation dans un autre cas avec un autre fichier..
 

Fichiers joints

Dranreb

XLDnaute Barbatruc
Oui ça a l'air possible de les mettre l'un en dessous de l'autre en modifiant légèrement la solution 2
Les indice en dehors de limites viennent de ce qu'il manque des tirets dans la 1ère colonne, et donc des champs à analyser pour les répétitions. Je les remplace par des "?" et je m'arrête là pour ce détail. Ne me demandez pas de faire autre chose, si ça ne vous plait pas débrouillez vous pour ce cas.
 

Dranreb

XLDnaute Barbatruc
Bon, ce sera ma dernière proposition en ce qui concerne le regroupement sur la 1ère colonne
VB:
         For Each Arg4 In Arg3.Co
            ReDim TJoin(1 To Arg4.Count): J = 0: ReDim TS1(-1 To -1)
            For Each Arg1 In Arg4.Co
               TS2 = Split(Arg1.Id, "-")
               For P = 0 To UBound(TS2) - 1: TS2(P) = TS2(P) & "-": Next P
               For P = 0 To UBound(TS1): If P >= UBound(TS2) Then Exit For
                  If TS2(P) <> TS1(P) Then Exit For
                  Next P
               Nom = "": While P <= UBound(TS2): Nom = Nom & TS2(P): P = P + 1: Wend
               J = J + 1: TJoin(J) = Nom: TS1 = TS2: Next Arg1
Quant à savoir si on saura toujours interpréter humainement le texte dans les cas les plus tordus, c'est une autre histoire…
 

Fichiers joints

anri0610

XLDnaute Junior
Bonjour,
Merci Dranreb pour votre solution elle fonctionne parfaitement, je m'en sers tous les jours et grâce a vous je peux montrer a mes collègues que via un ordinateur on peut effectuer énormément de choses!

je souhaiterai avoir votre avis et si possible un conseil,
j'essaye actuellement d'ajouter la dernière colonne de valeurs G au regroupement,
le but serait en de garder le fonctionnement actuel avec les couleurs,
et de séparer les regroupement actuels si la valeur de la colonne G diffère et en affichant celle ci a droite de la couleur correspondante .

j'ai alors essayer d'utiliser la solution 2 que vous avez créer pour le regroupement via la colonne F,
je l'ai modifier et créé un module appelé ModuleSol3 et j'en suis arriver a un résultat qui remplace le regroupement via la colonne F par la colonne G
(je ne sais pourquoi les autres données s'en trouvent erronées mais bref),

je souhaiterai votre avis si vous voulez bien,

serait il pour le résultat souhaite que je vous joint en print screen ,
plus adéquat d'opter pour l' ajout d'un Arg supplémentaire au regroupement,
ou bien comme pour les couleurs de passer via un Dico?
Comme vous pourrez le voir si la valeur de cette colonne G diffère,
il faudrait effectuer un nouveau regroupement car c'est un autre produit,
c'est ce qui me fait penser a une structure de regroupement avec un Arg en plus tout en gardant la structure actuelle pour les couleurs.
Cependant dans ce cas la est ce possible d' afficher sa valeur correspondante comme dans l'exemple sol souhaite ?

merci !
 

Fichiers joints

Dranreb

XLDnaute Barbatruc
Bonjour.
Je ne sais pas quoi vous dire. L'exemple n'est pas suffisant pour définir le résultat souhaité dans tous les cas de figures.
Dans votre essai vous n'utilisez qu'un seul Dictionary en y écrasant l'inventaire sur la colonne 6 par celui sur la colonne 7. Il en résulte que les Detail(6) ne s'y trouvent plus et que Dico(Detail(6)) donne toujours 0, et donc les C = L + Dico(Detail(6)) toujours L, de sorte que tout vient se cumuler à la valeur de la colonne 4, sur la 4ième ligne du paquet.
Si vous voulez le faire par des SsGr supplémentaires il faut deux passes parce qu'ils sont toujours contradictoires avec ceux sur Arg1, mais dans ce cas je ne vois pas comment vous allez conserver le principe des emplacements fixes verticalement.

Édition: Très étonné qu'il vous ait fallu démontrer à des collègues japonais qu'on peut effectuer énormément de choses avec un ordinateur !
 
Dernière édition:

anri0610

XLDnaute Junior
Bonjour,

je tenait a vous faire part de ma solution,
j'ai trouver une manière d'arriver au même résultat souhaite ,
la procédure peut paraître bizarre mais cela me permet de différencier les données en fonction de la colonne G, sans modifier votre MRegrouperSol2 .

Voici la premier partie utlisee avant le regroupement :

VB:
    Range("K2").Select
    ActiveCell.FormulaR1C1 = "=CONCATENATE(RC[-7],RC[-4])"
    Selection.AutoFill Destination:=Range("K2:K500"), Type:=xlFillCopy
    Range("K2:K500").Select
    Selection.End(xlUp).Select
    Range("K2").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Copy
    Selection.End(xlUp).Select
    Range("D2").Select
    Selection.PasteSpecial PASTE:=xlPasteValuesAndNumberFormats, Operation:= _
        xlNone, SkipBlanks:=False, Transpose:=False


    Range("K2").Select
    Range(Selection, Selection.End(xlDown)).Select
    Application.CutCopyMode = False
    Selection.Delete Shift:=xlUp
Puis ensuite effacer les données parasites après le regroupement :

VB:
    Columns("I:I").Select
    Selection.Replace What:="縦枠", Replacement:="", LookAt:=xlPart, _
        SearchOrder:=xlByColumns, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    Columns("I:I").Select
    Selection.Replace What:="上枠", Replacement:="", LookAt:=xlPart, _
        SearchOrder:=xlByColumns, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    Selection.Replace What:="戸当り", Replacement:="", LookAt:=xlPart, _
        SearchOrder:=xlByColumns, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    Selection.Replace What:="下枠 ", Replacement:="", LookAt:=xlPart, _
        SearchOrder:=xlByColumns, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    Selection.Replace What:="中方立", Replacement:="", LookAt:=xlPart, _
        SearchOrder:=xlByColumns, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    Selection.Replace What:="方立", Replacement:="", LookAt:=xlPart, _
        SearchOrder:=xlByColumns, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
voici pour ma solution qui reste de la débrouille vu mes capacités : )

J'essaye seulement a présent de reporter le texte des cellules de cette colonne G,
pour chaque regroupement a droite des valeurs répétées de la colonne D,
tout comme vous l'avez fait pour les couleurs en colonne J,

mon problème je n'arrive pas du tout a comprendre votre code!
qui est beaucoup trop complexe pour moi :/
donc je n'ai même pas réussi a repérer la partie de votre code qui reporte les valeur en colonne J.

Si cette procédure est simple pour vous je souhaiterait savoir comment m'y prendre,
pour le coup même si je m'y prend d'une autre manière,
il faudrait tout de même que j'incorpore ce code dans votre solution, ce qui me bloque pour y arriver.
 

Fichiers joints

Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour.
Vous savez bien que tout est envoyé dans les cellules en une seule fois tout à la fin. C'est TRes qui est envoyé dans RngCible, défini à partir de H1.
Donc la colonne J c'est TRes(L, 3). J'y mets des 1 pour le coloriage en rouge, mais aussi les codes de couleurs à la fin, obtenus à partir de la colonne 6 dans un Dictionary au début.
 
Dernière édition:

anri0610

XLDnaute Junior
Bonjour,
merci de votre réponse,
non malheureusement je ne comprends pas beaucoup, je n'ai aucune notion de codage a la base, je fais de mon mieux pour apprendre selon mon besoin,
seulement votre aide est bien au delà de ma compréhension,
j'essaye tout de même, dans ce cas en voulant faire un autre dico juste pour la colonne G :

VB:
   Dim TTit(), TInt(), TRes(), RngCbl As Range, Arg1 As SsGr, Arg2 As SsGr, Arg3 As SsGr, Arg4 As SsGr, Arg6 As SsGr, _
      TS1() As String, TJoin() As String, J As Long, TS2() As String, P As Long, Nom As String, L As Long, Dico As Dictionary, TCoul(), C As Long, Detail
   TTit = ActiveSheet.[G:G].Value
'   Set Dico = DicInvent(ActiveSheet.[A2:F2], 6, 4)
   Set Dico = DicInvent(ActiveSheet.[G2:G], 4, 3)
'   ReDim TRes(1 To 10000, 1 To 4 + Dico.Count)
   ReDim TRes(1 To 10000, 1 To 3)
   Set RngCbl = ActiveSheet.[J1].Resize(UBound(TRes, 1), UBound(TRes, 2))
'   VerserEntetes TRes, Dico
   TCoul = Dico.Keys: L = 1
   RngCbl.Font.Color = 0

'
mais je n'aboutit a rien..
serais je sur la bonne voie?
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Non pas du tout. Vous avez déjà essayé ça, en employant la même variable As Dictionary au lieu d'une seconde différente. Çà ne fait qu'y fusiller l'inventaire sur la colonne 6 qui y est d'abord mis.
Ce qu'il faut faire dépend toujours du résultat que vous voulez obtenir dans tous les cas de figure.
Par ailleurs ça gênerait Gigogne s'il doit reprendre les mêmes données que celles spécifiées au dernier DicInvent, ce qu'il fait si on lui spécifie Null..
D'ailleurs pour ce second DicInvent, pourquoi spécifiez vous la colonne 7 d'une plage qui ne comporte qu'une seule colonne, la G ?
Et même pour le 1er, si vous vous voulez à présent récupérer des données de la colonne G pourquoi ne faites vous aller les données d'entrée que jusqu'à la colonne F ?
Mais j'y pense: si vous aurez désormais une colonne 7, plutôt que de se battre avec un Dictionary consulté d'après les Detail(7), n'auriez vous pas meilleurs temps d'utiliser un Arg7 As SsGr ? 7 à spécifier juste après 6 à Gigogne et boucle For Each Arg7 In Arg6.Co à mettre juste à l'intérieur de la For Each Arg6 In …
Enfin si j'ai compris ce que vous voulez faire, ce qui n'est pas sûr du tout.
En fait ce serait peut être même plutôt après la 4, non ? For Each Arg7 in Arg4.Co
Quant à ce fichu regroupement tardif et contradictoire sur la Arg1, ben ma fois on verra ce qu'on verra … (il deviendrait bien évidemment For Each Arg1 In Arg7.Co du coup)
 
Dernière édition:

anri0610

XLDnaute Junior
Je souhaiterai simplement afficher dans le regroupement vertical, les valeurs de la colonne G correspondantes aux valeurs de la colonne D,
si possible a leurs droite, comme pour les valeurs de la colonne F qui sont en colonne J,
ce qui positionnerait ces valeurs voulues finalement juste au dessus de ces dites valeurs en colonne J.
J'essaye d’être clair mais rien a faire j'ai pas l'impression de l’être désolé!

J'essaye comme vous me l'avez conseiller, si j'ai bien compris,pour l'instant:

VB:
   Dim TTit(), TInt(), TRes(), RngCbl As Range, Arg1 As SsGr, Arg2 As SsGr, Arg3 As SsGr, Arg4 As SsGr, Arg6 As SsGr, Arg7 As SsGr, _
      TS1() As String, TJoin() As String, J As Long, TS2() As String, P As Long, Nom As String, L As Long, Dico As Dictionary, TCoul(), C As Long, Detail
   TTit = ActiveSheet.[A1:F1].Value
le TTit = ActiveSheet.[A1:F1].Value il n'est pas nécessaire de le modifier ?
 

Dranreb

XLDnaute Barbatruc
Il faut bien évidemment le rectifier aussi pour pouvoi reproduire comme pour les autres le titre de cette colonne. Raisonnez plutôt en numéros de colonnes ce sera plus simple. D'ailleurs le temps de la mise au point vous pourriez mettre l'affichage en mode R1C1 pour mieux suivre. Laissez la colonne 4 comme elle était à l'origine. C'est complètement idiot d'y concaténer la colonne 7: il suffit de prévoir un SsGr Arg7 supplémentaire juste derrière, en demandant à la fonction Gigogne de regrouper sur la 7 juste après la 4, ça fera la même chose: comme dans votre solution provisoire: les Arg1 ne seront plus considérés toutes valeurs confondues de la colonne 7 pour l'ensemble de la combinaison des colonnes 2, 3 et 4 seulement mais bien pour chacune d'entre elles différente par sa colonne 7 aussi. Ce qui est important s'il y a des colonnes supplémentaires à produire où on devra ranger Arg4.Id et Arg7.Id ou bien Detail(7), c'est de rectifier la redéfinition du nombre de colonnes du tableau TResu. Veillez aussi à ce que la plage d'accueil RngCible soit convenablement 'Resizée' (dans ma Sub RegrouperSol1 le Resize n'employait pas UBound(TRes, 2) pour garantir cela).
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour.
Vous prétendez, n'est ce pas, que vous obtenez le résultat que vous souhaitiez en concaténant préalablement la colonne 7 à la colonne 4, avec résultat remis en colonne 4. Ça revient à dire que, si on ne fait pas cette concaténation préalable, vous voulez tout un paquet complet de lignes, différent pour chaque valeur différente de la colonne 7, en plus des colonne 2, 3, 4, c'est bien ça ?
Si ça se trouve, vous avez une conception tellement imprécise des chose qu'il suffirait pour obtenir ce que vous vouliez d'ajouter dans la boucle For Each Detail une instruction TRes(C, 4) = Detail(7).
Mais avec votre concaténation préalable (ou l'organisation de la collection qui reviendrait au même) je ne comprends pas trop pourquoi vous voulez le mettre juste en face des 色仕様, vu que ce sera forcément le seul et unique même pour tout le paquet.
Du moment qu'il y aura un chiffre en face d'un 色仕様 il sera forcément toujours pour le 品名 commun du paquet.
 
Dernière édition:

Discussions similaires


Haut Bas