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
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 SubBonjour,
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.