Problème regroupement de données

Bonjour,

Grâce à votre aide, j'ai bientôt fini mon projet. Mais je vais de difficulté en difficulté, jusqu'à présent, j'arrivais à assembler des par bloc des lignes de mon fichier selon des valeurs identiques en colonnes 6,8 et 10 ! Il me regroupait les éléments ayant les mêmes occurrences tout en créant des tableaux redondants, j'ai pu grâce à un code fourni par h2so4 supprimer les tableaux redondants !

Pour éviter les tableaux redondants, j'ai créé des clés (de longueur très variable) dans mon fichier plutôt longues en fait, de cette manière un tableau ne sera créé qu'une seule fois ! Mon code ne fonctionne plus, il n'arrive pas à assembler par bloc les valeurs identiques de la colonne B( la colonne où se trouvé la clé) et la colonne où se trouve le GROUPE, j'ai une erreur (incompatibilité de type ) !

je vous mets en pièce jointe un classeur test avec le code à l'intérieur !

PS : Pour le test, j'ai du laisser les lignes concernant qu'un seul groupe

Merci pour votre aide

9classeurtest.zip (46.59 Ko)

apparemment, tu as atteint une limite d'excel pour l'instruction

DEST.Resize(UBound(TL, 2), UBound(TL, 1)) = Application.Transpose(TL)

limite de la transposition d'un élément du tableau semble être de 255 caractères.

une manière de contourner le problème

Private OS As Worksheet 'déclare la variable OS (Onglet Source)
Private OD As Worksheet 'déclare la variable OD (Onglet Destination)
Private TC As Variant 'déclare la variable TC (Tableau de Cellules)
Private NL As Long 'déclare la variable NL (Nombre de Lignes)
Private NC As Integer 'déclare la variable NC (Nombre de Colonnes)

Sub Macro1()
Dim D As Object 'déclare la variable ND (Dictionnaire)
Dim CC As String 'déclare la variable CC (Concaténation de Colonnes)
Dim TL() As Variant 'déclare la variable TL (Tableai de Lignes)
Dim I As Long 'déclare la variable I (Incrément de lignes)
Dim J As Integer 'déclare la variable J (incrément de lignes)
Dim K As Long 'déclare la variable K (incrément de lignes)
Dim L As Integer 'déclare la variable L (incrément de colonnes)
Dim DEST As Range 'déclare la variable DEST (cellule de DESTination)

Set OS = ThisWorkbook.Sheets("Feuil1") 'définit l'onglet source OS (à adapter)
Set OD = ThisWorkbook.Sheets("Feuil2") 'définit l'onglet destination OD (à adapter)
TC = OS.Range("A1").CurrentRegion 'définit le tableau de cellules TC (à adapter)
NL = UBound(TC, 1) 'définit le nombre de lignes NL du tableau de cellulles TC
NC = UBound(TC, 2) 'définit le nombre de colonnes NC du tableau de cellulles TC
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionaire D
For I = 2 To NL 'boucle sur toutes les ligne du tableau de cellues TC (en partant de la seconde)
    'définit la concaténation CC
    'remplace 1, 2 et 3 par le numero des colonnec contenant le "Code Clien", le "Libellé" et le "Prix"
    CC = CStr(TC(I, 2)) & CStr(TC(I, 7)) '& CStr(TC(I, 7))
    D(CC) = D(CC) + 1 'alimente le dictionnaire avec le concaténation CC
Next I 'prichaine ligne de la boucle
TE = D.keys 'récupère tableau TE (Tableau des Éléments) les éléments du dictionnaire D sabs doiblon
TOC = D.items 'récupère tableau TOC (Tableau des OCcurrences) le nombre d'occurrence de chaque élément de TE
For I = LBound(TE) To UBound(TE) 'boucle sur tous les éléments de TE
    If TOC(I) > 1 Then 'condition 1 : si l'élément a plusieurs occurrences
        K = 1 'initialise la variable K
        For J = 2 To NL 'boucle 1 sur toutes les lignes J du tableau de cellules TC (en partant de la seconde)
            'condition 2 : si la concaténation des colonne 1 deux et trois est égale à TE(I)
            'remplace 1, 2 et 3 par le numero des colonnec contenant le "Code Clien", le "Libellé" et le "Prix"
            'If CStr(TC(J, 2)) & CStr(TC(J, 7)) & CStr(TC(J, 7)) = TE(I) Then
            If CStr(TC(J, 2)) & CStr(TC(J, 7)) = TE(I) Then
                'redimensionne le tableau de lignes TL (autant de ligne que TC a de colonnes,K colonnes)
                ReDim Preserve TL(1 To NC, 1 To K)
                For L = 1 To NC 'boucle 2 : sur toutes les colonnes de TC
                    TL(L, K) = Left(TC(J, L), 255) 'récupère dans la ligne de TL la valeur de la colonne de TC (transposition)
                Next L 'prochaine colonne de la boujcle 2
                K = K + 1 'incrémente K
            End If 'fin de la condition 2
        Next J 'prochaien ligne de la boucle 1
        If K > 1 Then 'condition 3 : si K est supérieur à 1 (au moins une occurrence trouvée)
            'définit la cellue de destination DEST
            Set DEST = IIf(OD.Range("A1").Value = "", OD.Range("A1"), OD.Cells(Application.Rows.Count, 1).End(xlUp).Offset(3, 0))
            'revoie dans DEST redinensionnée le tableau TL transposé
            DEST.Resize(UBound(TL, 2), UBound(TL, 1)) = Application.Transpose(TL)
        End If 'fin de la condition 3
        Erase TL 'vide le tableau TL
    End If 'fin de la condition 1
Next I 'prochain élément du tableau TE
End Sub

Bonjour,

Bizarre comme ce code me parle !...

Tu dis que la clé est en colonne B et je la vois plutôt en colonne A. Si on modifie le code en remplaçant B par A ça semble fonctionner (plus de plantage en tous cas) sauf que dans ton exemple il n'y a pas deux clés identiques ?!... Le problème doit venir du fait qu'il trop de caractères en B...

ThauThème a écrit :

Bonjour,

Bizarre comme ce code me parle !...

Tu dis que la clé est en colonne B et je la vois plutôt en colonne A. Si on modifie le code en remplaçant B par A ça semble fonctionner (plus de plantage en tous cas) sauf que dans ton exemple il n'y a pas deux clés identiques ?!... Le problème doit venir du fait qu'il trop de caractères en B...

LOL c'est ton code Tauthème ! MA vraie clé est en colonne B celle que je veux utiliser pour assembler, la colonne A est une clé qui m'a permis de créer la clé définitive de la colonne B !

Merci pour votre aide


h2so4 a écrit :

apparemment, tu as atteint une limite d'excel pour l'instruction

DEST.Resize(UBound(TL, 2), UBound(TL, 1)) = Application.Transpose(TL)

limite de la transposition d'un élément du tableau semble être de 255 caractères.

une manière de contourner le problème

Le problème a en effet été contourné ! Merci

h2so4 a écrit :
Private OS As Worksheet 'déclare la variable OS (Onglet Source)
Private OD As Worksheet 'déclare la variable OD (Onglet Destination)
Private TC As Variant 'déclare la variable TC (Tableau de Cellules)
Private NL As Long 'déclare la variable NL (Nombre de Lignes)
Private NC As Integer 'déclare la variable NC (Nombre de Colonnes)

Sub Macro1()
Dim D As Object 'déclare la variable ND (Dictionnaire)
Dim CC As String 'déclare la variable CC (Concaténation de Colonnes)
Dim TL() As Variant 'déclare la variable TL (Tableai de Lignes)
Dim I As Long 'déclare la variable I (Incrément de lignes)
Dim J As Integer 'déclare la variable J (incrément de lignes)
Dim K As Long 'déclare la variable K (incrément de lignes)
Dim L As Integer 'déclare la variable L (incrément de colonnes)
Dim DEST As Range 'déclare la variable DEST (cellule de DESTination)

Set OS = ThisWorkbook.Sheets("Feuil1") 'définit l'onglet source OS (à adapter)
Set OD = ThisWorkbook.Sheets("Feuil2") 'définit l'onglet destination OD (à adapter)
TC = OS.Range("A1").CurrentRegion 'définit le tableau de cellules TC (à adapter)
NL = UBound(TC, 1) 'définit le nombre de lignes NL du tableau de cellulles TC
NC = UBound(TC, 2) 'définit le nombre de colonnes NC du tableau de cellulles TC
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionaire D
For I = 2 To NL 'boucle sur toutes les ligne du tableau de cellues TC (en partant de la seconde)
    'définit la concaténation CC
    'remplace 1, 2 et 3 par le numero des colonnec contenant le "Code Clien", le "Libellé" et le "Prix"
    CC = CStr(TC(I, 2)) & CStr(TC(I, 7)) '& CStr(TC(I, 7))
    D(CC) = D(CC) + 1 'alimente le dictionnaire avec le concaténation CC
Next I 'prichaine ligne de la boucle
TE = D.keys 'récupère tableau TE (Tableau des Éléments) les éléments du dictionnaire D sabs doiblon
TOC = D.items 'récupère tableau TOC (Tableau des OCcurrences) le nombre d'occurrence de chaque élément de TE
For I = LBound(TE) To UBound(TE) 'boucle sur tous les éléments de TE
    If TOC(I) > 1 Then 'condition 1 : si l'élément a plusieurs occurrences
        K = 1 'initialise la variable K
        For J = 2 To NL 'boucle 1 sur toutes les lignes J du tableau de cellules TC (en partant de la seconde)
            'condition 2 : si la concaténation des colonne 1 deux et trois est égale à TE(I)
            'remplace 1, 2 et 3 par le numero des colonnec contenant le "Code Clien", le "Libellé" et le "Prix"
            'If CStr(TC(J, 2)) & CStr(TC(J, 7)) & CStr(TC(J, 7)) = TE(I) Then
            If CStr(TC(J, 2)) & CStr(TC(J, 7)) = TE(I) Then
                'redimensionne le tableau de lignes TL (autant de ligne que TC a de colonnes,K colonnes)
                ReDim Preserve TL(1 To NC, 1 To K)
                For L = 1 To NC 'boucle 2 : sur toutes les colonnes de TC
                    TL(L, K) = Left(TC(J, L), 255) 'récupère dans la ligne de TL la valeur de la colonne de TC (transposition)
                Next L 'prochaine colonne de la boujcle 2
                K = K + 1 'incrémente K
            End If 'fin de la condition 2
        Next J 'prochaien ligne de la boucle 1
        If K > 1 Then 'condition 3 : si K est supérieur à 1 (au moins une occurrence trouvée)
            'définit la cellue de destination DEST
            Set DEST = IIf(OD.Range("A1").Value = "", OD.Range("A1"), OD.Cells(Application.Rows.Count, 1).End(xlUp).Offset(3, 0))
            'revoie dans DEST redinensionnée le tableau TL transposé
            DEST.Resize(UBound(TL, 2), UBound(TL, 1)) = Application.Transpose(TL)
        End If 'fin de la condition 3
        Erase TL 'vide le tableau TL
    End If 'fin de la condition 1
Next I 'prochain élément du tableau TE
End Sub

Bonjour,

Jusqu'à présent le code fonctionnait mais maintenant que ma clé est devenue plus longue (elle n'était pas vraiment correcte avant), j'ai encore le problème d'incompatibilité de type, je me dis que la longueur de la clé en colonne 6 lui propose vraiment un problème, je ne peux pas vous faire mettre un classeur test parce que je ne sais pas à partir de quelle ligne le problème est rencontré !

Mais l'erreur est toujours la même et elle se trouve sur la ligne corrigée !!

 TL(L, K) = Left(TC(J, L), 255) 'récupère dans la ligne de TL la valeur de la colonne de TC (transposition)

Merci d'avance pour votre aide

Bonsoir,

sans le fichier cela va être difficile de t'aider.

h2so4 a écrit :

Bonsoir,

sans le fichier cela va être difficile de t'aider.

Bonjour,

merci pour votre aide, le fichier étant très lourd ! vous pouvez le trouver à cette adresse !

Merci pour votre aide

Et hop, un petit hup ici

Bonsoir,

je t'invite à regarder la ligne 5987 et suivante de ton fichier. leur contenu provoque l'erreur.

h2so4 a écrit :

Bonsoir,

je t'invite à regarder la ligne 5987 et suivante de ton fichier. leur contenu provoque l'erreur.

Merci infiniment, par ailleurs comment as tu fait pour retrouver la ligne de l'erreur ?

biggi1992 a écrit :
h2so4 a écrit :

Bonsoir,

je t'invite à regarder la ligne 5987 et suivante de ton fichier. leur contenu provoque l'erreur.

Merci infiniment, par ailleurs comment as tu fait pour retrouver la ligne de l'erreur ?

j' ai regardé la valeur de la variable J au moment où l'erreur survenait.

Rechercher des sujets similaires à "probleme regroupement donnees"