Fusion de plusieurs macro en une seule

Bonjour,

J’ai plusieurs macros qui m’enlèvent les fusions des colonnes A à H. je voudrais savoir s’il est possible de regrouper ces 8 macro en une seule ?

Ci-dessous je vous mets la macro pour la colonne A et B :

Macro pour colonne A :

Sub DetaillerLaColonneA()

'Enlève la fusion de la colonne A

    derln = Range("J" & Rows.Count).End(xlUp).Row
    derCol = Cells(2, Columns.Count).End(xlToLeft).Column
    Application.ScreenUpdating = False

    Position = ActiveCell.Address

    'vérifie si il existe un filtre et si oui l'enlève

If Worksheets("Liste AF à compléter par DATES").AutoFilterMode Then
     Worksheets("Liste AF à compléter par DATES").AutoFilterMode = False
End If

    Range("A3:A" & derln).UnMerge
    tabloA = Range(Cells(3, 1), Cells(derln, 1))
    For i = 2 To UBound(tabloA, 1)
        If tabloA(i, 1) = "" Then
                tabloA(i, 1) = tabloA(i - 1, 1)
        End If
    Next i
    Range("A3").Resize(UBound(tabloA, 1), 1) = tabloA

        'remet le filtre

    Range("A2:BA2").Select
    Selection.AutoFilter

    Range(Position).Select

End Sub

Macro pour la colonne B :

Sub DetaillerLaColonneB()

'Enlève la fusion de la colonne B

    derln = Range("J" & Rows.Count).End(xlUp).Row
    derCol = Cells(2, Columns.Count).End(xlToLeft).Column
    Application.ScreenUpdating = False

    Position = ActiveCell.Address

    'vérifie si il existe un filtre et si oui l'enlève

If Worksheets("Liste AF à compléter par DATES").AutoFilterMode Then
     Worksheets("Liste AF à compléter par DATES").AutoFilterMode = False
End If

    Range("B3:B" & derln).UnMerge
    tabloB2 = Range(Cells(3, 2), Cells(derln, 2))
        For i = 2 To UBound(tabloB2, 1)
        If tabloB2(i, 1) = "" Then
                tabloB2(i, 1) = tabloB2(i - 1, 1)
        End If
    Next i
    Range("B3").Resize(UBound(tabloB2, 1), 1) = tabloB2

        'remet le filtre

    Range("A2:BA2").Select
    Selection.AutoFilter

    Range(Position).Select

End Sub

Merci.

Bonjour, si le but final et d'enlever la fusion de toutes les cellules d'une plage ou d'une feuille

Sub Macro1()

    Cells.Select  ' ou indiquation de la plage
    Selection.UnMerge

End Sub
Sub enleveFusion()
  Dim tb()
  Dim pl As Range
  Dim i As Integer, j As Integer

  If Worksheets("Liste AF à compléter par DATES").AutoFilterMode Then
     Worksheets("Liste AF à compléter par DATES").AutoFilterMode = False
  End If

  Set pl = Sheets("Liste AF à compléter par DATES").Range("A1").CurrentRegion
  tb = pl.Value2

  For i = 1 To UBound(tb, 2)
    For j = 1 To UBound(tb, 1)
      If tb(j, i) = "" Then tb(j, i) = tb(j - 1, i)
    Next j
  Next i
  pl.UnMerge
  pl.Resize(UBound(tb, 1), UBound(tb, 2)) = tb

End Sub
5enlevefusion.xlsm (16.32 Ko)

Merci pour ta réponse rapide mais ta solution ne peut pas fonctionner. Le tableau au départ comporte des colonnes fusionnées pour des raisons pratiques de lisibilités et j'ai besoin d'enlever certaines de ces fusions pour faire des calculs particuliers. Ce "défusionnement" doit être fait par blocs correspondant aux nombres de ligne qui est déterminer en colonne "I" dans le fichier exemple joint.

Je ne sais pas si j'étais clair c'est pour ça que je te mets un fichier exemple avec un échantillon du tableau ou tu pourras voir comment il est avant et après le "défusionnage". Les macros sont mises également et tu pourras constater qu'elles sont répétitives d'où ma question à savoir si on peut les regrouper en une seule.

défusionnage".

Re, bonjour

En réalité la question était mal posée. Ce n'est pas un simple défusionnement car vous souhaitez conserver la même valeur dans toutes les cellules aprés

"Défusionnement".

Consernant le code donné précédemment ; j'avais indiqué toutes les cellules ou plage

Avec votre fichier il est beaucoup plus facile de définir la plage maintenant pour défusionner et tester les cellules de cette même plage

pour leur rendre la valeur avant retrait de la fusion : Ceci devrait remplacer toutes vos macro colonne B, C, D, F, G et I

Sub Macro1()
Dim C As Range
Dim NBLIGNE As Long
'Detection nombre de ligne total du tableau
NBLIGNE = Range("B65536").End(xlUp).Row

'Selection de la plage multiple
    Range("B3:D" & NBLIGNE & ",F3:G" & NBLIGNE & ",I3:I" & NBLIGNE).Select
'Suppression de la fusion
    Selection.UnMerge
'Test valeur de la cellule si vide alors égale à cellule ligne précédente.
For Each C In Selection
If C.Value = "" Then
C.Value = Cells(C.Row - 1, C.Column).Value
End If
Next C
End Sub

Merci à vous deux. Les deux propositions fonctionnent mais celle de Yal_excel est plus rapide. Sachant que j'ai plus de 15000 ligne à passer en revue c'est appréciable .

J'ai une question à vous deux :

@yal_excel : Tu me précise dans ta macro qu'il suffit de remplacer "To UBound(tb, 2)" par 8 pour que le "défusionnage" s'arrête à la colonne H. Ma question c'est pourquoi de pas définir la plage avec "Set pl = Sheets("Liste AF à compléter par DATES").Range("A2:H" & Range("H" & Rows.Count).End(xlUp).Row)" et non pas avec "Set pl = Sheets("Liste AF à compléter par DATES").Range("A2:J" & Range("J" & Rows.Count).End(xlUp).Row)" ?

@Xmenpl : A quoi correspond le range ("B65536") dans NBLIGNE = Range("B65536").End(xlUp).Row ?

Question subsidiaire : Comment on peut adapter la macro si j'ai une colonne discontinue au 8 première colonne (c'est la colonne V) à laquelle je voudrais appliquer également la macro de "défusionnage". Concrètement ce sont les colonnes de A à H et la colonne V qui m'intéresse pour la macro.

Sinon encore merci pour vos solutions. je mets le sujet en résolu.

Pour info:

@Xmenpl : A quoi correspond le range ("B65536") dans NBLIGNE = Range("B65536").End(xlUp).Row ?

Test sur la colonne B à partir de la cellule 65536 j'aurai pu mettre aussi 99000 choisir un nombre dont on est sur qu'il dépasse la fin du tableau.

( en remontant pour trouver la dernière cellule non vide. .... on trouve le numéro de la dernière ligne du tableau. )

"Ma question c'est pourquoi de pas définir la plage avec "Set pl = Sheets("Liste AF à compléter par DATES").Range("A2:H" & Range("H" & Rows.Count).End(xlUp).Row)". C'est effectivement une solution tout à fait satisfaisante.

Pour la question subsidiaire, je prépare une alternative qui y réponde…

Merci à vous deux pour vos réponses.

Voila qui devrait satisfaire la demande.

Je serais curieux de savoir si les deux ont le même temps d'exécution.

N'oubliez pas de marquer le sujet en "Résolu" quand il le sera

Impec 👍👍👍👍 après avoir adapté la macro à la ligne "selCol = Array(2, 3, 4, 6, 7, 8, 22)" (mis 22 à la place de 9) et la ligne "Set pl = Sheets("Liste AF à compléter par DATES").Range("A2:V" & Range("V" & Rows.Count).End(xlUp).Row)" (mis V à a place de J pour que l'info de la colonne V soit pris en compte) ta macro donne le résultat.

Pour répondre à ta question la 1ère macro met 12 secondes pour traiter les 13400 contre 44 secondes pour la deuxième macro mais elle pren en compte une colonne de plus.

Merci pour tout.😊

En fait ça traite 1 colonne de moins, la première version traite toutes les colonnes d 1 à 8 et prend 3.66 fois moins de temps. Ca me semble plutôt mauvais comme progrès. Sans compter que certaines colonnes n'étant pas traitées ça empêche de transformer la plage en tableau. Et les tableaux dans excel c'est magique...

Je ne comprends pas trop ta réponse qu'est-ce qu'il faut faire alors pour que ce soit mieux ?

Pour tester j'ai créé par copier coller un tableau de 30 colonnes et 10000 lignes. La première macro donne le résultat en 1.6s et la deuxième en 3.5s. Ce qui fait un écart du simple au double sans que ce soit catastrophique. Je pense que cela vient de ce que le défusionnage se fait colonne par colonne. Quand à l'écart de temps entre chez moi et chez toi je ne vois que les performances des machines pour l'expliquer. Peut être la quantité de mémoire.

Rechercher des sujets similaires à "fusion macro seule"