Fusion automatique des cellules en doublon VBA

Et bien voilà l'essence même d'un forum : une réponse collégiale et ceci qu'on soit un grand ou pas de ce forum !

C'est ça que j'aime, et si j'aime alors je met un !

@ bientôt

LouReeD

Bonsoir à tous ,

Un essai par VBA classique et assez rapide (me semble-t-il -> 1 s pour 10 000 lignes de données sources).

Cliquer sur une des deux flèches pour initialiser un jeu de données sources, puis cliquer sur Hop!

Sub FusionnerCentrer()
Dim t, i&, i1&, k&, j&, j1&, q&
  Application.ScreenUpdating = False: Application.DisplayAlerts = False
  t = Range("a1:b" & Cells(Rows.Count, "a").End(xlUp).Row + 1)
  i1 = 2: k = 1
    For i = 3 To UBound(t)
      If LCase(Trim(t(i, 1))) = LCase(Trim(t(i1, 1))) Then
        k = k + 1
      Else
        If k > 1 Then Cells(i1, 1).Resize(k).Merge
        j1 = i1: q = 1
        For j = j1 + 1 To j1 + k
          If LCase(Trim(t(j, 2))) = LCase(Trim(t(j1, 2))) Then
            q = q + 1
          Else
            If q > 1 Then Cells(j1, 2).Resize(q).Merge
            q = 1: j1 = j
          End If
        Next j
        k = 1: i1 = i
      End If
    Next i
    Columns("a:b").Resize(UBound(t)).VerticalAlignment = xlVAlignCenter
    Application.DisplayAlerts = True
End Sub

re,

je m'excuse, c'est un "photo finish" avec mafraise comme gagnant (sur mon ordinateur)

- mafraise = 1.6 s pour ces 10.000 lignes

- Klin89 = 2.3 s pour ces 10.000 lignes

Bonsoir,

une fois encore on peut constater que les accès feuilles "ralentissent" les macros ! Faire le test de redondance en VBA c'est le top !

@ bientôt

LouReeD

.Re à tous,

Je viens de tester la macro de mafraise du post #22 et ça ne renvoie pas le résultat escompté.

A droite pour le test, au centre la macro de mafraise et à gauche la mienne.

test1

klin89

Bonjour à tous ,

Bonjour à Klin89 ,

Un grand merci à Klin89 pour avoir détecté le bug dans ma macro de mon dernier message.

Voici le classeur corrigé. Le bogue était un bogue classique (en tout cas pour moi car ce n'est pas la première fois) pour ce type de boucle. Je n'avais pas testé la nécessité de fusionner (ou non) à la sortie de chacune des deux boucles.

J'ai laissé ta macro dans le classeur joint et j'ai pris ton jeu de test. Encore une fois merci.

Merci à tous pour vos messages, j'ai tout essayé et vos solutions sont toutes meilleures les unes que les autres.

Bravo et encore merci !

Re

@mafraise, je valide c'est parfait

@BsAlv, j'apprécierai toujours tes interventions, n'hésite jamais à me corriger

Sur la lancée de ce post et juste pour le fun, serait-il possible de réaliser la même chose sur 3 colonnes, je joins un fichier pour l'exemple avec les différentes macros.

cours fusion
15cours.xlsm (19.06 Ko)

klin89

Bonjour à tous ,

Klin89 a proposé : serait-il possible de réaliser la même chose sur 3 colonnes ?

Dans le fichier joint, un essai de procédure FusionnerColonnes(xSource , NbrColonne) pour fusionner les N premières colonnes d'une plage. N n'a pas de limitation si ce n'est le nombre de colonnes de la plage.

  • xSource : C'est un range qui est la plage à fusionner
  • NbrColonne : c'est le nombre de colonnes à fusionner à partir de la première colonne de la plage

Exemple d'appel de la procédure : FusionnerColonnes Sheets("Feuil1").Range("a1:d33"), 4 . On fusionne les 4 premières colonnes de la plage a1:d33 de la feuille "Feuil1".

  • la plage peut contenir la ligne des en-têtes à condition qu'ils soient différents des valeurs de la première ligne des données (pour les colonnes à fusionner bien sûr)
  • la plage peut être n'importe où sur la feuille
  • si la plage contient déjà des cellules fusionnées alors on ne fait pas le traitement.

Pour l'exemple :

  • sélectionner en cellule i1 le nombre de colonnes à fusionner : de 1 à 4
  • cliquer sur la flèches INIT pour réinitialiser la plage source
  • cliquer sur le bouton fusionner pour lancer les fusions

Je laisse Klin89 vérifier si tout est OK .

re,

je suis hors compétition, "trop lent" (environ 4x ??), je pense que vos temps seront environ 0.5 sec

19cours.xlsm (275.23 Ko)

Bonjour BsAlv ,

Pour généraliser à un nombre quelconque de colonnes à fusionner, j'ai changé ma méthode à partie de la deuxième colonne à fusionner. Pour moi c'est plus simple à coder et plus facile à maintenir mais c'est un peu plus lent me semble-t-il. Pour 10 000 lignes source et 4 colonnes à fusionner, cela prend 3,6 s sur mon PC.

Allez bonne-nuit

re,

j'avais aussi l'idée de modifier ma macro pour la rendre plus récurrent, mais c'est pour demain.

Bonjour,

Maintenant on est demain...

Perso j'ai un nouveau challenge : une plage un nombre de colonne et si on ajoutait un ordre d'application : 4 colonnes oui mais là colonne de référence c'est la 3, puis la 1 ensuite la 4 et pour finir la 2 !

C'est juste pour vous " embêter " le jour de la fête du travail !

Sinon pour le reste

@ bientôt

LouReeD

Bonjour @LouReed , à tous ,

LouReed à dit :

Perso j'ai un nouveau challenge : une plage un nombre de colonne et si on ajoutait un ordre d'application : 4 colonnes oui mais là colonne de référence c'est la 3, puis la 1 ensuite la 4 et pour finir la 2 !

C'est juste pour vous " embêter " le jour de la fête du travail !

Comme c'est la fête du travail, nous on travaille. Normal quoi ! Est-ce qu'on ne boit pas de bière à Munich les jours de la fête de la bière ? Bien sûr que non, on en boit d'ailleurs bien plus que les autres jours.

En plus on travaille gratis, ce n'est pas parce qu'on travaille le 1er mais qu'on sera payé double .

Dans le fichier joint, un essai de fusion des colonnes. Les colonnes sont dans un ordre quelconque et leur nombre est variable.

La procédure est : FusionnerColonnes xSource , Colonnes

  • xSource est de type range. C'est la plage des données sources
  • Colonnes est la liste des numéros de colonnes à fusionner
  • Exemple d'appel : FusionnerColonnes Sheets("Feuil1").Range("a1").CurrentRegion, 3, 1, 4, 2
  • => Sheets("Feuil1").Range("a1").CurrentRegion est la plage des données
  • => 3, 1, 4, 2 sont les numéros des colonnes à fusionner (dans cet ordre). Les n° de colonnes sont relatifs à la plage des données

Un exemple de temps d'exécution sur mon PC pour 10 000 lignes de données sources et quatre colonnes à fusionner (3, 1, 4, 2) : 3,3 s.

Bonjour mafraise !

Et ben, je vais regardais ceci de prés.
Le principe ? Fusion de la colonne de référence et navigation sur les trois autres en fonction des ces fusions ?

Bonne fin de journée chômée !

@ bientôt

LouReeD

Re,

LouReeD à écrit :

Le principe ? Fusion de la colonne de référence et navigation sur les trois autres en fonction des ces fusions ?

Exactement.

En regardant ma procédure, le traitement de la première colonne ressemble beaucoup au traitement des colonnes suivantes et pourtant je n'ai pas trouvé (pour l'instant) un traitement pouvant inclure les deux cas (il faut dire que les principes diffèrent).

J'arrête là pour aujourd'hui sur cette question (sauf si découverte d'une erreur). On est le 1er mai quand même ! Pour que ce soit un jour parfait, j'hésite encore entre une visite au zoo puis une toile ou bien une p'tite promenade sur la côte (du côté sauvage); on va voir ce qu'en dit Caroline.

Re,

Waouh , vous êtes vraiment trop fort mafraise , BsAlv, franchement chapeau bas pour cette leçon d'algorithmie.

Ce qui me plait chez vous, c'est cette émulation toujours teintée d'humilité, vous êtes des gens formidables, j'apprécie vraiment beaucoup.

Merci à tous, je n'oublie pas LouReed et les autres.

klin89

re,

merci Klin89, mais moi, je m'amuse aussi avec des comparaisons comme çà, comme çà on apprend des choses ...

excusez-moi, MaFraise, mais j'ai continué avec mon fichier de hier 3:25 sans vos modifs de hier 13:54, comme votre macro avait besoin de 3.3 sec pour 10.000 lignes.

Dans cette version, les 3 anciennes macros qui fusionnent que les 3 permières colonnes pour ma macro et les 2 premières colonnes pour Klin89 et MaFraise. Bon, j'ai ajouté un 4ememacro "Recurrent" qui le fait pour les 4 colonnes dans la séquence déclarée dans les cellules J1:J4.

Bon ma macro était hors compétition (à 3 sec) et les 2 autres en photo-finish à 0.4-0.5 sec, mais la nouvelle macro est maintenant 3eme dans le même photo-finish, mais elle l'a fait avec les 4 colonnes dans la séquence demandée !!! Et pour 10.000 lignes (macro "main2") 2.8 sec (légèrement en dessous des 3.3 sec de MaFraise, peut-être j'ajoute encore sa macro pendant la journée pour voir la différence).

Donc maintenant, vous pouvez modifier la séqeunce dans J1:J4 et poussez le bouton "recurrent"

PS. je ne connais pas bien le terme français pour "recurrent"

7cours.zip (391.57 Ko)

Bonjour BsAlv ,

Ma dernière macro comporte des instructions SELECT que j’avais placées dans le code pour la mise au point de la macro et que je ne n'avais pas enlevées (oubli ) .

Voici la macro sans les "select". Elle est donc légèrement plus rapide. Pour 10 000 lignes, la durée est d'environ 2 s.

nota : pour les durées d'exécution on est arrivé à un niveau où une ou deux secondes de différence n'a plus beaucoup d'importance... 1 seconde représente environ 0,49 milliardième (x) du temps que j'ai déjà passé sur terre. Ce n'est pas grand chose. Vu mon âge, et si je devenais centenaire, 1 seconde représenterait environ 0,91 milliardième (y) du temps qu'il me reste à passer sur terre. Ce n'est pas grand chose non plus . Exercice : à partir de x et y, calculer mon âge (la formule est relativement simple).

,

sur mon ordinateur, (un petit peu plus lent, je suppose), ces 2 macros le font toujours en environ 2.50 sec sur 10.000 lignes et une fois la vôtre est la plus vite et la prochaine fois, la mienne, mais l'écart est max 100 msec. Donc, comme vous l'aviez déjà dit, cela ne représente rien.

PS. nous avons à peu près le même âge (moi = 1961)

Rechercher des sujets similaires à "fusion automatique doublon vba"