Suppression doublon, addition et transposer sans doublon
Bonjour la communauté.
Après de nombreuse recherche et de test sans succès. Je viens à vous pour avoir de l’aide.
En effet, A partir d'un code vba, j’aimerai supprimer les références en doublon sur les colonnes de A:E, G tout en additionnant les quantités en colonne F.
Le souci principal, ce sont les valeurs adressage en H:Q.
Car pendant la suppression des doublons, il faudra copier les valeurs d’adressage supprimer a la suite des valeurs d’adressage non supprimer ce trouvant en H:Q sur leur ligne correspondante, sans avoir de doublon de ces dernier.
Le fichier joint est un extrait, car ma feuille contient plus de 20000 lignes variables.
En espérant trouver une personne qui se penchera sur ce sujet.
Amicalement
Bonsoir,
Le TCD (tableau croisé dynamique) me semble particulièrement bien adapté
Merci pour ta réponse rapide.
Ta solution est bonne, mais je ne voulais pas modifier la structure de la page, car j’aimerai avec cette même feuille, adapter au champ de recherche de Sébastien. voila pourquoi j'ai voulu d'une macro.
Mais une question, j’ai entendu dire qu’il ne fallait pas avoir de cellule vide pour effectuer le tableau croisé dynamique. Hors dans ma base, il sera fort probable d’en avoir. Est-ce que le tableau ne présentera pas d’erreur ?
Excuse moi de mon manque de connaissance a ce sujet
je suis a l'écoute de tes conseils
bernard22 a écrit :Bonsoir,
Le TCD (tableau croisé dynamique) me semble particulièrement bien adapté
Merci pour ta réponse rapide.
Ta solution est bonne, mais je ne voulais pas modifier la structure de la page, car j’aimerai avec cette même feuille, adapter au champ de recherche de Sébastien. voila pourquoi j'ai voulu d'une macro.
Mais une question, j’ai entendu dire qu’il ne fallait pas avoir de cellule vide pour effectuer le tableau croisé dynamique. Hors dans ma base, il sera fort probable d’en avoir. Est-ce que le tableau ne présentera pas d’erreur ?
Excuse moi de mon manque de connaissance a ce sujet
je suis a l'écoute de tes conseils
Pour moi le TCD ne modifie pas forcément la structure de l'onglet. La plupart du temps on les crée dans un onglet à part onglet (TCD sur mon exemple).
Je ne pense pas que des cellules vides empêchent le tableau de bien fonctionner il suffit le cas échéant de filtrer les valeurs nulles pour une meilleure présentation.
Par contre, quand tu parles "d'adapter au champ de recherche de Sébastien" je ne comprends pas.
Pour ce qui est d'une macro adaptée à ton problème je passe la main......
Bonne continuation.
Bonsoir michel973, le forum
Pour déterminer les clés du dictionnaire principal, je me suis appuyé sur la colonne A (le Gencod).
A tester dans tous les cas de figure :
Restitution en Feuil1.
Option Explicit
Sub test()
Dim a, b(), w(), i As Long, j As Long, n As Long
Const col As Byte = 7
ReDim w(1 To 2)
With Sheets("BASE").Range("a1").CurrentRegion
a = .Value: n = 1
ReDim b(1 To UBound(a, 1), 1 To col + 1)
For j = 1 To col + 1
b(n, j) = a(n, j)
Next
With CreateObject("Scripting.Dictionary")
.CompareMode = 1
For i = 2 To UBound(a, 1)
a(i, 1) = CStr(a(i, 1))
If Not .exists(a(i, 1)) Then
n = n + 1
w(1) = n
Set w(2) = CreateObject("Scripting.Dictionary")
w(2).CompareMode = 1
For j = 1 To col
b(n, j) = a(i, j)
Next
For j = col + 1 To UBound(a, 2)
If a(i, j) <> "" Then
If Not w(2).exists(a(i, j)) Then
w(2)(a(i, j)) = Empty
If UBound(b, 2) < col + w(2).Count Then
ReDim Preserve b(1 To UBound(b, 1), 1 To UBound(b, 2) + 1)
End If
b(n, col + w(2).Count) = a(i, j)
End If
End If
Next
.Item(a(i, 1)) = w
Else
w = .Item(a(i, 1))
b(w(1), 6) = b(w(1), 6) + a(i, 6)
For j = col + 1 To UBound(a, 2)
If a(i, j) <> "" Then
If Not w(2).exists(a(i, j)) Then
w(2)(a(i, j)) = Empty
If UBound(b, 2) < col + w(2).Count Then
ReDim Preserve b(1 To UBound(b, 1), 1 To UBound(b, 2) + 1)
End If
b(w(1), col + w(2).Count) = a(i, j)
End If
End If
Next
.Item(a(i, 1)) = w
End If
Next
End With
End With
Application.ScreenUpdating = False
With Sheets("Feuil1").Range("a1").Resize(n, UBound(b, 2))
.CurrentRegion.Clear
.Columns(1).NumberFormat = "@"
.Value = b
.Font.Name = "calibri"
.Font.Size = 10
.VerticalAlignment = xlCenter
.BorderAround Weight:=xlThin
.Borders(xlInsideVertical).Weight = xlThin
With .Rows(1)
.Font.Size = 11
.Interior.ColorIndex = 36
.BorderAround Weight:=xlThin
.HorizontalAlignment = xlCenter
.Offset(, col).Resize(, UBound(b, 2) - col).MergeCells = True
End With
.Columns(6).NumberFormat = "0.00"
.Columns.AutoFit
.Parent.Activate
End With
Application.ScreenUpdating = True
End Sub
Ligne 10, le Gencod 5609021055805 comporte 2 adressages identiques, est-ce normal ?
klin89
Bonjour,Klin89
bonjour, le forum
J’ai testé la macro. C’est formidable. C’est exactement ce que je cherchai.
Ligne 10, le Gencod 5609021055805 comporte 2 adressages identiques, est-ce normal ?
Non, c’est une erreur de ma part.
Avant de mettre ce sujet comme résolue et sans abuser de votre patience. Je voudrai savoir si vous pouviez déterminer les clés du dictionnaire principal en colonne C. « Référence Image »
Car en effet, c’est la colonne C qui est le pilier de la base de données. Dans la base complète, les autres colonnes peuvent avoir des données manquantes.
Je tiens à vous remercier « Klin89 », à « bernard22 » pour l’aide apporter, ainsi qu’a tout le forum pour les recherches et le travail effectuer à la connaissance de ce fabuleux logiciel Excel.
Bonjour michel973
Merci pour le retour
L'exercice était clairement exposé et très intéressant à résoudre.
Sinon remplace tous les a(i, 1) par a(i, 3), tu en as 6.
michel973 a écrit :
Dans la base complète, les autres colonnes peuvent avoir des données manquantes.
Ici, je teste l'existence de la clé et est recopié le contenu de la ligne concernée :
If Not .exists(a(i, 1)) Then
n = n + 1
For j = 1 To col
b(n, j) = a(i, j)
Next
Par la suite, pour une même clé, s'il y a changement dans le contenu des cellules (A:G), la modification ne sera pas effectuée.
Sinon, on peut définir la clé en s'appuyant sur plusieurs colonnes (concaténation).
klin89
Bonjour,
Je suis nouveau dans le forum, mais j'étais à la recherche d'une macro qui fait exactement ce que je vois ici mais en la modifiant à ma sauce, j'ai des difficultés à ce niveau de compilation
"ReDim Preserve b(1 To UBound(b, 1), 1 To UBound(b, 2) + 1)" j'ai une erreur de memoire.
Mon tableau a 3 colonne A,B,C et j'aimerai seulement verifier les doublons pour la colonne B en additionnant la quantité qui est en C
sans tenir compte de la colonne A.
voici ce que j'ai fait:
Sub test()
Dim a As Variant, b() As Variant, w() As Variant
Dim i As Long, j As Long, n As Long
Const col As Byte = 1
ReDim w(1 To 2)
With Sheets("art-lib").Range("B:C")
a = .Value: n = 1
ReDim b(1 To UBound(a, 1), 1 To col + 1)
For j = 1 To col + 1
b(n, j) = a(n, j)
Next
With CreateObject("Scripting.Dictionary")
.CompareMode = 1
For i = 2 To UBound(a, 1)
a(i, 1) = CStr(a(i, 1))
If Not .exists(a(i, 1)) Then
n = n + 1
w(1) = n
Set w(2) = CreateObject("Scripting.Dictionary")
w(2).CompareMode = 1
For j = 1 To col
b(n, j) = a(i, j)
Next
For j = col + 1 To UBound(a, 2)
If a(i, j) <> "" Then
If Not w(2).exists(a(i, j)) Then
w(2)(a(i, j)) = Empty
If UBound(b, 2) < col + w(2).Count Then
ReDim Preserve b(1 To UBound(b, 1), 1 To UBound(b, 2) + 1)
End If
b(n, col + w(2).Count) = a(i, j)
End If
End If
Next
.Item(a(i, 1)) = w
Else
w = .Item(a(i, 1))
b(w(1), 2) = b(w(1), 2) + a(i, 2)
For j = col + 1 To UBound(a, 2)
If a(i, j) <> "" Then
If Not w(2).exists(a(i, j)) Then
w(2)(a(i, j)) = Empty
If UBound(b, 2) < col + w(2).Count Then
ReDim Preserve b(1 To UBound(b, 1), 1 To UBound(b, 2) + 1)''''Problème ici""
End If
b(w(1), col + w(2).Count) = a(i, j)
End If
End If
Next
.Item(a(i, 1)) = w
End If
Next
End With
End With
Application.ScreenUpdating = False
With Sheets("OccurenceLibelle").Range("a1").Resize(n, UBound(b, 2))
.CurrentRegion.Clear
.Columns(1).NumberFormat = "@"
.Value = b
.Font.Name = "calibri"
.Font.Size = 10
.VerticalAlignment = xlCenter
.BorderAround Weight:=xlThin
.Borders(xlInsideVertical).Weight = xlThin
With .Rows(1)
.Font.Size = 11
.Interior.ColorIndex = 36
.BorderAround Weight:=xlThin
.HorizontalAlignment = xlCenter
.Offset(, col).Resize(, UBound(b, 2) - col).MergeCells = True
End With
.Columns(6).NumberFormat = "0.00"
.Columns.AutoFit
.Parent.Activate
End With
Application.ScreenUpdating = True
End Sub
Colos a écrit :Bonjour,
Je suis nouveau dans le forum, mais j'étais à la recherche d'une macro qui fait exactement ce que je vois ici mais en la modifiant à ma sauce, j'ai des difficultés à ce niveau de compilation
"ReDim Preserve b(1 To UBound(b, 1), 1 To UBound(b, 2) + 1)" j'ai une erreur de memoire.
Bonjour,
tu dois ouvrir ton propre fil de discussion et y mettre non pas le code, ni une image, mais une copie identique à ton vrai fichier mais anonymisé
P.
Bonjour patrick1957 ,
Je comprends très bien ce que tu dis, je pense qu'il ne faut pas créer une demande sur un sujet qui a été peut être résolu
mais si tu veux je le ferai mais, je suis sûr que certains m'orienteront vers cette discussion.
Cordialement.