excel-vba
Création d'un menu déroulant dans la feuille de travail active avec une zone de liste déroulante
Recherche…
Introduction
Voici un exemple simple montrant comment créer un menu déroulant dans la feuille active de votre classeur en insérant un objet ActiveX dans la feuille. Vous pourrez insérer l'une des cinq chansons de Jimi Hendrix dans n'importe quelle cellule activée de la feuille et pouvoir la vider en conséquence.
Menu Jimi Hendrix
En général, le code est placé dans le module d'une feuille.
Il s'agit de l'événement Worksheet_SelectionChange, qui se déclenche chaque fois qu'une cellule différente est sélectionnée dans la feuille active. Vous pouvez sélectionner "Feuille de calcul" dans le premier menu déroulant au-dessus de la fenêtre de code et "Selection_Change" dans le menu déroulant situé à côté. Dans ce cas, chaque fois que vous activez une cellule, le code est redirigé vers le code de la zone de liste déroulante.
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
ComboBox1_Change
End Sub
Ici, la routine dédiée à la ComboBox est codée par défaut à l'événement Change. Dans ce document, il y a un tableau fixe, rempli de toutes les options. Pas l'option CLEAR dans la dernière position, qui sera utilisée pour effacer le contenu d'une cellule. Le tableau est ensuite remis à la Combo Box et passé à la routine qui fait le travail.
Private Sub ComboBox1_Change()
Dim myarray(0 To 5)
myarray(0) = "Hey Joe"
myarray(1) = "Little Wing"
myarray(2) = "Voodoo Child"
myarray(3) = "Purple Haze"
myarray(4) = "The Wind Cries Mary"
myarray(5) = "CLEAR"
With ComboBox1
.List = myarray()
End With
FillACell myarray()
End Sub
Le tableau est transmis à la routine qui remplit les cellules avec le nom de la chanson ou la valeur null pour les vider. Tout d'abord, une variable entière reçoit la valeur de la position du choix que l'utilisateur effectue. Ensuite, la zone de liste déroulante est déplacée dans le coin supérieur gauche de la cellule que l'utilisateur active et ses dimensions sont ajustées pour rendre l'expérience plus fluide. La cellule active se voit alors attribuer la valeur dans la position dans la variable entière, ce qui permet de suivre le choix de l'utilisateur. Si l'utilisateur sélectionne CLEAR parmi les options, la cellule est vidée.
La routine entière se répète pour chaque cellule sélectionnée.
Sub FillACell(MyArray As Variant)
Dim n As Integer
n = ComboBox1.ListIndex
ComboBox1.Left = ActiveCell.Left
ComboBox1.Top = ActiveCell.Top
Columns(ActiveCell.Column).ColumnWidth = ComboBox1.Width * 0.18
ActiveCell = MyArray(n)
If ComboBox1 = "CLEAR" Then
Range(ActiveCell.Address) = ""
End If
End Sub
Exemple 2: Options non incluses
Cet exemple est utilisé pour spécifier des options qui pourraient ne pas être incluses dans une base de données de logements disponibles et de ses équipements.
Il s'appuie sur l'exemple précédent, avec quelques différences:
- Deux procédures ne sont plus nécessaires pour une seule combo, en combinant le code en une seule procédure.
- L'utilisation de la propriété LinkedCell pour permettre la saisie correcte de la sélection de l'utilisateur à chaque fois
- L'inclusion d'une fonctionnalité de sauvegarde pour garantir que la cellule active se trouve dans la colonne correcte et un code de prévention des erreurs, basé sur l'expérience précédente, où les valeurs numériques seraient mises en forme en tant que chaînes lorsqu'elles étaient renseignées dans la cellule active.
Private Sub cboNotIncl_Change()
Dim n As Long
Dim notincl_array(1 To 9) As String
n = myTarget.Row
If n >= 3 And n < 10000 Then
If myTarget.Address = "$G$" & n Then
'set up the array elements for the not included services
notincl_array(1) = "Central Air"
notincl_array(2) = "Hot Water"
notincl_array(3) = "Heater Rental"
notincl_array(4) = "Utilities"
notincl_array(5) = "Parking"
notincl_array(6) = "Internet"
notincl_array(7) = "Hydro"
notincl_array(8) = "Hydro/Hot Water/Heater Rental"
notincl_array(9) = "Hydro and Utilities"
cboNotIncl.List = notincl_array()
Else
Exit Sub
End If
With cboNotIncl
'make sure the combo box moves to the target cell
.Left = myTarget.Left
.Top = myTarget.Top
'adjust the size of the cell to fit the combo box
myTarget.ColumnWidth = .Width * 0.18
'make it look nice by editing some of the font attributes
.Font.Size = 11
.Font.Bold = False
'populate the cell with the user choice, with a backup guarantee that it's in column G
If myTarget.Address = "$G$" & n Then
.LinkedCell = myTarget.Address
'prevent an error where a numerical value is formatted as text
myTarget.EntireColumn.TextToColumns
End If
End With
End If 'ensure that the active cell is only between rows 3 and 1000
End Sub
La macro ci-dessus est lancée chaque fois qu'une cellule est activée avec l'événement SelectionChange dans le module de feuille de calcul:
Public myTarget As Range
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Set myTarget = Target
'switch for Not Included
If Target.Column = 7 And Target.Cells.Count = 1 Then
Application.Run "Module1.cboNotIncl_Change"
End If
End Sub