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.

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:

  1. Deux procédures ne sont plus nécessaires pour une seule combo, en combinant le code en une seule procédure.
  2. L'utilisation de la propriété LinkedCell pour permettre la saisie correcte de la sélection de l'utilisateur à chaque fois
  3. 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


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow