Suche…


Einführung

Dies ist ein einfaches Beispiel, das zeigt, wie Sie ein Dropdown-Menü im Active Sheet Ihrer Arbeitsmappe erstellen, indem Sie ein ActiveX-Objekt in einem Kombinationsfeld in das Arbeitsblatt einfügen. Sie können einen von fünf Jimi Hendrix-Songs in jede aktivierte Zelle des Arbeitsblatts einfügen und entsprechend löschen.

Jimi Hendrix Menü

Im Allgemeinen wird der Code in das Modul eines Arbeitsblatts eingefügt.

Dies ist das Worksheet_SelectionChange-Ereignis, das jedes Mal ausgelöst wird, wenn eine andere Zelle im aktiven Arbeitsblatt ausgewählt wird. Sie können "Arbeitsblatt" aus dem ersten Dropdown-Menü über dem Codefenster und "Selection_Change" aus dem Dropdown-Menü daneben auswählen. In diesem Fall wird der Code bei jeder Aktivierung einer Zelle in den Code der Combo Box umgeleitet.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

   ComboBox1_Change
   
End Sub

Hier ist die für die ComboBox bestimmte Routine standardmäßig für das Change-Ereignis codiert. Darin befindet sich ein festes Array, das alle Optionen enthält. Nicht die CLEAR-Option an der letzten Position, mit der der Inhalt einer Zelle gelöscht wird. Das Array wird dann an die Combo-Box übergeben und an die Routine übergeben, die die Arbeit erledigt.

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

Das Array wird an die Routine übergeben, in der die Zellen mit dem Songnamen oder dem Nullwert gefüllt werden, um sie zu leeren. Zunächst erhält eine Integer-Variable den Wert der Position der Wahl, die der Benutzer trifft. Anschließend wird die Combo-Box in die TOP LEFT-Ecke der vom Benutzer aktivierten Zelle verschoben und ihre Abmessungen angepasst, um das Erlebnis flüssiger zu gestalten. Der aktiven Zelle wird dann der Wert in der Position in der Ganzzahlvariablen zugewiesen, die die Auswahl des Benutzers verfolgt. Falls der Benutzer CLEAR aus den Optionen auswählt, wird die Zelle geleert.

Die gesamte Routine wird für jede ausgewählte Zelle wiederholt.

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

Beispiel 2: Optionen nicht enthalten

Dieses Beispiel wird zum Angeben von Optionen verwendet, die möglicherweise nicht in einer Datenbank verfügbarer Wohnungen und der zugehörigen Annehmlichkeiten enthalten sind.

Es baut auf dem vorherigen Beispiel auf, mit einigen Unterschieden:

  1. Zwei Prozeduren sind für ein einzelnes Kombinationsfeld nicht mehr erforderlich, indem der Code in einer einzigen Prozedur kombiniert wird.
  2. Die Verwendung der LinkedCell-Eigenschaft, um jedes Mal die korrekte Eingabe der Benutzerauswahl zu ermöglichen
  3. Die Einfügung einer Sicherungsfunktion zum Sicherstellen der aktiven Zelle befindet sich in der richtigen Spalte und ein Fehlervermeidungscode, der auf früheren Erfahrungen basiert, wobei numerische Werte als Zeichenfolgen formatiert würden, wenn sie in die aktive Zelle eingefügt werden.
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

Das obige Makro wird jedes Mal initiiert, wenn eine Zelle mit dem SelectionChange-Ereignis im Arbeitsblattmodul aktiviert wird:

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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow