OVH Cloud OVH Cloud

regrouper sur un tableau excel

41 réponses
Avatar
Lindt
Bonjour toute la communauté,
Je travaille actuellement sur un fichier excel qui fait des extractions de requête d'une base de données Access.
Le problème ce que mon fichier contient plusieurs fois les mêmes commandes. Je m'explique une commande pouvant avoir plusieurs articles, celle-ci se répète autant de fois qu'il y'a d'article.
Pour éviter ceci je voulais savoir s'il y'avais un moyen de regrouper tous les articles par rapport à la commande ou de les fusionner. C'est à dire qu'en face de chaque commande les articles apparaissent dans une cellule.
Je ne sais pas si c'est clair ce que j'ai écrit :/
Merci d'avance pour votre aide :)

10 réponses

1 2 3 4 5
Avatar
lindt
Le vendredi 29 Avril 2016 à 11:54 par Lindt :
Bonjour toute la communauté,
Je travaille actuellement sur un fichier excel qui fait des extractions de
requête d'une base de données Access.
Le problème ce que mon fichier contient plusieurs fois les mêmes
commandes. Je m'explique une commande pouvant avoir plusieurs articles,
celle-ci se répète autant de fois qu'il y'a d'article.
Pour éviter ceci je voulais savoir s'il y'avais un moyen de regrouper
tous les articles par rapport à la commande ou de les fusionner. C'est
à dire qu'en face de chaque commande les articles apparaissent dans une
cellule.
Je ne sais pas si c'est clair ce que j'ai écrit :/
Merci d'avance pour votre aide :)


http://www.cjoint.com/c/FEcmEM4yzub

Voici un petit exemple
Avatar
MichD
Retour de mon fichier exemple http://www.cjoint.com/c/FEcvsCzUkwX

J'ai fait la compilation pour 2 colonnes à toi de le faire pour la
totalité des colonnes des données.
Avatar
lindt
Le vendredi 29 Avril 2016 à 11:54 par Lindt :
Bonjour toute la communauté,
Je travaille actuellement sur un fichier excel qui fait des extractions de
requête d'une base de données Access.
Le problème ce que mon fichier contient plusieurs fois les mêmes
commandes. Je m'explique une commande pouvant avoir plusieurs articles,
celle-ci se répète autant de fois qu'il y'a d'article.
Pour éviter ceci je voulais savoir s'il y'avais un moyen de regrouper
tous les articles par rapport à la commande ou de les fusionner. C'est
à dire qu'en face de chaque commande les articles apparaissent dans une
cellule.
Je ne sais pas si c'est clair ce que j'ai écrit :/
Merci d'avance pour votre aide :)


Merci beaucoup Mitch;
Je voulais savoir si c'était possible de le faire avec 44 colonnes et un grand nombre de ligne qui change à chaque fois?

Cordialement
Lindt
Avatar
lindt
Le mardi 03 Mai 2016 à 08:27 par lindt :
Le vendredi 29 Avril 2016 à 11:54 par Lindt :
Bonjour toute la communauté,
Je travaille actuellement sur un fichier excel qui fait des extractions de
requête d'une base de données Access.
Le problème ce que mon fichier contient plusieurs fois les mêmes
commandes. Je m'explique une commande pouvant avoir plusieurs articles,
celle-ci se répète autant de fois qu'il y'a d'article.
Pour éviter ceci je voulais savoir s'il y'avais un moyen de regrouper
tous les articles par rapport à la commande ou de les fusionner. C'est
à dire qu'en face de chaque commande les articles apparaissent dans une
cellule.
Je ne sais pas si c'est clair ce que j'ai écrit :/
Merci d'avance pour votre aide :)



Merci beaucoup Mitch;
Je voulais savoir si c'était possible de le faire avec 44 colonnes et un grand
nombre de ligne qui change à chaque fois?

Cordialement
Lindt


J'ai testé ta macro mais la 1 ère colonne n'est pas regroupée,
Par exemple ce code 1542692 apparaît plusieurs fois.
Avatar
MichD
Dans l'exposé de ta question, tu n'as pas spécifié que tu voulais
éliminer les doublons!

Le même fichier avec légère modification afin d'éviter les doublons.
http://www.cjoint.com/c/FEdk0sNIXnX
Avatar
lindt
Le mardi 03 Mai 2016 à 12:55 par MichD :
Dans l'exposé de ta question, tu n'as pas spécifié que tu
voulais
éliminer les doublons!

Le même fichier avec légère modification afin
d'éviter les doublons.
http://www.cjoint.com/c/FEdk0sNIXnX


Bonjour MitchD,
C'est exactement ce que je veux vraiment you are my hero, par contre je ne sait pas ce que je dois modifier pour ajouter les 40 autres colonnes :/

Cordialement
Lindt
Avatar
MichD
À défaut de pouvoir compléter la dernière macro soumise, utilise la
macro qui retourne des doublons.

Après l'exécution de la macro, Tu transformes toute la plage de données
en "Tableau" en utilisant le menu "insertion" Tableau.

Après avoir inséré le tableau, dans le menu "Création" (tu dois placer
le curseur dans une cellule du tableau pour voir ce menu), dans la
section "outils", tu as une commande "Supprimer les doublons". Voilà!

Et si tu veux faire disparaître le tableau, juste en dessous de la
commande "Supprimer les doublons", tu as la commande "Convertir en plage".
Avatar
MichD
Comment modifier la macro, voici des explications.
Ne te laisse pas impressionner, c'est relativement simple...

A ) Le contenu de chacune des colonnes à traiter
3 traitements possibles pour chacune des colonnes

1- La colonne contient du texte que tu veux concaténer
2- La colonne des valeurs numériques que tu veux additionner
3- La colonne contient une valeur quelconque dont tu veux
dénombrer le nombre de cellules non vides de cette colonne

Dans la première boucle,

Do
'Si le contenu répond au critère 1 - concaténer du texte

'ColB est une variable représentant le contenu de la colonne B
'C.offset(,1)
'C représente une cellule de la colonne A où il y a une valeur
'en doublon dans cette colonne
'Le chiffre 1 dans le C.offset(,1) représente la cellule en
'rapport avec la colonne A
' la valeur 1 de C.Offset(, 1) = Colonne B
' la valeur 2 de C.Offset(, 1) = Colonne C
' la valeur 3 de C.Offset(, 1) = Colonne d
'...etc...
ColB = ColB & C.Offset(, 1).Value & Chr(10)
'cette section & Chr(10) permet d'insérer un retour à la ligne
'afin que le texte s'écrive sur une autre ligne

'si le contenu de la colonne = des valeurs numériques à additionner
'Dans mon exemple, on veut faire la somme des valeur monétaire
'ColC = le nom de la variable pour cette colonne
'Le C.Offset(, 2) signifie la deuxième colonne à droite de la
' colonne A
ColC = ColC + C.Offset(, 2).Value

'Si le contenu est à dénombrer
'Tu veux dénombrer seulement les cellules qui ne sont pas vides
If c.value <>"" then
'Cold est une variable
ColD = ColD + 1
End If

'Tu répètes cela selon le contenu de chacune des colonnes et selon
'ce que tu veux obtenir comme résultat, 1 ou 2 ou 3.


La deuxième boucle de la procédure est pour remettre le contenu de la
variable représentant la colonne dans la cellule et éliminer les
doublons dans le tableau

Do
'Afin de discriminer entre la première occurrence d'une valeur et
'les autres, c'est ce à quoi sert la variable T
'Lorsque T est égale à 0, c'est la première occurrence et on remet
'alors la valeur de la variable dans la cellule de la bonne colonne
If T = 0 Then
T = T + 1
C.Offset(, 1).Value = ColB
C.Offset(, 2) = ColC
'La liste s'allonge pour chacune des colonnes de la ligne
C.offset(,3) = ColD
C.offset(,4) = ColE
'...etc... pour chacune des colonnes du tableau.


Set C = .FindNext(C)
Else
'quand la variable T est plus grande que 0, on doit alors
'supprimer la ligne pour éviter les doublons
Set G = C.Offset(-1)
C.EntireRow.Delete
Set C = .FindNext(G)
End if
Loop Until C.Address = Adr





La procédure suggérée contenu dans le classeur


'J'ai ajouté la référence suivante à partir du menu
'Outils / références / Microsoft scripting runtime
'--------------------------------------------------------
Sub Compilation()
Dim D As Dictionary, Elt As Variant, Adr As String, G As Range
Dim Suite As String, Rg As Range, C As Range, T As Long
Dim ColB, ColC
Set D = CreateObject("Scripting.dictionary")

Application.ScreenUpdating = False
Application.EnableEvents = False

'Identifier la totalité des cellules de la colonne A
With Worksheets("Feuil1")
Set Rg = .Range("A1:A" & .Range("A" & .Rows.Count).End(xlUp).Row)
End With

'On place dans l'objet dictionnary seulement les valeurs qui sont au
'moins en double dans la colonne A afin de ne traiter que ces lignes...
For Each C In Rg
If C <> "" Then
If Application.CountIf(Rg, C.Value) > 1 Then
If Not D.Exists(C.Value) Then
D.Add C.Value, C.Row
End If
End If
End If
Next

'Une boucle pour chaque valeur en double ou plus trouvée
For Each Elt In D.Keys
With Rg
'recherche de la permière valeur en colonne A (rg)
Set C = .Find(Elt)
If Not C Is Nothing Then
'lorsque trouvé, identifier l'adresse de la première cellule
'afin d'arrêter la boucle suivante
Adr = C.Address
Do
'Dans ma colonne b (C.Offset(, 1).Value) des valeurs
' texte
'donc on doit concaténer
ColB = ColB & C.Offset(, 1).Value & Chr(10)
'En colonne C, on veut faire la somme des valeur
' monétaire
ColC = ColC + C.Offset(, 2).Value
'ainsi de suite pour les 40 colonnes selon que tu veux
'concaténer le contenu de la colonne, en faire la sommme
'ou encore dénombre le nombre d'unité.

'Trouver la cellule suivante de la colonne A qui
'correspond au critère
Set C = .FindNext(C)
'Condition pour sortir de la boucle
Loop Until C.Address = Adr
'Enlève de dernier retour à la ligne Chr(10)
'à adapter pour les autres lignes selon leur type de
'contenu
ColB = Left(ColB, Len(ColB) - 1)
'Aucun traitement pour la colonne C à faire
'ColD = ....
.Find C

'La boucle suivante va remettre dans chacune des
' colonnes
'la valeur qui devrait apparaître...
Do
If T = 0 Then
T = T + 1
C.Offset(, 1).Value = ColB
C.Offset(, 2) = ColC
'Ainsi de suite pour les autres colonnes
Set C = .FindNext(C)
Else
Set G = C.Offset(-1)
C.EntireRow.Delete
Set C = .FindNext(G)
End If
Loop Until C.Address = Adr
T = 0
'Remettre toutes les valeurs des variables soient à ""
'pour texte
'ou à 0 pour les valeur numériques pour traiter la
'valeur suivante.
ColB = "": ColC = 0
End If
End With
Next
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub
'--------------------------------------------------------
Avatar
MichD
Après la fin de la deuxième boucle, il faut remettre les variables à 0
ou à "" selon que la variable contient une valeur numérique ou texte

Dans la procédure, on lisait ceci :

T = 0
'Remettre toutes les valeurs des variables soient à ""
'pour texte ou à 0 pour les valeur numériques pour traiter la
'valeur suivante.
ColB = "" 'Valeur Texte
ColC = 0 'Valeur numérique
'et ce pour chacune des variables utilisées.
Avatar
lindt
Le jeudi 05 Mai 2016 à 12:15 par MichD :
Comment modifier la macro, voici des explications.
Ne te laisse pas impressionner, c'est relativement simple...

A ) Le contenu de chacune des colonnes à traiter
3 traitements possibles pour chacune des colonnes

1- La colonne contient du texte que tu veux concaténer
2- La colonne des valeurs numériques que tu veux additionner
3- La colonne contient une valeur quelconque dont tu veux
dénombrer le nombre de cellules non vides de cette colonne

Dans la première boucle,

Do
'Si le contenu répond au critère 1 - concaténer du texte

'ColB est une variable représentant le contenu de la colonne B
'C.offset(,1)
'C représente une cellule de la colonne A où il y a une valeur
'en doublon dans cette colonne
'Le chiffre 1 dans le C.offset(,1) représente la cellule en
'rapport avec la colonne A
' la valeur 1 de C.Offset(, 1) = Colonne B
' la valeur 2 de C.Offset(, 1) = Colonne C
' la valeur 3 de C.Offset(, 1) = Colonne d
'...etc...
ColB = ColB & C.Offset(, 1).Value & Chr(10)
'cette section & Chr(10) permet d'insérer un retour à la
ligne
'afin que le texte s'écrive sur une autre ligne

'si le contenu de la colonne = des valeurs numériques à
additionner
'Dans mon exemple, on veut faire la somme des valeur monétaire
'ColC = le nom de la variable pour cette colonne
'Le C.Offset(, 2) signifie la deuxième colonne à droite de la
' colonne A
ColC = ColC + C.Offset(, 2).Value

'Si le contenu est à dénombrer
'Tu veux dénombrer seulement les cellules qui ne sont pas vides
If c.value <>"" then
'Cold est une variable
ColD = ColD + 1
End If

'Tu répètes cela selon le contenu de chacune des colonnes et
selon
'ce que tu veux obtenir comme résultat, 1 ou 2 ou 3.


La deuxième boucle de la procédure est pour remettre le contenu
de la
variable représentant la colonne dans la cellule et éliminer les
doublons dans le tableau

Do
'Afin de discriminer entre la première occurrence d'une valeur et
'les autres, c'est ce à quoi sert la variable T
'Lorsque T est égale à 0, c'est la première occurrence et
on remet
'alors la valeur de la variable dans la cellule de la bonne colonne
If T = 0 Then
T = T + 1
C.Offset(, 1).Value = ColB
C.Offset(, 2) = ColC
'La liste s'allonge pour chacune des colonnes de la ligne
C.offset(,3) = ColD
C.offset(,4) = ColE
'...etc... pour chacune des colonnes du tableau.


Set C = .FindNext(C)
Else
'quand la variable T est plus grande que 0, on doit alors
'supprimer la ligne pour éviter les doublons
Set G = C.Offset(-1)
C.EntireRow.Delete
Set C = .FindNext(G)
End if
Loop Until C.Address = Adr





La procédure suggérée contenu dans le classeur


'J'ai ajouté la référence suivante à partir du menu
'Outils / références / Microsoft scripting runtime
'--------------------------------------------------------
Sub Compilation()
Dim D As Dictionary, Elt As Variant, Adr As String, G As Range
Dim Suite As String, Rg As Range, C As Range, T As Long
Dim ColB, ColC
Set D = CreateObject("Scripting.dictionary")

Application.ScreenUpdating = False
Application.EnableEvents = False

'Identifier la totalité des cellules de la colonne A
With Worksheets("Feuil1")
Set Rg = .Range("A1:A" & .Range("A" &
.Rows.Count).End(xlUp).Row)
End With

'On place dans l'objet dictionnary seulement les valeurs qui sont au
'moins en double dans la colonne A afin de ne traiter que ces lignes...
For Each C In Rg
If C <> "" Then
If Application.CountIf(Rg, C.Value) > 1 Then
If Not D.Exists(C.Value) Then
D.Add C.Value, C.Row
End If
End If
End If
Next

'Une boucle pour chaque valeur en double ou plus trouvée
For Each Elt In D.Keys
With Rg
'recherche de la permière valeur en colonne A (rg)
Set C = .Find(Elt)
If Not C Is Nothing Then
'lorsque trouvé, identifier l'adresse de la première cellule
'afin d'arrêter la boucle suivante
Adr = C.Address
Do
'Dans ma colonne b (C.Offset(, 1).Value) des valeurs
' texte
'donc on doit concaténer
ColB = ColB & C.Offset(, 1).Value & Chr(10)
'En colonne C, on veut faire la somme des valeur
' monétaire
ColC = ColC + C.Offset(, 2).Value
'ainsi de suite pour les 40 colonnes selon que tu veux
'concaténer le contenu de la colonne, en faire la sommme
'ou encore dénombre le nombre d'unité.

'Trouver la cellule suivante de la colonne A qui
'correspond au critère
Set C = .FindNext(C)
'Condition pour sortir de la boucle
Loop Until C.Address = Adr
'Enlève de dernier retour à la ligne Chr(10)
'à adapter pour les autres lignes selon leur type de
'contenu
ColB = Left(ColB, Len(ColB) - 1)
'Aucun traitement pour la colonne C à faire
'ColD = ....
.Find C

'La boucle suivante va remettre dans chacune des
' colonnes
'la valeur qui devrait apparaître...
Do
If T = 0 Then
T = T + 1
C.Offset(, 1).Value = ColB
C.Offset(, 2) = ColC
'Ainsi de suite pour les autres colonnes
Set C = .FindNext(C)
Else
Set G = C.Offset(-1)
C.EntireRow.Delete
Set C = .FindNext(G)
End If
Loop Until C.Address = Adr
T = 0
'Remettre toutes les valeurs des variables soient à ""
'pour texte
'ou à 0 pour les valeur numériques pour traiter la
'valeur suivante.
ColB = "": ColC = 0
End If
End With
Next
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub
'--------------------------------------------------------


Bonjour MitchD,
Merci beaucoup j'ai réussi à l'adapter par contre il est hyper lent.
Cordialement
Lindt
1 2 3 4 5