XL 2010 Regrouper plusieurs colonnes en une seule sans vides sans doublons

djamal74

XLDnaute Nouveau
Bonjour,

Je suis nouveau sur le forum.

Je rencontre un problème que j'ai synthétisé dans un exemple plus simple.

J'ai un tableau qui contient 3 colonnes "A, B, C" Je souhaiterais tout fusionner dans une seule colonne "D" sans doublons sans vides avec un tri de A à Z.

Dans la colonne "E" je souhaite avoir le nombre.

NB: J'aimerais que si je rajoute une nouvelle valeur dans les colonnes A B C le calcul se fait automatiquement. Soit avec code VBA ou matrice.

Merci par avance pour votre aide
 

Pièces jointes

  • Regoupe.xlsm
    9.9 KB · Affichages: 12
Solution
Bonjour djamal74, Bruno,

Voyez le fichier joint et cette macro dans le code de la feuille :
VB:
Private Sub Worksheet_Change(ByVal target As Range)
Dim d As Object, tablo, i&, j%, x$
Set d = CreateObject("Scripting.Dictionary")
d.CompareMode = vbTextCompare 'la casse est ignorée
With [Tableau1] 'tableau structuré
    tablo = .Resize(, 3) 'matrice, plus rapide
    For i = 1 To UBound(tablo)
        For j = 1 To 3
            x = tablo(i, j)
            If x <> "" Then d(x) = d(x) + 1
    Next j, i
    '---restitution---
    Application.ScreenUpdating = False
    Application.EnableEvents = False 'désactive les évènements
    .AutoFilter: .AutoFilter 'si le tableau est filtré
    .Columns(4) = "": .Columns(5) = "" 'RAZ
    If d.Count Then...

job75

XLDnaute Barbatruc
Bonjour djamal74, Bruno,

Voyez le fichier joint et cette macro dans le code de la feuille :
VB:
Private Sub Worksheet_Change(ByVal target As Range)
Dim d As Object, tablo, i&, j%, x$
Set d = CreateObject("Scripting.Dictionary")
d.CompareMode = vbTextCompare 'la casse est ignorée
With [Tableau1] 'tableau structuré
    tablo = .Resize(, 3) 'matrice, plus rapide
    For i = 1 To UBound(tablo)
        For j = 1 To 3
            x = tablo(i, j)
            If x <> "" Then d(x) = d(x) + 1
    Next j, i
    '---restitution---
    Application.ScreenUpdating = False
    Application.EnableEvents = False 'désactive les évènements
    .AutoFilter: .AutoFilter 'si le tableau est filtré
    .Columns(4) = "": .Columns(5) = "" 'RAZ
    If d.Count Then
        .Columns(4).Resize(d.Count) = Application.Transpose(d.keys)
        .Columns(5).Resize(d.Count) = Application.Transpose(d.items)
        .Columns(4).Resize(, 2).Sort .Columns(4), xlAscending, Header:=xlYes 'tri alphabétique
    End If
    Application.EnableEvents = True 'réactive les évènements
End With
End Sub
Elle se déclenche quand on modifie ou valide une cellule quelconque.

A+
 

Pièces jointes

  • Regroupe(1).xlsm
    20.1 KB · Affichages: 15

djamal74

XLDnaute Nouveau
Bonjour djamal74, Bruno,

Voyez le fichier joint et cette macro dans le code de la feuille :
VB:
Private Sub Worksheet_Change(ByVal target As Range)
Dim d As Object, tablo, i&, j%, x$
Set d = CreateObject("Scripting.Dictionary")
d.CompareMode = vbTextCompare 'la casse est ignorée
With [Tableau1] 'tableau structuré
    tablo = .Resize(, 3) 'matrive, plus rapide
    For i = 1 To UBound(tablo)
        For j = 1 To 3
            x = tablo(i, j)
            If x <> "" Then d(x) = d(x) + 1
    Next j, i
    '---restitution---
    Application.ScreenUpdating = False
    Application.EnableEvents = False 'désactive les évènements
    .AutoFilter: .AutoFilter 'si le tableau est filtré
    .Columns(4) = "": .Columns(5) = "" 'RAZ
    If d.Count Then
        .Columns(4).Resize(d.Count) = Application.Transpose(d.keys)
        .Columns(5).Resize(d.Count) = Application.Transpose(d.items)
        .Columns(4).Resize(, 2).Sort .Columns(4), xlAscending, Header:=xlYes 'tri alphabétique
    End If
    Application.EnableEvents = True 'réactive les évènements
End With
End Sub
Elle se déclenche quand on modifie ou valide une cellule quelconque.

A+

Merci beaucoup

C'est génial
 

Discussions similaires

Statistiques des forums

Discussions
312 103
Messages
2 085 317
Membres
102 862
dernier inscrit
Emma35400