Menu pour effectuer différents types de sélection
Traduction d'un fichier de démonstration de John Walkenbach qui va nous permettre, grâce à un menu, de sélectionner des cellules par rapport à la cellule active. Non seulement ce fichier est intéressant en lui même car rien ne nous empêche de le sauvegarder en XLA ou d'adjoindre le code dans nos macros complémentaires personnelles mais il constitue une source pour divers copier-coller dans d'autres fonctions que nous pourrions créer
Le système est assez simple, d'abord une procédure Auto_Open qui se déclenche automatiquement à l'ouverture du fichier (parce que c'est un nom réservé dans Excel). Elle va créer notre menu dans la barre de menu. Dans cette procédure, John définit 2 tableaux en mémoire (Cap & Mac) pour stocker des variables de type string (Chaîne de caractère). Il en récupére les valeurs en utilisant les adresses de ces tableaux et en injecte le contenu dans la barre de menu
Sub Auto_Open()
' Crée un nouveau menu et ajoute les items
' Ceci crée 2 tableaux dans la mémoire
Dim Cap(1 To 15)
Dim Mac(1 To 15)
Dim NomMenu As String
NomMenu = "&Selection_Demo"
<span style="color: brown;"><b>' </b></span><b>Il stocke des variables dans les cases des 2 tableaux en mémoire</b>
Cap(1) = "Sélectionner vers le bas - Ctrl+Maj+Flèche Bas"
Mac(1) = "SelectDown"
Cap(2) = "Sélectionner vers le Haut - Ctrl+Maj+Up"
Mac(2) = "SelectUp"
Cap(3) = "Sélectionner à droite - Ctrl+Maj+Flèche Droite"
Mac(3) = " SelectToRight"
Cap(4) = "Sélectionner à gauche - Ctrl+Maj+Flèche Gauche"
Mac(4) = " SelectToLeft"
Cap(5) = "Sélectionner zone contigue - Ctrl+Maj+*"
Mac(5) = " SelectCurrentRegion"
Cap(6) = "Sélectionner zone active - End, Home, Ctrl+Maj+Home"
Mac(6) = " SelectActiveArea"
Cap(7) = "Sélectionner les cellules contigues dans la colonne de la cellule active"
Mac(7) = " SelectActiveColumn"
Cap(8) = "Sélectionner les cellules contigues dans la ligne de la cellule active"
Mac(8) = " SelectActiveRow"
Cap(9) = "Sélectionner une colonne entière - Ctrl+Barre d'Espace"
Mac(9) = " SelectEntireColumn"
Cap(10) = "Sélectionner une ligne entière - Maj+Barre d'Espace"
Mac(10) = " SelectEntireRow"
Cap(11) = "Sélectionner la feuille de travail - Ctrl+A"
Mac(11) = " SelectEntireSheet"
Cap(12) = "Activer la cellule vide suivante du bas"
Mac(12) = " ActivateNextBlankDown"
Cap(13) = "Activer la cellule vide suivante à droite"
Mac(13) = " ActivateNextBlankToRight"
Cap(14) = "Sélectionner depuis la 1ère cellule non vide jusque la dernière cellule non vide dans la ligne"
Mac(14) = " SelectFirstToLastInRow"
Cap(15) = "Sélectionner depuis la 1ère cellule non vide jusque la dernière cellule non vide dans la colonne"
Mac(15) = " SelectFirstToLastInColumn"
On Error Resume Next
' Efface le menu s'il existait déjà, pour éviter les doubles
MenuBars(xlWorksheet).Menus(NomMenu).Delete
' Ajoute le menu à la barre de menus
MenuBars(xlWorksheet).Menus.Add Caption:=NomMenu, before:="Help"
' Ajoute les items dans le nouveau menu en récupérant le contenu
' des cellules des 2 tableaux créés en mémoire
With MenuBars(xlWorksheet).Menus(NomMenu).MenuItems
.Add Caption:=Cap(1), OnAction:=Mac(1)
.Add Caption:=Cap(2), OnAction:=Mac(2)
.Add Caption:=Cap(3), OnAction:=Mac(3)
.Add Caption:=Cap(4), OnAction:=Mac(4)
.Add Caption:="-"
.Add Caption:=Cap(5), OnAction:=Mac(5)
.Add Caption:=Cap(6), OnAction:=Mac(6)
.Add Caption:="-"
.Add Caption:=Cap(7), OnAction:=Mac(7)
.Add Caption:=Cap(8), OnAction:=Mac(8)
.Add Caption:="-"
.Add Caption:=Cap(9), OnAction:=Mac(9)
.Add Caption:=Cap(10), OnAction:=Mac(10)
.Add Caption:=Cap(11), OnAction:=Mac(11)
.Add Caption:="-"
.Add Caption:=Cap(12), OnAction:=Mac(12)
.Add Caption:=Cap(13), OnAction:=Mac(13)
.Add Caption:="-"
.Add Caption:=Cap(14), OnAction:=Mac(14)
.Add Caption:=Cap(15), OnAction:=Mac(15)
End With
End Sub
Comme John est une personne soigneuse, il nous débarrasse du menu lorsque l'on referme le fichier
Sub Auto_Close()
Dim NomMenu As String
NomMenu = "&Selection_Demo"
' Efface le menu avant de fermer le classeur
On Error Resume Next
MenuBars(xlWorksheet).Menus(NomMenu).Delete
End Sub
Remarquez une propriété très intéressante OnAction.
Elle renvoie ou définit le nom de la macro Visual Basic exécutée si l'utilisateur clique sur le contrôle de barre de commandes ou change sa valeur. Un conseil, consultez l'aide d'Excel (F1) sur cette propriété
Et finalement les macros qui permettent de réaliser les différentes actions. Notez que l'on peut très facilement récupérer ce code en utilisant l'enregistreur de macro, mais l'idée de regrouper celles-ci dans un menu est excellente. Remarquez l'usage intensif de ActiveCell et de Selection , deux mots réservés par Excel pour définir la cellule que le focus (curseur) occupe à un instant X. Pratique lorsque l'on sait où l'on se trouve, catastrophique lorsque le point de départ n'est pas celui escompté... Il est parfois utile de remplacer cette mention par l'adresse de la cellule que l'on désire par exemple Range("B17").Select . Ici on est sûr est certain que la cellule sélectionnée sera B17, le focus s'y déplacera si nécessaire.
Sub SelectDown() Range(ActiveCell,
ActiveCell.End(xlDown)).Select
End Sub
Sub SelectUp()
Range(ActiveCell, ActiveCell.End(xlUp)).Select
End Sub
Sub SelectToRight()
Range(ActiveCell, ActiveCell.End(xlToRight)).Select
End Sub
Sub SelectToLeft()
Range(ActiveCell, ActiveCell.End(xlToLeft)).Select
End Sub
Sub SelectCurrentRegion()
ActiveCell.CurrentRegion.Select
End Sub
Sub SelectActiveArea()
Range(Range("A1"), ActiveCell.SpecialCells(xlLastCell)).Select
End Sub
Sub SelectActiveColumn()
If IsEmpty(ActiveCell) Then Exit Sub
' ignore les erreurs si la celllule active est dans la ligne 1
On Error Resume Next
If IsEmpty(ActiveCell.Offset(-1, 0)) Then Set TopCell = ActiveCell _
Else Set TopCell = ActiveCell.End(xlUp)
If IsEmpty(ActiveCell.Offset(1, 0)) Then Set BottomCell = ActiveCell _
Else Set BottomCell = ActiveCell.End(xlDown)
Range(TopCell, BottomCell).Select
End Sub
Sub SelectActiveRow()
If IsEmpty(ActiveCell) Then Exit Sub
' ignore les erreurs si la cellule activec est dans la colonne A
On Error Resume Next
If IsEmpty(ActiveCell.Offset(0, -1)) Then Set LeftCell = ActiveCell _
Else Set LeftCell = ActiveCell.End(xlToLeft)
If IsEmpty(ActiveCell.Offset(0, 1)) Then Set RightCell = ActiveCell _
Else Set RightCell = ActiveCell.End(xlToRight)
Range(LeftCell, RightCell).Select
End Sub
Sub SelectEntireColumn()
Selection.EntireColumn.Select
End Sub
Sub SelectEntireRow()
Selection.EntireRow.Select
End Sub
Sub SelectEntireSheet()
Cells.Select
End Sub
Sub ActivateNextBlankDown()
ActiveCell.Offset(1, 0).Select
Do While Not IsEmpty(ActiveCell)
ActiveCell.Offset(1, 0).Select
Loop
End Sub
Sub ActivateNextBlankToRight()
ActiveCell.Offset(0, 1).Select
Do While Not IsEmpty(ActiveCell)
ActiveCell.Offset(0, 1).Select
Loop
End Sub
Sub SelectFirstToLastInRow()
Set LeftCell = Cells(ActiveCell.Row, 1)
Set RightCell = Cells(ActiveCell.Row, 256)
If IsEmpty(LeftCell) Then Set LeftCell = LeftCell.End(xlToRight)
If IsEmpty(RightCell) Then Set RightCell = RightCell.End(xlToLeft)
If LeftCell.Column = 256 And RightCell.Column = 1 Then _
ActiveCell.Select Else Range(LeftCell, RightCell).Select
End Sub
Sub SelectFirstToLastInColumn()
Set TopCell = Cells(1, ActiveCell.Column)
Set BottomCell = Cells(16384, ActiveCell.Column)
If IsEmpty(TopCell) Then Set TopCell = TopCell.End(xlDown)
If IsEmpty(BottomCell) Then Set BottomCell = BottomCell.End(xlUp)
If TopCell.Row = 16384 And BottomCell.Row = 1 Then _
ActiveCell.Select Else Range(TopCell, BottomCell).Select
End Sub
Cliquez ici pour télécharger le fichier exemple TypeSelection