🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA Merge Cells dans Excel — fusionner et défusionner en code (et pourquoi il vaut mieux s'en abstenir)

|

VBA Merge Cells dans Excel — fusionner et défusionner en code (et pourquoi il vaut mieux s'en abstenir)

En bref — Fusionner n'est pas du formatage. Range("A1:C1").Merge fond trois cellules en une seule qui s'étend sur trois colonnes, et seule la valeur en haut à gauche survit — B1 et C1 sont effacées sans aucun avertissement. Un bloc fusionné casse ensuite le tri, les calculs de Range, les insertions de colonnes et les boucles. Quand vous voulez seulement un titre centré sur plusieurs colonnes, utilisez Center Across Selection (HorizontalAlignment = xlCenterAcrossSelection), qui a l'air identique mais laisse chaque cellule indépendante.

Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Report")
' Cela RESSEMBLE a un titre centre - et supprime discretement B1 et C1.
ws.Range("A1:C1").Merge
' Le sosie qui garde chaque cellule separee :
ws.Range("A1:C1").HorizontalAlignment = xlCenterAcrossSelection

Fusionner des cellules est la seule opération de la famille du formatage qui ne soit pas cosmétique. Font, Interior et NumberFormat changent l'apparence d'une cellule et ne touchent jamais à son contenu. Merge fait l'inverse : il change la grille elle-même et détruit des données en le faisant. Ce guide s'articule autour de cette seule distinction — la fusion est structurelle, pas visuelle — parce que chaque casse-tête de cellule fusionnée en aval est la conséquence de traiter un changement du modèle de données comme s'il s'agissait d'un choix de formatage.

Ce que vous allez apprendre

  • Le modèle mental — fusionner change la grille, pas seulement l'apparence
  • La règle la plus importante — seule la valeur en haut à gauche survit à une fusion
  • Merge, UnMerge, MergeCells et MergeArea — les quatre que vous utilisez vraiment
  • Précisément comment les cellules fusionnées cassent le tri, les calculs de Range, les insertions et les boucles
  • Le sosie qui garde les cellules indépendantes — Center Across Selection
  • Repérer et nettoyer les cellules fusionnées sans risque en code

Le modèle mental : la fusion change la grille, pas l'apparence

Une cellule fusionnée n'est pas une cellule plus grande au même contenu — c'est un nouvel objet structurel. Là où il y avait trois cellules indépendantes, il y a désormais une seule cellule dont l'adresse est le coin haut gauche (A1) et dont l'empreinte (MergeArea) est A1:C1. B1 et C1 existent toujours comme coordonnées, mais elles sont maintenant vides et inutilisables ; tout ce qu'elles contenaient a disparu.

C'est pourquoi la règle du groupe de l'apparence — « le formatage ne change jamais la valeur » — ne s'applique pas ici. La fusion est l'exception qui la confirme. Tout ce qui suit découle de prendre cela au sérieux : si fusionner réécrit la grille et efface des valeurs, alors tout code qui, plus tard, trie, insère, parcourt en boucle ou fait de l'arithmétique sur cette grille doit composer avec une forme qui ne correspond plus au rectangle bien net qu'il suppose.

La règle la plus importante : seule la valeur en haut à gauche survit

Dites-le une fois : Merge garde la valeur de la cellule en haut à gauche et jette le reste. Excel affiche une boîte de dialogue d'avertissement à ce sujet quand vous fusionnez à la main ; en VBA il n'y a pas de dialogue — cela se produit, simplement.

ws.Range("A1").Value = "Q3"
ws.Range("B1").Value = "Region"
ws.Range("C1").Value = "Total"
ws.Range("A1:C1").Merge          ' A1 garde "Q3"; "Region" et "Total" sont EFFACES
Debug.Print ws.Range("B1").Value ' n'affiche rien - B1 est maintenant vide

Si vous ne voulez aucune perte de données, vous ne devez pas fusionner des cellules qui contiennent des valeurs — ne fusionnez que des plages vides, ou déplacez d'abord les valeurs. C'est la raison pour laquelle une macro qui « range juste l'en-tête » peut discrètement supprimer deux colonnes de libellés : la fusion ressemblait à un alignement, mais c'était une suppression.

Il n'y a ici aucun filet de sécurité sur lequel compter. Contrairement au bouton Fusionner du ruban, la méthode .Merge de VBA ne déclenche aucun avertissement — rien ne vous empêche de fusionner par-dessus des données actives —, c'est donc à vous de faire la vérification et de ne fusionner que des plages dont vous savez qu'elles sont vides. Couper les alertes avec Application.DisplayAlerts = False (fréquent dans les macros en masse) ne ferait jamais que masquer un avertissement, jamais la perte de données : éteindre l'alarme ne rend pas l'incendie inoffensif.

Merge, UnMerge, MergeCells et MergeArea

Quatre membres couvrent tout ce que vous faites avec les fusions :

ws.Range("A1:C1").Merge                 ' fond en une seule cellule (la valeur en haut a gauche gagne)
ws.Range("A1:C3").Merge Across:=True    ' fusionne chaque LIGNE separement - trois fusions 1x3, pas un bloc
ws.Range("A1").UnMerge                  ' divise le bloc fusionne en cellules individuelles
Debug.Print ws.Range("B1").MergeCells   ' True si B1 fait partie d'une cellule fusionnee
Debug.Print ws.Range("B1").MergeArea.Address  ' "$A$1:$C$1" - le bloc complet auquel B1 appartient

Deux méritent qu'on s'y attarde. Merge Across:=True est la variante par ligne — elle fusionne chaque ligne de la plage indépendamment, ce que vous voulez pour des titres de ligne répétés et qui n'est presque jamais évident d'après le nom. Et MergeArea est la propriété qui vous sauve : à partir de n'importe quelle cellule d'un bloc fusionné, elle renvoie le bloc entier, si bien que vous pouvez le lire ou le défusionner sans connaître ses bornes exactes.

Comment les cellules fusionnées cassent vos macros

C'est le coût pratique, et c'est pourquoi les développeurs expérimentés évitent les fusions dans les plages de données. Quatre choses cassent :

  • Le tri lève une erreur. Triez une plage qui contient des cellules fusionnées et Excel déclenche « Cette opération nécessite que les cellules fusionnées soient de taille identique. » Un seul en-tête fusionné peut stopper net VBA Sort.
  • Les calculs de Range mentent. Un A1:C1 fusionné indique un .MergeArea.Columns.Count de 3, mais en tant que valeur il se comporte comme une seule cellule en A1. Le code qui suppose une colonne par valeur compte de travers.
  • Les insertions et suppressions sont bloquées. Vous ne pouvez pas insérer ni supprimer une colonne qui passe au milieu d'un bloc fusionné — Excel refuse, si bien que les modifications structurelles échouent sur des dispositions que vous croyiez correctes.
  • Les boucles sautent des cellules. For Each c In Range("A1:C1") visite A1 (avec la valeur) puis B1, C1 comme cellules vides — la fusion n'en a pas fait une seule itération, elle en a rendu deux vides.

Aucune ne s'annonce comme « c'est la fusion qui a fait ça ». Elles apparaissent sous la forme d'une erreur de tri, d'un décompte faux de deux, ou d'un vide là où vous attendiez un libellé — des heures plus tard, loin de la fusion.

Le sosie qui garde les cellules indépendantes : Center Across Selection

Voici la partie tranchée, et c'est la chose la plus utile de tout ce guide : quand vous avez seulement besoin d'un titre centré sur plusieurs colonnes, ne fusionnez pas — utilisez Center Across Selection. Elle produit un résultat visuel identique, mais chaque cellule reste séparée, si bien que le tri, l'insertion, les boucles et les calculs de Range continuent tous de fonctionner :

' Ressemble exactement a un titre fusionne couvrant A1:C1 - mais A1, B1, C1 restent independants.
ws.Range("A1").Value = "Quarterly Report"
ws.Range("A1:C1").HorizontalAlignment = xlCenterAcrossSelection

Le texte réside dans la cellule en haut à gauche et est dessiné centré sur les cellules vides à sa droite, purement comme un alignement. Rien n'est effacé, rien n'est fusionné. Réservez la vraie Merge au cas rare où vous avez réellement besoin d'une seule cellule physique — un unique bloc de légende au-dessus d'un formulaire imprimé — et jamais pour des en-têtes au-dessus de données que vous allez trier ou filtrer.

Repérer et nettoyer les cellules fusionnées

Vous héritez d'une feuille pleine de fusions ? Le nettoyage sûr consiste à : repérer chaque bloc fusionné via son MergeArea, noter la valeur, défusionner, puis réappliquer Center Across Selection pour que l'apparence survive :

Dim c As Range
For Each c In ws.UsedRange
    If c.MergeCells Then
        With c.MergeArea
            .UnMerge
            .HorizontalAlignment = xlCenterAcrossSelection   ' garder l'aspect centre, perdre la fusion
        End With
    End If
Next c

Une précaution pour tester les fusions : MergeCells renvoie True, False, ou Null quand une plage mêle des cellules fusionnées et non fusionnées. Lire ce Null dans une variable Boolean lève une erreur de type, testez-le donc sur des cellules uniques (comme ci-dessus) ou avec If c.MergeCells = True Then, qui gère Null sans risque. Ce Null relève de la même idée d'« état mixte » que vous croisez ailleurs en VBA — une propriété qui décrit une plage entière ne peut répondre proprement que lorsque la plage est uniforme.

Comment ExcelMaster aide

Les cellules fusionnées sont un piège précisément parce qu'elles ont l'air inoffensives — un titre centré, un en-tête bien rangé — tout en effaçant des valeurs et en désarmant le tri, les insertions, les boucles et les calculs de Range plus loin dans la macro. Et la solution (Center Across Selection) est de celles dont la plupart des gens n'ont jamais entendu parler, cachée derrière un bouton Merge d'apparence évidente.

ExcelMaster vous laisse dire ce que vous voulez comme disposition. Demandez-lui de « centrer le titre sur les trois premières colonnes » et il utilise xlCenterAcrossSelection — le sosie sûr — au lieu d'une fusion destructrice de données, et quand vous lui confiez une feuille pleine de fusions héritées, il les défusionne, préserve les valeurs et garde l'apparence centrée. Vous gardez le classeur et le code ; vous vous épargnez l'après-midi passé à remonter d'un libellé vide ou d'une erreur « les cellules fusionnées doivent être de taille identique » jusqu'à une fusion que vous aviez oubliée.

Questions fréquentes

Comment fusionner des cellules en VBA Excel ?

Utilisez Range("A1:C1").Merge pour fondre une plage en une seule cellule. Seule la valeur en haut à gauche survit — les autres sont effacées sans avertissement en code — ne fusionnez donc que des plages vides ou déplacez d'abord les valeurs. Pour fusionner chaque ligne d'un bloc séparément, utilisez Range("A1:C3").Merge Across:=True.

Pourquoi la fusion de cellules a-t-elle supprimé mes données en VBA ?

Parce que Merge ne garde que la valeur de la cellule en haut à gauche et jette tout le reste de la plage. Excel affiche un avertissement quand vous fusionnez à la main, mais VBA fusionne en silence. Si vous voulez l'apparence sans perdre de données, utilisez Range("A1:C1").HorizontalAlignment = xlCenterAcrossSelection, qui centre le titre sur les colonnes tout en gardant intacte la valeur de chaque cellule.

Comment défusionner des cellules en VBA ?

Appelez UnMerge sur n'importe quelle cellule du bloc : Range("A1").UnMerge. Comme vous pouvez ignorer les bornes exactes, utilisez d'abord MergeAreaRange("B1").MergeArea.UnMerge divise tout le bloc auquel B1 appartient. Après défusion, la valeur d'origine en haut à gauche reste dans la cellule en haut à gauche ; les autres cellules sont vides.

Quelle est la différence entre Merge et Center Across Selection ?

Merge fond physiquement les cellules en une seule, effaçant tout sauf la valeur en haut à gauche et cassant le tri, les insertions et les boucles. Center Across Selection (HorizontalAlignment = xlCenterAcrossSelection) ne fait que dessiner la valeur en haut à gauche centrée sur les cellules voisines — elles restent indépendantes, si bien que les formules, le tri et les modifications structurelles continuent de fonctionner. Elle a l'air identique et est presque toujours le meilleur choix.

Pourquoi le tri échoue-t-il quand une plage contient des cellules fusionnées ?

Excel ne peut pas réordonner les lignes quand des blocs fusionnés finiraient de tailles différentes, il déclenche donc « Cette opération nécessite que les cellules fusionnées soient de taille identique » et refuse de trier. Une seule cellule d'en-tête fusionnée au-dessus d'une plage de données suffit à le déclencher. Défusionnez la plage (et passez à Center Across Selection pour les éventuels titres) avant de trier.

Testé dans

Testé dans : Excel 365 (Windows 11), VBA 7.1 — dernière vérification le 14/08/2026.

Guides associés : VBA Borders · VBA Column Width · VBA Range · VBA Sort · VBA Cell Color