Changement d’en-têtes dans une ligne figée (Microsoft Excel)
Tim a des feuilles de calcul qui ont deux sections distinctes (appelons-les sections supérieure et inférieure) qui ont des en-têtes de colonne légèrement différents. Il a gelé la rangée du haut pour garder les en-têtes de la section supérieure visibles tout en faisant défiler vers le bas, mais après avoir fait défiler un certain point, Tim finit par regarder les données de la section inférieure avec les en-têtes de la section supérieure toujours en haut. Il aimerait savoir s’il existe un moyen de basculer cette ligne d’en-tête gelée pour afficher les en-têtes de section inférieure lorsqu’il fait défiler jusqu’au point que seules les données de la section inférieure sont affichées.
Oui, il existe un moyen de le faire, mais cela implique l’utilisation de macros.
Avant d’envisager une solution basée sur des macros, vous voudrez peut-être envisager de restructurer vos données afin que chacune de vos sections se trouve sur des feuilles de calcul différentes. (Du point de vue de la conception, ce serait la solution la plus simple.) Si ce n’est pas possible, vous devez alors rechercher des macros.
Une approche simple consiste simplement à modifier ce qui est stocké dans la ligne supérieure (ligne 1) de votre feuille de calcul, en fonction de la ligne sélectionnée. Par exemple, la macro suivante apportera des modifications dans la ligne supérieure en fonction de l’emplacement de la cellule active. Si c’est avant la ligne 40, alors un ensemble d’en-têtes est inséré dans la première ligne; si après la ligne 40, un autre ensemble d’en-têtes est rempli.
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim iBottomData As Integer iBottomData = 40 If ActiveCell.Row < iBottomData Then Cells(1, 1).Value = "Last Name" Cells(1, 2).Value = "First Name" Cells(1, 3).Value = "Address" Cells(1, 4).Value = "Balance" Else Cells(1, 1).Value = "Account" Cells(1, 2).Value = "Sales Rep" Cells(1, 3).Value = "Status" Cells(1, 4).Value = "" End If End Sub
Pour utiliser la macro, assurez-vous simplement de la placer dans la fenêtre de code de la feuille de calcul qui contient les deux sections de données. Vous devez également modifier la valeur affectée à la variable iBottomData pour refléter le numéro de ligne d’où commence votre section de données inférieure.
Si vous souhaitez réellement modifier la ligne figée à mesure que vous vous déplacez dans la feuille de calcul, la macro doit être un peu plus robuste. En fait, il y a deux macros qui suivent (les deux vont, encore une fois, dans la fenêtre de code de la feuille de calcul), et elles sont mises en action lorsque vous modifiez la cellule sélectionnée et que vous cliquez avec le bouton droit sur la feuille de calcul.
Private Sub Worksheet_BeforeRightClick(ByVal _ Target As Range, Cancel As Boolean) Application.ScreenUpdating = False ActiveWindow.FreezePanes = False ActiveWindow.Split = False Application.EnableEvents = False Application.Goto Cells(1, 1), scroll:=True With ActiveWindow .SplitColumn = 0 .SplitRow = 1 End With ActiveWindow.FreezePanes = True Application.Goto Cells(Target.Row - 1, _ Target.Column), scroll:=True Application.EnableEvents = True On Error Resume Next 'MUST reenable events Application.EnableEvents = False ActiveCell.Offset(-1, 1 - Target.Column).Select ' so the right click menu doesn't popup ' only if this is the second header row. Cancel = True Application.EnableEvents = True End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Application.ScreenUpdating = False If Cells(Target.Row, 1).Value <> "title2" Then Exit Sub ActiveWindow.FreezePanes = False ActiveWindow.Split = False Application.Goto Cells(Target.Row, 1), scroll:=True With ActiveWindow .SplitColumn = 0 .SplitRow = 1 End With ActiveWindow.FreezePanes = True On Error Resume Next 'MUST reenable events Application.EnableEvents = False ActiveCell.Offset(1, 1 - Target.Column).Select Application.EnableEvents = True End Sub
Le gestionnaire d’événements Worksheet_SelectionChange déplace automatiquement le fractionnement figé en dessous de la deuxième ligne d’en-têtes lorsque le curseur de votre cellule active atteint cette ligne. Cette ligne est détectée dans l’instruction If qui vérifie si la première cellule de la ligne contient le texte « title2 » ou non.
(Évidemment, cela devrait être changé pour refléter ce qui sera vraiment dans cette première cellule.)
Le gestionnaire d’événements Worksheet_BeforeRightClick déplace le fractionnement gelé vers le premier ensemble d’en-têtes mais laisse la cellule active à la ligne au-dessus du deuxième ensemble d’en-têtes.
Vous devez comprendre que les deux solutions macro présentées dans cette astuce supposent que vous faites réellement défiler la feuille de calcul et que vous modifiez la cellule sélectionnée au fur et à mesure. (En d’autres termes, vous appuyez sur la flèche vers le bas pour faire votre défilement.) Si vous modifiez simplement ce qui est affiché dans la feuille de calcul à l’aide de la barre de défilement verticale, les en-têtes figés ne changeront pas car vous ne modifiez pas le cellule sélectionnée et les gestionnaires d’événements ne se déclenchent jamais.
La création d’une solution plus complète dépasserait le cadre de cette astuce car elle impliquerait une interface avec le système d’exploitation réel.
Si vous êtes intéressé à suivre cette voie, cependant, un bon point de départ pourrait être cette page du site Web de Chip Pearson:
http://www.cpearson.com/excel/DetectScroll.htm
_Note: _
Si vous souhaitez savoir comment utiliser les macros décrites sur cette page (ou sur toute autre page des sites ExcelTips), j’ai préparé une page spéciale qui comprend des informations utiles.
lien: / excelribbon-ExcelTipsMacros [Cliquez ici pour ouvrir cette page spéciale dans un nouvel onglet de navigateur]
.
ExcelTips est votre source pour une formation Microsoft Excel rentable.
Cette astuce (11231) s’applique à Microsoft Excel 2007, 2010, 2013, 2016, 2019 et Excel dans Office 365. Vous pouvez trouver une version de cette astuce pour l’ancienne interface de menu d’Excel ici:
link: / excel-Switching_Headers_in_a_Frozen_Row [Changement d’en-têtes dans une ligne gelée]
.