Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2021 Doublon à fusionner

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Bibouden1

XLDnaute Nouveau
Bonjour à tous

Désolé de vous déranger pour peut être un problème facile à régler mais je tente ma chance.

J'ai un fichier avec une longue liste de personne ou il y a plein de doublon. Je voudrais savoir s'il est possible de faire EN UNE FOIS, UNE SEULE MANIP pour l'ensemble des doublons pour chaque nom de les fusionner en une seule cellule et centrer comme je l'ai fait dans le fichier avec Sandrine ALV (voir fichier)

Merci beaucoup
 

Pièces jointes

Solution
Bonjour Bibouden1, le forum,

Dans la 1ère macro, en supprimant les formules pour ne garder que les valeurs, c'est 10 à 12 fois plus rapide :
VB:
Sub Fusionner()
Dim a As Range
Application.ScreenUpdating = False
Application.DisplayAlerts = False
On Error Resume Next
Defusionner 'lance la macro
Columns(1).Insert 'insère une colonne auxiliaire
With [A1].CurrentRegion.Columns(1)
    .FormulaR1C1 = "=1/(RC[1]=OFFSET(RC[1],-1,))"
    .Value = .Value 'supprime les formules
    For Each a In .SpecialCells(xlCellTypeConstants, 1).Areas
        Union(a(0, 2), a.Columns(2)).Merge 'fusionne
    Next a
End With
Columns(1).Delete
End Sub

Sub Defusionner()
With Range("A1:A" & Cells(Rows.Count, 3).End(xlUp).Row)
    .UnMerge 'défusionne
    On...
Avec ces macros la fusion concerne les colonnes A (noms) et B (villes) :
VB:
Sub Fusionner()
Dim a As Range
Application.ScreenUpdating = False
Application.DisplayAlerts = False
On Error Resume Next
Defusionner 'lance la macro
Columns(1).Insert 'insère une colonne auxiliaire
With [A1].CurrentRegion.Columns(1)
    .FormulaR1C1 = "=1/(RC[1]=OFFSET(RC[1],-1,))"
    .Value = .Value 'supprime les formules
    For Each a In .SpecialCells(xlCellTypeConstants, 1).Areas
        Union(a(0, 2), a.Columns(2)).Merge 'fusionne les noms
        Union(a(0, 3), a.Columns(3)).Merge 'fusionne les villes
    Next a
End With
Columns(1).Delete
End Sub

Sub Defusionner()
Dim c As Range
Application.ScreenUpdating = False
On Error Resume Next
ActiveSheet.ShowAllData 'si la feuille est filtrée
With Range("A1:B" & Cells(Rows.Count, 3).End(xlUp).Row)
    For Each c In .Cells
        If IsEmpty(c.MergeArea(1)) Then c = "µ" 'repère les cellules vides fusionnées ou non
    Next c
    .UnMerge 'défusionne
    .SpecialCells(xlCellTypeBlanks) = "=R[-1]C"
    .Value = .Value 'supprime les formules
    .Replace "µ", "" 'efface le repérage
    .Resize(, 4).Borders.Weight = xlThin 'bordures fines
End With
End Sub
En testant sur 13200 lignes la 1ère macro s'exécute en 1,6 seconde, la boucle de repérage de la 2ème macro prend 0,25 seconde.

Edit : j'ai traité le cas où la feuille est filtrée et ajouté des bordures.

A+
 

Pièces jointes

Dernière édition:
En testant sur 13200 lignes je constate qu'en exécutant plusieurs fois de suite la macro Fusionner la durée d'exécution augmente régulièrement.

Je ne sais pas à quoi est dû ce phénomène mais j'ai pu y remédier en exécutant la macro Defusionner puis en enregistrant et fermant le fichier.
 
Je découvre un autre phénomène curieux.

En remplaçant le caractère de repérage "µ" par Chr(1) ça efface tout.

Par contre aucun problème si on le remplace par Chr(2), qu'a donc de spécial Chr(1) ?
 
Bonjour Bibouden1, le forum,

La solution présentée par Dranreb - tri sur villes puis sur noms et fusion des villes puis des noms - est tout à fait intéressante.

Cependant elle est très lourde et sa durée d'exécution - 2 secondes sur 45 lignes - peut être rédhibitoire sur de grands tableaux.

En utilisant la méthode que j'ai utilisée précédemment la durée chez moi est de 0,026 seconde sur 45 lignes :
VB:
Sub Fusionner()
Dim a As Range, col%
Application.ScreenUpdating = False
Application.DisplayAlerts = False
On Error Resume Next
Defusionner 'lance la macro
With Rows("1:" & Cells(Rows.Count, 3).End(xlUp).Row) 'lignes entières
    .Sort .Columns(1), xlAscending, .Columns(2), , xlAscending, Header:=xlYes 'tri sur les villes puis sur les noms
    For col = 1 To 2
        Columns(col).Insert 'insère une colonne auxiliaire entière
        With .Columns(col)
            .FormulaR1C1 = "=1/(RC[1]=OFFSET(RC[1],-1,))"
            .Value = .Value 'supprime les formules
            For Each a In .SpecialCells(xlCellTypeConstants, 1).Areas
                Union(a(0, 2), a.Columns(2)).Merge 'fusionne les villes puis les noms
            Next a
        End With
        Columns(col).Delete 'supprime la colonne auxiliaire
    Next col
End With
End Sub

Sub Defusionner()
Dim c As Range
Application.ScreenUpdating = False
On Error Resume Next
ActiveSheet.ShowAllData 'si la feuille est filtrée
With Range("A1:B" & Cells(Rows.Count, 3).End(xlUp).Row)
    For Each c In .Cells
        If IsEmpty(c.MergeArea(1)) Then c.MergeArea(1) = Chr(2) 'repère les cellules vides, fusionnées ou non
    Next c
    .UnMerge 'défusionne
    .SpecialCells(xlCellTypeBlanks) = "=R[-1]C"
    .Value = .Value 'supprime les formules
    .Replace Chr(2), "" 'efface le repérage
    .Resize(, 4).Sort .Columns(2), xlAscending, Header:=xlYes 'tri sur les noms
    .Resize(, 4).Borders.Weight = xlThin 'bordures fines
End With
End Sub
@Bibouden1 que veut dire BM après le nom des villes ?

A+
 

Pièces jointes

Dernière édition:
Les durées que je relève chez moi à l'exécution de CBnClaFusio_Click :
 

Pièces jointes

Bonjour Bernard,
Je suis étonné, ça ne met pas 2 secondes chez moi !
Chez moi sur le fichier du post #15 qui vient d'être téléchargé, au 1er essai la macro CBnClaFusio_Click s'exécute en 2 secondes :

Mais effectivement aux essais suivants elle s'exécute en 0,08 seconde.

Et en ajoutant Application.ScreenUpdating = False elle s'exécute en 0,01 seconde.

A+
 
Dernière édition:
Merci beaucoup c'est parfait c'est exactement ce qu'il me faut
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
10
Affichages
1 K
Réponses
33
Affichages
3 K
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…