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

VBA Group Rows dans Excel — plans réductibles, niveaux et le piège de la ligne récapitulative

|

VBA Group Rows dans Excel — plans réductibles, niveaux et le piège de la ligne récapitulative

TL;DRRows("2:5").Group ne cache pas ces lignes et ne les supprime pas. Cela ajoute une bande à un plan (outline) réductible — les lignes sont toujours là, simplement repliables derrière un bouton +/ dans la marge. Group est un pli, pas un masquage. Deux choses font trébucher tout le monde : le bouton de réduction atterrit par défaut sur la ligne en dessous du groupe (Outline.SummaryRow), et vous devez réduire par niveau avec ShowLevels, jamais en réglant .Hidden vous-même.

Sub GroupDetailRows()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Report")
    ws.Cells.ClearOutline                 ' vider l'ancien plan d'abord, pour qu'un re-lancement reste a plat
    ws.Outline.SummaryRow = xlSummaryAbove ' mettre le bouton +/- sur la ligne de total AU-DESSUS du detail
    ws.Rows("3:7").Group                   ' replier les lignes 3-7 sous le total de la ligne 2
    ws.Outline.ShowLevels RowLevels:=1     ' reduire au niveau superieur en code, pas via .Hidden
End Sub

Le regroupement des lignes, le regroupement des colonnes et l'objet Outline lui-même forment un seul système à trois habits : .Group ajoute une bande, le plan se réduit et se développe par niveau, et un seul réglage au niveau de la feuille décide de quel côté se trouve le bouton de réduction. Maîtrisez le regroupement des lignes — le pli, le niveau, le côté récapitulatif — et le regroupement des colonnes n'est que la même idée tournée de 90 degrés, pilotée par le même objet Outline.

Ce que vous allez apprendre

  • Le modèle mental — Group est un pli, pas un masquage et pas une suppression
  • Le piège de SummaryRow — pourquoi le bouton +/ atterrit sous votre groupe, et comment le déplacer
  • Pourquoi vous réduisez par niveau avec ShowLevels, jamais en réglant .Hidden vous-même
  • Comment imbriquer .Group approfondit le niveau du plan, et pourquoi relancer votre macro sur-groupe
  • Ungroup face à ClearOutline — retirer une bande, ou effacer tout le plan

Le modèle mental : Group est un pli, pas un masquage

Rows("2:5").Group ne signifie pas « masquer les lignes 2 à 5 ». Cela signifie « rendre les lignes 2 à 5 repliables ». Excel dessine une barre de plan dans la marge de gauche avec un bouton ; cliquez dessus et les lignes se replient hors de vue ; cliquez sur le + et elles reviennent. Les lignes n'ont jamais été masquées au sens .Hidden = True — elles sont gérées par un plan (outline) qui sait les replier et les déplier à la demande.

Cette distinction est tout l'article. Un masquage est un état à sens unique qu'il faut se souvenir d'annuler. Un pli est une vue réversible qu'Excel suit pour vous, organisée en niveaux, avec des boutons que le lecteur peut cliquer. Tout ce qui surprend les gens dans le regroupement — où le bouton apparaît, pourquoi .Hidden et le plan se contredisent, pourquoi relancer la macro enterre les données trois niveaux plus bas — découle du fait que grouper est un pli structuré, pas un masquage brutal.

Le piège de SummaryRow : de quel côté atterrit le bouton

Groupez les lignes 2 à 5 et le bouton de réduction n'apparaît pas sur le groupe — il apparaît sur la ligne 6, juste en dessous. C'est parce que Worksheet.Outline.SummaryRow vaut par défaut xlSummaryBelow : Excel suppose que votre sous-total ou total se trouve sous le détail qu'il récapitule, et il y gare donc le bouton.

Ce réglage par défaut convient pour un bloc classique « détail puis total ». Il est erroné — et c'est la plainte numéro un sur le regroupement — quand votre total se trouve au-dessus du détail, comme c'est le cas sur la plupart des tableaux de bord :

ws.Outline.SummaryRow = xlSummaryAbove    ' le bouton s'attache au total AU-DESSUS du groupe
ws.Rows("3:7").Group                       ' le total est en ligne 2, le detail en lignes 3-7

Réglez-le dans l'autre sens et le bouton se détache du chiffre que tout le monde regarde réellement : votre total est en ligne 2, mais le + se retrouve en ligne 8, flottant sous la dernière ligne de détail. SummaryRow est un réglage au niveau de la feuille — décidez-le une fois, avant de construire le plan, pour qu'il corresponde à l'endroit où vivent vos totaux. Le régler après coup refait circuler les boutons sur toute la feuille, mais en faire une première étape délibérée est plus propre que d'être surpris.

Réduire par niveau, pas via .Hidden

La façon tentante de réduire un groupe en code est de masquer les lignes :

ws.Rows("3:7").Hidden = True               ' FAUX - un masquage manuel que le plan ne suit pas

Ne faites pas ça. Cela pose un masquage dont le plan ne sait rien, si bien que les boutons +/ et l'état réel des lignes divergent — le bouton dit « développé » alors que les lignes sont masquées, ou l'inverse. Réduisez plutôt via le plan, et Excel garde tout cohérent :

ws.Outline.ShowLevels RowLevels:=1         ' n'afficher que le niveau superieur - tout le reste se replie
ws.Outline.ShowLevels RowLevels:=2         ' afficher deux niveaux de profondeur - redevelopper une couche

ShowLevels pilote toute la feuille vers un niveau de plan en un seul appel, et les boutons restent honnêtes. Si vous devez développer ou réduire un seul nœud plutôt qu'un niveau entier, utilisez ShowDetail sur sa ligne récapitulative — traité avec le reste de l'objet Outline.

Niveaux : imbriquer des groupes, et pourquoi relancer sur-groupe

Groupez une plage, puis groupez une sous-plage à l'intérieur, et vous n'avez pas créé deux groupes plats — vous avez créé un plan imbriqué, un niveau plus profond :

ws.Rows("2:20").Group                       ' niveau 1 - la section entiere
ws.Rows("5:9").Group                        ' niveau 2 - un sous-bloc a l'interieur

Un plan va jusqu'à 8 niveaux de profondeur, ce qui est puissant pour une vraie hiérarchie et un piège quand cela arrive par accident. L'accident, c'est de relancer votre macro : .Group sur des lignes déjà groupées ajoute encore une bande par-dessus, si bien que le deuxième passage vous laisse au niveau 2, le troisième au niveau 3, avec les données enterrées un peu plus profondément à chaque fois. Grouper n'est pas idempotent.

Le correctif suit la même discipline que toute routine « créer si ce n'est pas déjà là » — réinitialisez avant de reconstruire :

ws.Cells.ClearOutline                       ' supprimer tout le plan, puis reconstruire a neuf
ws.Rows("3:7").Group

Effacez d'abord, groupez ensuite, et la macro produit le même plan qu'elle s'exécute une fois ou dix fois.

Ungroup face à ClearOutline

Il existe deux façons d'annuler un regroupement, et elles n'ont pas la même portée :

ws.Rows("3:7").Ungroup                       ' retire UNE bande / un niveau de cette plage
ws.Cells.ClearOutline                        ' retire TOUT le plan de la feuille, en un seul appel

Ungroup est l'outil de précision — décoller un niveau d'une seule plage. ClearOutline est la masse — effacer tout le plan et repartir propre. L'erreur consiste à boucler Ungroup pour tout effacer : c'est plus lent, délicat à bien cibler avec les bonnes plages, et c'est exactement ce que ClearOutline fait en une seule instruction. Aucun des deux ne supprime la moindre ligne de données — ils retirent le pli, pas les lignes.

Comment ExcelMaster vous aide

Grouper des lignes tient en une ligne qui cache trois décisions — de quel côté doit se trouver le bouton de réduction pour votre mise en page, s'il faut réduire par niveau ou déraper vers .Hidden, et si relancer la macro enterre discrètement vos données d'un niveau de plus à chaque fois — et se tromper sur n'importe laquelle échoue sans la moindre erreur : un bouton qui flotte loin de son total, des boutons de plan qui mentent sur l'état réel des lignes, ou un rapport replié trois niveaux de trop.

ExcelMaster vous laisse dire ce que vous voulez — « groupe les lignes de détail sous chaque total, réduit au niveau supérieur, bouton sur la ligne de total » — et il règle SummaryRow selon votre mise en page, efface l'ancien plan pour qu'un re-lancement reste plat, groupe les bonnes lignes, et réduit avec ShowLevels plutôt qu'avec .Hidden. Vous gardez le classeur et le code.

Questions fréquentes

Comment grouper des lignes en VBA ?

Appelez .Group sur des lignes entières : Rows("3:7").Group replie les lignes 3 à 7 en une bande de plan avec un bouton de réduction dans la marge de gauche. Qualifiez la feuille — ThisWorkbook.Worksheets("Report").Rows("3:7").Group — pour que cela ne dépende pas de la feuille qui se trouve être active. Les lignes ne sont ni masquées ni supprimées ; elles deviennent repliables.

Pourquoi le bouton de réduction de mon groupe est-il en dessous de mes lignes au lieu d'être au-dessus ?

Parce que Worksheet.Outline.SummaryRow vaut par défaut xlSummaryBelow, ce qui suppose que votre total se trouve sous le détail. Si votre total est au-dessus des lignes de détail, réglez ws.Outline.SummaryRow = xlSummaryAbove avant de grouper, pour que le bouton +/ s'attache à la ligne de total que tout le monde lit.

Comment réduire ou développer des lignes groupées en VBA ?

Utilisez les niveaux du plan : ws.Outline.ShowLevels RowLevels:=1 réduit au niveau supérieur, et des nombres plus élevés développent davantage de couches. Ne réglez pas vous-même .Hidden = True sur les lignes — c'est un masquage manuel que le plan ne suit pas, si bien que les boutons et l'état réel des lignes finissent par diverger.

Pourquoi ma macro ajoute-t-elle toujours plus de groupes à chaque exécution ?

Parce que .Group sur des lignes déjà groupées ajoute un niveau supplémentaire par-dessus — grouper n'est pas idempotent. Appelez ws.Cells.ClearOutline au début pour effacer tout plan existant, puis groupez à neuf, afin que le résultat soit le même que la macro s'exécute une fois ou dix fois.

Quelle est la différence entre Ungroup et ClearOutline ?

Ungroup retire une bande ou un niveau d'une plage précise ; ClearOutline retire tout le plan de la feuille en un seul appel. Pour annuler un groupe, utilisez Rows("3:7").Ungroup ; pour tout effacer, utilisez ws.Cells.ClearOutline plutôt que de boucler Ungroup. Aucun des deux ne supprime de données — ils retirent le pli.

Testé dans

Testé dans : Excel 365 (Windows 11), VBA 7.1 — vérifié le 16/09/2026.

Guides associés : VBA Group Columns · VBA Outline · VBA Hide Columns · VBA Insert Rows · VBA Delete Rows