Hi,
hier mal meine Variante dazu. Quellcode gehört in die Tabelle in der du die Dropdownliste(n) haben willst.
Die Mappe muss ein leeres Arbeitsblatt mit dem Namen Tabelle3 besitzen (dort wird eine Beispielliste erstellt).
Option Explicit
'//////////////////////////////////////////////////////
'// dient nur der Erstellung einer Beispielliste
'// Ausführen
Public Sub Beispielliste_anlegen()
With ThisWorkbook.Worksheets("Tabelle3")
.Range("B1:D1").Value = Array("Auswahl-01", "Auswahl-02", "Auswahl-03")
Call ThisWorkbook.Names.Add("GListe1", RefersTo:=.Range("B1:D1"))
End With
Call MsgBox("'GListe1' wurde erstellt.", vbInformation)
End Sub
'//////////////////////////////////////////////////////
'// hier wird auf Änderungen im Arbeitsblatt reagiert
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
On Error GoTo ErrHandler
Dim rngRef As Excel.Range
Dim rngArea As Excel.Range
Dim rngCells As Excel.Range
Dim rngCell As Excel.Range
'nur auf Änderungen in folgendem Bereich reagieren
Set rngRef = Columns("C")
'prüfen ob der für das Makro relevante Bereich/Zelle geändert wurde
Set rngCells = Intersect(Target, rngRef)
If Not rngCells Is Nothing Then
For Each rngArea In rngCells.Areas '< relevant wenn mehrere Zellen
' auf einmal geändert wurden und
' nicht alle davon zusammen liegen
For Each rngCell In rngArea.Cells
With Cells(rngCell.Row, "D") '< Zelle mit der Gültigkeitsliste (GL)
If Trim$(rngCell.Value) <> "" Then
'> die Zelle, welche geänderte wurde, enthält Daten
'=> GL entfernen, deren Inhalt löschen und neue GL setzen
Call .Validation.Delete
Call .ClearContents
Call .Validation.Add(xlValidateList, Formula1:="=GListe1") '<"GListe1" => s.o. Beispielliste_anlegen()
Else
'> die Zelle, welche geänderte wurde, ist leer
'=> GL entfernen und deren Inhalt löschen
Call .Validation.Delete
Call .ClearContents
End If
End With
Next
Next
End If
SafeExit:
Application.EnableEvents = True
Exit Sub
ErrHandler:
Call MsgBox(Err.Description, vbCritical, "Fehler " & Err.Number)
GoTo SafeExit
End Sub
Gruß
|