HERBERS
Excel-Forum
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Entdecke rund 2 Millionen Excel-Lösungen im
Forumsarchiv

Beiträge zum Thread: Dropdownlisten und VBA

Passant
23.05.2026 16:18:50
Dropdownlisten und VBA
Case
23.05.2026 21:37:10
Da ist mindestens....
Passant
24.05.2026 09:28:29
AW: Da ist mindestens....
Case
24.05.2026 11:45:10
In deinem...
Passant
24.05.2026 17:51:27
AW: In deinem...
Case
24.05.2026 18:24:31
Dann würde ich...
Passant
24.05.2026 19:36:06
AW: Dann würde ich...
Forumbeitrag
Excel-Version des Fragestellers:
365 privat
Erfahrungslevel des Fragestellers:
Kaum Excel/VBA-Kenntnisse
Passant
23.05.2026 16:18:50
Dropdownlisten und VBA
https://www.herber.de/bbs/user/180733.xlsm

Habe an der Tabelle zur Erfassung von meinen Arbeitszeiten jetzt noch ein Problem, dass ich nicht gelöst bekomme. Ich habe von B7-B37 identische Dropdownlisten, in denen ich Abwesenheitsgründe auswählen kann. Jetzt möchte ich z.B. bei 3 Wochen Urlaub nicht jede Dropdownliste einzeln auf Urlaub stellen müssen, sondern, wie ja in Excel möglich, einfach den Wert in der ersten Liste auswählen und dann durch ziehen des Fill-Punktes, die unteren Listen mit auswählen, die dann automatisch den Wert der ersten Liste bekommen.

Leider sind die Wochenenden schreibgeschützt, sobald ich beim Ziehen über einen Samstag, oder Sonntag komme, wird die Aktion von Excel mit einem Warnhinweis (Schreibschutz) abgebrochen und keine der Listen erhält den neuen Wert. Ich benötige also einen VBA Code, der die schreibgeschützten Listen beim Ziehen erkennt und diese ignoriert. Da ich selber von VBA keine Ahnung habe, habe ich mal die KI befragt, die mir zwar immer wieder bestätigt, dass das mit VBA möglich wäre, aber leider hat keiner der Codes, die sie mir gegeben hat, funktioniert. Hier mal ein Beispiel, dass ich auch in der Beispiel-Datei eingefügt habe:

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Dim rngSel As Range
Dim c As Range
Dim newValue As Variant
Dim ws As Worksheet
Dim col As Long

' Nur, wenn die Änderung in Spalte B erfolgt
col = 2 ' Spalte B
If Intersect(Target, Me.Columns(col)) Is Nothing Then Exit Sub

Application.EnableEvents = False
On Error GoTo Cleanup

newValue = Target.Value

' Bereich der Dropdown-Liste (anpassen, hier B7:B37)
Set rngSel = Me.Range("B7:B37")

For Each c In rngSel
If Not Intersect(c, Target) Is Nothing Then
' Überspringe schreibgeschützte Zellen
If Not c.Locked Then
c.Value = newValue
End If
End If
Next

Cleanup: Application.EnableEvents = True
End Sub

Es funktioniert leider auch nicht erkennt ihr hier Fehler?

Forumbeitrag
Excel-Version des Fragestellers:
365 privat
Erfahrungslevel des Fragestellers:
Kaum Excel/VBA-Kenntnisse
Case
23.05.2026 21:37:10
Da ist mindestens....
Moin, :-)

... ein Fehler drin: ;-)

Das hier: ;-)
For Each c In Range(rngSel)

Wirft dir einen 1004rer Fehler raus. ;-)

So läuft es: ;-)
'.....

For Each c In Range(rngSel.Address)
'If Not Intersect(c, Target) Is Nothing Then
' Überspringe schreibgeschützte Zellen
If Not c.Locked Then
c.Value = newValue
End If
'End If
Next

Cleanup:
If Err.Number <> 0 Then MsgBox Err.Number & vbLf & Err.Description
Application.EnableEvents = True
End Sub

Du siehst dann auch, wenn du einen Fehler machst. ;-)

Aber du willst wahrscheinlich nicht alle ausfüllen? ;-)
https://www.herber.de/bbs/user/180734.xlsb

Man kann noch Feiertage ausgrenzen, oder nur leere Zellen ausfüllen, oder... ;-)

Servus
Case
Forumbeitrag
Excel-Version des Fragestellers:
365 privat
Erfahrungslevel des Fragestellers:
Kaum Excel/VBA-Kenntnisse
Passant
24.05.2026 09:28:29
AW: Da ist mindestens....
Moin Case,
die Lösung mit der Input-Box ist genial! War total überrascht, als ich deine Datei ausprobiert habe. Auf diese Idee wäre ich überhaupt nicht gekommen und umsetzen hätte ich sie natürlich erst recht nicht können. Vielen Dank dafür!

Jetzt ergibt sich leider ein weiteres Problem, an das ich vorher nicht gedacht habe: Immer wenn eine Dropdownliste in B einen der Werte: Urlaub, Feiertag, Krankheit, Überstunden hat, soll C und D jeweils den Wert 00:00 erhalten. Ich habe in der Dropdownliste auch noch ein Leerzeichen (Alt 0160) als Wert, wenn das ausgewählt wird, oder der jeweilige Wert in der Liste gelöscht wird, sollen auch C und D wieder leer sein.

Bevor ich deine Lösung hatte, hatte ich immer z.B. an einem Montag die Dropdownliste auf Urlaub gestellt, und sie dann bis Freitag runtergezogen, so dass die komplette Woche den Wert Urlaub hatte. Das gleiche dann in der nächsten Woche. Im Modul1 hatte ich dann diesen Code, der dafür sorgte, dass C und D dann immer 00:00 war, oder eben leer:

Sub HandleChangeForSheet(ByVal Target As Range, ByVal ws As Worksheet)
Dim rng As Range
Dim zelle As Range
' Prüfen, ob die Änderung in Spalte B (Spalte 2) erfolgt ist
Set rng = Intersect(Target, ws.Columns(2))
If rng Is Nothing Then Exit Sub
Application.EnableEvents = False
On Error GoTo 0
For Each zelle In rng
If zelle.Value = "Urlaub" Or zelle.Value = "Feiertag" Or zelle.Value = "Krankheit" Or zelle.Value = "Überstd.-Abb." Or zelle.Value = "Schulung" Then
' Setze C und D der gleichen Zeile auf 00:00, wenn Text in B ausgewählt ist bzw. leer
ws.Cells(zelle.Row, 3).Value = "00:00"
ws.Cells(zelle.Row, 4).Value = "00:00"
Else
' Optional: Falls andere Werte zukünftig erlaubt, C und D ggf. leeren
ws.Cells(zelle.Row, 3).Value = ""
ws.Cells(zelle.Row, 4).Value = ""
End If
Next zelle
Application.EnableEvents = True
End Sub

Den hatte ich im Tabellenblatt aufgerufen:
Private Sub Worksheet_Change(ByVal Target As Range)
Call HandleChangeForSheet(Target, Me)
End Sub

Das funktioniert jetzt nicht mehr hast du noch eine Idee, wie ich das mit deinem Code lösen kann?
Forumbeitrag
Excel-Version des Fragestellers:
365 privat
Erfahrungslevel des Fragestellers:
Kaum Excel/VBA-Kenntnisse
Case
24.05.2026 11:45:10
In deinem...
Moin, :-)

Modul habe ich nur UserInterfaceOnly:=True (also von False auf True geändert). Dann können Makros Änderungen vornehmen, ohne dass du den Blattschutz aufheben musst. ;-)
https://learn.microsoft.com/de-de/office/vba/api/excel.worksheet.protect

Sonst habe ich mir das Modul nicht näher angeschaut. ;-)

Nun geht sowas (wenn du im DropDown bist und Entf drückst kannst du es wieder entfernen): ;-)
https://www.herber.de/bbs/user/180736.xlsb

Servus
Case
Forumbeitrag
Excel-Version des Fragestellers:
365 privat
Erfahrungslevel des Fragestellers:
Kaum Excel/VBA-Kenntnisse
Passant
24.05.2026 17:51:27
AW: In deinem...
Ups, sorry, die Datei, die ich hier hochgeladen hatte ist nur ein minimiertes Beispiel, da war die Sub, die die Zellen in C und D auf 00:00 setzt, die ich oben geposted hatte, im Modul1 nicht mit drin.

Deinbeiden Subs funktionieren perfekt! Vielen, vielen Dank, das ist wirklich großes Kino für mich!

Eine Frage habe ich aber noch: Ich habe in der Arbeitsmappe 12 Arbeitsblätter (für jeden Monat eins), ist es sinnvoller deine beiden Subs in jedes Arbeitsblatt einzufügen, oder besser in Modul1 und dann in jedem Arbeitsblatt aufrufen? Wenn es besser ist, die Subs in den jeweiligen Arbeisblättern aus Modul1 aufzurufen, wie müßte der Code für das Aufrufen in den Arbeitsblättern aussehen?
Forumbeitrag
Excel-Version des Fragestellers:
365 privat
Erfahrungslevel des Fragestellers:
Kaum Excel/VBA-Kenntnisse
Case
24.05.2026 18:24:31
Dann würde ich...
Moin, :-)

... es so machen: ;-)
https://www.herber.de/bbs/user/180737.xlsb

Der Code gehört unter "DieseArbeitsmappe" - und NUR dort. In den Tabellenblättern muss er raus. ;-)
Das gilt dann für alle Tabellemnblätter. ;-)

Wenn es Tabellenblätter gibt, für die es nicht gelten soll, kann man die noch ausschließen. ;-)

Servus
Case
Forumbeitrag
Excel-Version des Fragestellers:
365 privat
Erfahrungslevel des Fragestellers:
Kaum Excel/VBA-Kenntnisse
Passant
24.05.2026 19:36:06
AW: Dann würde ich...
Hat auch wieder super funktioniert! Vielen Dank nochmal für deine großartige Hilfe!
Und noch schöne Pfingsten...