PDA

Vollständige Version anzeigen : Mehrere benachbarte Zellen sperren


W99
08.07.2015, 07:40
Hallo Excel-VBA Gemeinde,

ich suche eine kurze VBA Lösung, mit der ich mehrere Felder vor der Eingabe sperren kann, wenn in anderen Feldern eine Eingabe getätigt wurde.

Besser ersichtlich im angehängten Beispiel.

Vielen Dank für jede Hilfe!

hary
08.07.2015, 08:03
Moin
Reicht da nicht Daten/Datenueberpruefung/benutzerdef. und mit Anzahl2 pruefen?
gruss hary

Beverly
08.07.2015, 08:12
Hi,

vielleicht so:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim rngBereich1 As Range
Dim rngBereich2 As Range
Set rngBereich1 = Union(Range("D5:G5"), Range("D9:G10"))
Set rngBereich2 = Union(Range("I7:L7"), Range("I9:L10"))
If Not Intersect(Target, rngBereich1) Is Nothing Then
If Target <> "" Then
ActiveSheet.Unprotect
For Each Target In Target
Target.Offset(0, 5).Locked = True
Next Target
ActiveSheet.Protect
End If
ElseIf Not Intersect(Target, rngBereich2) Is Nothing Then
If Target <> "" Then
ActiveSheet.Unprotect
For Each Target In Target
Target.Offset(0, -5).Locked = True
Next Target
ActiveSheet.Protect
End If
End If
End Sub


<hr width="20%" align="left"><img src="http://excel-inn.de/images/grusz.gif" height=35" align="left" alt="Grußformel"><a href="http://excel-inn.de/"><img border="0" src="http://excel-inn.de/images/logo1.gif" height=35" align="middle" alt="Beverly's Excel - Inn"></a>

ASE
08.07.2015, 08:16
Hallo,
eine "Sperre" ist nicht möglich bzw. nicht gut händelbar. Besser man geht den "Umweg" und löscht quasi automatisch die Eingabe wieder.
Ich habe Dir ein Beispiel eingebaut.

EarlFred
08.07.2015, 08:21
Hallo,

hört mal auf hary - das geht ganz simpel mit Datenüberprüfung:
=ANZAHL2($I5:$L5)=0
bzw.
=ANZAHL2($I5:$L5)=0

Einfacher geht's nimmer.

Grüße
EarlFred

Beverly
08.07.2015, 08:22
Hi,


eine "Sperre" ist nicht möglich bzw. nicht gut händelbar.


Die Begründung für diese Aussage würde mich mal interessieren.

<hr width="20%" align="left"><img src="http://excel-inn.de/images/grusz.gif" height=35" align="left" alt="Grußformel"><a href="http://excel-inn.de/"><img border="0" src="http://excel-inn.de/images/logo1.gif" height=35" align="middle" alt="Beverly's Excel - Inn"></a>

ASE
08.07.2015, 08:37
Hallo Karin,
dann schau mal Deinen Code an. Ein Anfänger kann da so bald nicht durchblicken.

Beverly
08.07.2015, 11:13
Hi,

dass der Code kompliziert aussieht ist doch eine völlig andere Sache als deine Aussage dass die Lösung des Problems " nicht möglich bzw. nicht gut händelbar" ist. Wenn man Fragen zu einem Code hat, kann man sie schließlich stellen und zu Codes die ich poste, kann ich solche Fragen auch beantworten - andernfalls würde ich einen entsprechenden Hinweis zum Code posten.

Wenn du dir dagegen deinen einfachen (??) Code mal anschaust, dann frage ich mich, was der bewirken soll, wenn der Fragesteller doch Eingaben zulassen, nur eben das Pendant im anderen Bereich sperren will - es wird im sicher nicht gefallen, wenn seine gerade erfolgte Eingabe wieder weg ist . Was nutzt es ihm also, wenn der Code zwar einfach aussieht, aber nicht das macht was er erreichen will. ;)

<hr width="20%" align="left"><img src="http://excel-inn.de/images/grusz.gif" height=35" align="left" alt="Grußformel"><a href="http://excel-inn.de/"><img border="0" src="http://excel-inn.de/images/logo1.gif" height=35" align="middle" alt="Beverly's Excel - Inn"></a>

ASE
08.07.2015, 11:25
Hi,
auf das Niveau komme ich gewiss nicht herab. Manche Leute glauben sie sind der King of Excel und messen das an der Anzahl der Beiträge. Ich würde das anders interpretieren, aber ...

Beverly
08.07.2015, 11:44
Hi,

wenn einem die Argumente ausgehen, dann wird man ausfällig - auch eine Möglichkeit, sich zu präsentieren.

<hr width="20%" align="left"><img src="http://excel-inn.de/images/grusz.gif" height=35" align="left" alt="Grußformel"><a href="http://excel-inn.de/"><img border="0" src="http://excel-inn.de/images/logo1.gif" height=35" align="middle" alt="Beverly's Excel - Inn"></a>

xlph
08.07.2015, 12:16
Hallo,

Was nutzt es ihm also, wenn der Code zwar einfach aussieht, aber nicht das macht was er erreichen will.

Sachlich gesehen, macht der Code von Beverly nicht das was er soll.
Gegenseitige Änderung ist nicht gegeben, da nach einer Änderungen einerseits
beide Seiten gesperrt werden.

Eine Lösung über Datengültigkeit ist die einfachste und in meinen Augen die optimale Lösung.
Der Einsatz von VBA ist hierbei zu umständlich.

EarlFred
08.07.2015, 12:24
Hallo,

wenn es unbedingt VBA sein soll, wäre sowas hier mein Vorschlag:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
Dim r As Range, rng As Range

Set rng = Me.Range("D5:G15,I5:L15")

If Not Intersect(Target, rng) Is Nothing Then
Me.Protect UserInterfaceOnly:=True
For Each r In Intersect(Target.EntireRow, rng.Areas(1)).Rows
Intersect(r.EntireRow, rng.Areas(2)).Cells.Locked = Application.CountA(r) > 0
r.Cells.Locked = Application.CountA(Intersect(r.EntireRow, rng.Areas(2))) > 0
Next r
End If

Set rng = Nothing
End Sub

Beim Löschen der Inhalte einer Seite wird die andere wieder "freigegeben".

Die wechselweise zu prüfenden Bereiche werden nur einmal vorgegeben, so dass eine Anpassung / Erweiterung leicht sein sollte:
Set rng = Me.Range("D5:G15,I5:L15")

Favorit bleibt, trotzt einiger Einschränkungen, jedoch die Gültigkeitsprüfung.

3 Anmerkungen zum Karins Code:
If Target <> "" Then
Die Prüfung erzeugt einen Fehler, wenn mehr als eine Zelle geändert wird.
ActiveSheet.Unprotect /.Protect
Es sollte nicht das aktive Blatt, sondern das Blatt geschützt werden, auf dem die Änderungen überwacht werden. Einfach über Me ansprechen. Zudem erfordert die Aufhebung des Blattschutzes zur Laufzeit zwingend eine Fehlerbehandlung, um nicht ungewollt ein ungeschütztes Blatt zurückzulassen. Besser: UserInterFaceOnly:=True setzen, dann verliert das Blatt zu keinem Zeitpunkt den Schutz (gegenüber Eingaben durch den Nutzer).
For Each Target In Target
Auch wenn VBA nicht meckert und sogar richtig durchläuft: Target (Übergabe aus dem Ereignis) wird nach der Schleife unbrauchbar (Nothing). Besser: Eine andere Laufvariable deklarieren und verwenden.

Die Übereinstimmung mit der Aufgabe mag der TE prüfen.


Grüße
EarlFred

W99
08.07.2015, 14:50
Vielen Dank erst einmal für die aufgebrachten Ideen und Hinweise.
Ich habe mir hier und da etwas herausgenommen, wieder verworfen etc.

Etwas weiter bin ich - und vielleicht wird die Aufgabenstellung dadurch klarer.
In der angehängten Version klappt es sch einmal, dass, wenn im gelben Bereich etwas eingegeben wird, der entsprechende blaue Bereich gesperrt wird.
Das ganze soll auch optisch hervorgehoben werden, damit andere Bearbeiter sehen, dass dort dann keine Eingabe mehr möglich ist.

Was fehlt an dieser Version?
- das vice versa : also wenn im blauen Bereich etwas eingeben wird, dann soll der gelbe gesperrt werden.

Gut - könnte man sicher noch einmal mit viel Code so hinbekommen, aber ich denke, dass das viel einfacher (eleganter im Sinne von VBA) geht.

Vielen Dank für weitere Hilfe und Ideen.


@EarlFred: ich habe deinen Code erst jetzt gesehen ... werde ich mal ausprobieren.

EarlFred
08.07.2015, 14:59
Hallo,

Das ganze soll auch optisch hervorgehoben werden, damit andere Bearbeiter sehen, dass dort dann keine Eingabe mehr möglich ist.

siehe erweiterter Code:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
Dim r As Range, rng As Range

Set rng = Me.Range("D5:G15,I5:L15")

If Not Intersect(Target, rng) Is Nothing Then
Me.Protect UserInterfaceOnly:=True
For Each r In Intersect(Target.EntireRow, rng.Areas(1)).Rows
Intersect(r.EntireRow, rng.Areas(2)).Cells.Locked = Application.CountA(r) > 0
r.Cells.Locked = Application.CountA(Intersect(r.EntireRow, rng.Areas(2))) > 0

Intersect(r.EntireRow, rng.Areas(2)).Cells.Interior.ColorIndex = IIf(Application.CountA(r) > 0, 7, 20)
r.Cells.Interior.ColorIndex = IIf(Application.CountA(Intersect(r.EntireRow, rng.Areas(2))) > 0, 7, 20)
Next r
End If

Set rng = Nothing
End Sub

Die Farbwerte 7 und 20 sind frei gewählt, ändere sie nach Lust und Laune.

Grüße
EarlFred

Beverly
08.07.2015, 15:04
Hi,

deinen Eröffnungsbeitrag habe ich so interpretiert, dass nur die Zelle gesperrt wird, die der betreffenden Spalte im jeweils anderen Bereich entspricht: 1. Spalte im Bereich zu 1. Spalte im anderen Bereich usw. also wenn Eingabe in D, dann I sperren, wenn Eingabe in E, dann J sperren usw. bzw. umgekehrt wenn Eingabe in I, dann D sperren, wenn Eingabe in J dann E sperren. Nach deinem jetzigen Code soll aber die gesamte Zeile gesperrt werden, gleichgültig in welcher Spalte ein Eintrag erfolgt?

<hr width="20%" align="left"><img src="http://excel-inn.de/images/grusz.gif" height=35" align="left" alt="Grußformel"><a href="http://excel-inn.de/"><img border="0" src="http://excel-inn.de/images/logo1.gif" height=35" align="middle" alt="Beverly's Excel - Inn"></a>

Beverly
08.07.2015, 16:32
Hi,

bei Eingabe in einem der Bereiche wird(werden) im anderen Bereich dieselbe(n) Zeile(n) mit Gültigkeiten versehen, sodass keine Eingabe möglich ist.
Es geht m.E. nicht eindeutig hervor, ob ALLE Spalten in einer Zeile geleert sein müssen, um die Gültigkeitszellen in den relevanten Zeilen im anderen Bereich zu löschen oder ob es ausreicht, in MINDESTENS EINER Spalte einen Inhalt zu löschen - ich bin mal davon ausgegangen, das ALLE Spalten je Zeile leer sein müssen:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim rngBereich As Range
Dim intBereich As Integer
Dim intStart As Integer
Dim lngFarbe As Long
Dim strFormel As String
Set rngBereich = Union(Range("D4:G15"), Range("I4:L15"))
If Not Intersect(Target, rngBereich) Is Nothing Then
Select Case Target.Column
Case Is < 7
intBereich = 2
intStart = 1
lngFarbe = 14994616
Case Is > 7
intBereich = 1
intStart = 2
lngFarbe = 65535
End Select
For Each Target In Target
If Target <> "" Then
strFormel = "=COUNTA(" & rngBereich.Areas(intStart).Rows(Target.Row - 3).Address(False, False) & ")>0"
With rngBereich.Areas(intBereich).Rows(Target.Row - 3)
With .Validation
.Delete
.Add Type:=xlValidateCustom, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="=FALSE"
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = "Nicht möglich ..."
.ShowInput = True
.ShowError = True
End With
.Interior.Color = 255
End With
Else
If Application.CountA(rngBereich.Areas(intStart).Rows(Target.Row - 3)) = 0 Then
With rngBereich.Areas(intBereich).Rows(Target.Row - 3)
.Validation.Delete
.Interior.Color = lngFarbe
End With
End If
End If
Next Target
End If
Set rngBereich = Nothing
End Sub

<hr width="20%" align="left"><img src="http://excel-inn.de/images/grusz.gif" height=35" align="left" alt="Grußformel"><a href="http://excel-inn.de/"><img border="0" src="http://excel-inn.de/images/logo1.gif" height=35" align="middle" alt="Beverly's Excel - Inn"></a>

W99
08.07.2015, 18:04
Hi Karin,

perfekt ... genau so meinte ich es und habe meinen (schlechten) Code hier auch noch einmal angehängt.

Aber so wie du es gemacht hast, habe ich mir einen sauberen Code vorgestellt. Daraus kann ich wieder einiges lernen. Danke!

Aber auch ein Dank an EarlFred, denn auch der Umgang der 2 Ranges ist super interessant. Das kann ich sicher auch noch nutzen!

Vielen Dank an euch beide!
:) :) :)

EarlFred
10.07.2015, 07:46
Hallo nochmals,

perfekt. Du kombinierst auf ideale Weise umständliche Programmierung komplizierter Gültigkeitsprüfung. ;)

Mach's Dir doch einfach und nimm
- entweder je Bereich genau EINE Gültigkeitsprüfung, die Du "von Hand" über den kompletten Bereich einträgst - Formeln siehe Beitrag #5 (logischerweise mit korrigiertem Bezug in der 2. Formel - Copy&Paste-Fehler). Die Farbgebung / Muster kannst Du mit Bedingter Formatierung steuern. VBA ist dann gänzlich überflüssig.
- oder reinen VBA-Code ohne Gültigkeitsprüfung

Grüße
EarlFred

W99
27.07.2015, 14:49
Hallo zusammen,

leider komme ich erst jetzt dazu, den Code in mein Excel einzubauen und dachte diese "Transferleistung" vollbringen zu können, aber

- ich schaffe es leider nicht, den Bereich zu verschieben :-(

Das Beispiel von Karin funktioniert soweit einwandfrei - aber wenn ich
einen anderen Bereich nehme, dann wird die Sperrzeile witer unten im anderen
Sektor angelegt.

Was mache ich falsch?

Danke für Hinweise!


Private Sub Worksheet_Change(ByVal Target As Range)
Dim rngBereich As Range
Dim intBereich As Integer
Dim intStart As Integer
Dim lngFarbe As Long
Dim strFormel As String
Set rngBereich = Union(Range("AU12:AX500"), Range("AZ12:BC500"))
If Not Intersect(Target, rngBereich) Is Nothing Then
Select Case Target.Column
Case Is < 51
intBereich = 2
intStart = 1
lngFarbe = 14994616
Case Is > 51
intBereich = 1
intStart = 2
lngFarbe = 65535
End Select
For Each Target In Target
If Target <> "" Then
strFormel = "=COUNTA(" & rngBereich.Areas(intStart).Rows(Target.Row - 3).Address(False, False) & ")>0"
With rngBereich.Areas(intBereich).Rows(Target.Row - 3)
With .Validation
.Delete
.Add Type:=xlValidateCustom, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="=FALSE"
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = "Nicht möglich ..."
.ShowInput = True
.ShowError = True
End With
.Interior.Color = 255
End With
Else
If Application.CountA(rngBereich.Areas(intStart).Rows(Target.Row - 3)) = 0 Then
With rngBereich.Areas(intBereich).Rows(Target.Row - 3)
.Validation.Delete
.Interior.Color = lngFarbe
End With
End If
End If
Next Target
End If
Set rngBereich = Nothing
End Sub

Beverly
28.07.2015, 10:03
Hi,

der Ursprungscode hatte als Startzeile Zeile 4 für die beiden Bereiche, weshalb im Code mit

Rows(Target.Row - 3)


die Eingabezeile ermittelt wurde. Jetzt jedoch beginnt der Bereich ab Zeile 12, weshalb anstelle der 3 eine 11 stehen muss (in allen Codeteilen).

<hr width="20%" align="left"><img src="http://excel-inn.de/images/grusz.gif" height=35" align="left" alt="Grußformel"><a href="http://excel-inn.de/"><img border="0" src="http://excel-inn.de/images/logo1.gif" height=35" align="middle" alt="Beverly's Excel - Inn"></a>

W99
30.07.2015, 07:06
Hi Karin,

ohhh man(n) ...

Danke für den Hinweis! :)

W99
22.12.2015, 13:45
Hallo Excel-VBA Gemeinde,

in diesem Beispiel (danke nochmals Karin) wird bei Eingabe eines Wertes, die entsprechende Zeile im anderen Bereich gesperrt.
Soweit - so klasse :-)
Nun habe ich das Problem, dass ich in dem einen Bereich eine Spalte mit der DropDown-Funktionalität versehen habe.

Wenn ich nun im linken Bereich einen Wert setze und danach wieder lösche, dann wird auch das DropDown-Feature gelöscht.

Wie kann ich das umgehen?

Vielen Dank für eure Hilfe

W99
22.12.2015, 20:01
Gefunden :-)


ActiveWorkbook.Names.Add Name:="listdata", RefersTo:= _
"=Sheet2!$A$1:$A$5"
With Range("A1:A100")
With .Validation
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="=listdata"
End With
End With

W99
22.12.2015, 21:16
Grrr ... verstehe das nicht :-(

Manchmal funktioniert das VBA ... und dann wieder nicht.
Ich verstehe diese 2 Zeilen nicht - wer kann mir das aufschlüsseln?
Danke!


strFormel = "=COUNTA(" & rngBereich.Areas(intStart).Rows(Target.Row - 3).Address(False, False) & ")>0"
If Application.CountA(rngBereich.Areas(intStart).Rows(Target.Row - 3)) = 0 Then


Vielen Dank! :)

EarlFred
23.12.2015, 04:59
Hallo Name?,

@EarlFred: ich habe deinen Code erst jetzt gesehen ... werde ich mal ausprobieren.
...und zu welchem Ergebnis bist Du dabei gekommen?
...und hast Du mal die Idee mit der Gültigkeitsregel ausprobiert (die Dir 3! Leute nahegelegt haben)? Warum setzt Du die nicht ein?

Stattdessen hast Du einen Code, den Du seit einem halben Jahr weder verstehst noch zum Laufen kriegst.

Da bin ich ratlos, wie man so jemandem helfen kann.

Grüße
EarlFred

W99
23.12.2015, 10:08
Hallo EarlFred,

vielen Dank für deine Teilnahme und dem Hinweis auf mein Unvermögen :rolleyes:

ich versuche das mal aus meiner Sicht darzustellen:
- Meine ursprüngliche Anfrage, der der Sperrung der Zeilen im jeweils anderen Block hat Karin einwandfrei verstanden und umgesetzt

- der Hinweis von hary im Post #2 ist zwar gut - trifft aber nicht meine Anforderungen

- gleiches gilt für den Beispielcode von ASE (Post #4) - auch hier sind interessante Dinge für mich als VBA Einsteiger enthalten, aber es trifft eben nicht den Kern

- ebenso dein Post #5, was von Karin im Post #8 gut und richtig erläutert wurde

- Im deinem Post #12 kommen wir der Sache schon näher, nur wird der komplette Block gesperrt, keine einzelnen Zeilen keine optische Hervorhebung

- der Code im Post #14 ist wieder ein Schritt weiter - nur wird hier wieder der gesamte Block gesperrt und nicht wieder freigegeben.
(Ja - wenn man als VBA-Einsteiger solche Befehle liest, dann ist es nicht unbedingt trivial, das so abzuändern, dass die Anforderungen erfüllt sind)

- im Post #16 hat Karin alles korrekt beschrieben und auch der Code funktioniert einwandfrei

- im Post 17 habe ich das geschrieben und auch dir für den indirekten Hinweis auf die Ranges gedankt

- im Post 22/23 kann man sehen, das ich mich mit dem Code befasse und auch selbst (nach weiterer Recherche) eine Lösung gefunden habe

- Post 24 ... ja, vielleicht habe ich nicht lang genug darüber nachgedacht. Heute morgen, frisch am Rechner ist der das wie die berühmten Schuppen von den Augen gefallen - (blöder Spruch)

- zu deinem Post 25:
Ja, ich habe deinen Code ausprobiert und habe mir auch die Geschichte mit der Gültigkeitsprüfung angeschaut. Leider erfüllen beide Hinweise nicht das, was ich mir vorgestellt habe.

Der Code läuft in meinem Projekt und an der Arbeitsmappe wird weiterentwickelt. Aktuell werden dort dynamische Menüs, verschachtelte Formeln über verschiedene Arbeitsblätter, Übertragungen in andere Excel-Dateien (ohne diese "optisch", also im Vordergrund öffnen zu müssen), diese Sperrungen einzelner Bereiche, ... vorgenommen.

Ich "schraube" also an vielen verschiedenen Ecken und dadurch ergeben sich mal hier und da mehrere Problemchen. Wo dann genau das einzelne Problem liegt ist - und da wiederhole ich mich gerne - für mich als VBA Einsteiger nicht unbedingt immer sofort ersichtlich.

Zu meiner letzte Frage nach der Aufschlüsselung der 2 Zeilen ... das hat sich, wie beschrieben erledigt :-).

Trotzdem vielen Dank an dich und alle anderen. Es gibt viele Wege, mit denen man ein Problem angehen kann und aus allen kann man lernen oder diese ggf. in anderen Projekten nutzen.

Ich hoffe, dass ich hier keinem auf die Füße getreten habe - wenn doch: das war nicht meine Absicht, sorry dafür.
Gruß
W99

EarlFred
23.12.2015, 12:19
Hallo W99,

zigmal schreibst Du sowas:
Leider erfüllen beide Hinweise nicht das, was ich mir vorgestellt habe.
weder keine Rückmeldung noch so eine allgemeine hilft einem Helfer! Wo liegen denn die Abweichungen zu dem, was Du willst? Wenn Du das keinem mitteilst, kannst Du auch nicht erwarten, dass wir es erraten und die Ideen passend modifizieren können.
Und ja: Auch wenn es mich freut, dass Du Dir Wissen aus den Vorschlägen ziehst: Es demotiviert, wenn Vorschläge unreflektiert im Mülleimer landen und man keine Chance hat, die Idee zu Ende zu denken. Das ist schade um die Zeit.

- ebenso dein Post #5, was von Karin im Post #8 gut und richtig erläutert wurde
In #8 hat Karin nichts zu meinem Beitrag in #5 gesagt?

- Im deinem Post #12 kommen wir der Sache schon näher, nur wird der komplette Block gesperrt, keine einzelnen Zeilen keine optische Hervorhebung
[...]
- der Code im Post #14 ist wieder ein Schritt weiter - nur wird hier wieder der gesamte Block gesperrt und nicht wieder freigegeben.
(Ja - wenn man als VBA-Einsteiger solche Befehle liest, dann ist es nicht unbedingt trivial, das so abzuändern, dass die Anforderungen erfüllt sind)
Warum kommst Du erst jetzt auf die Idee, das mitzuteilen? Es geht auch nicht darum, dass es nicht trivial ist, den Code zu ändern, da hilft Dir schon einer - es wäre aber trivial, die Abweichung zu beschreiben, dann könnte man schnell eine Lösung finden! Man könnte leicht erläutern: Wenn das Blatt geschützt wird (ob per VBA oder von Hand), sind alle als gesperrt gemarkten Zellen nicht bearbeitbar. Man muss also das Blatt vorbereiten, dass VOR dem ersten Start die Bereiche freigegeben werden (Zellen formatieren, Schutz, Haken raus bei "gesperrt"). Sowas erläutert man aber nicht immer alles - ich setze eben auch Wissen voraus. Aber man kann ja auch nachfragen.

keinem auf die Füße getreten habe
Sicher nicht. Aber um bei Füßen zu bleiben: Du stolperst über Deine eigenen.
Ich unterstelle Dir auch keineswegs, dass Du Dich nicht selbst um eine Weiterentwicklung der Lösung gekümmert hast im Gegenteil! Du rennst nur in eine m. E. viel zu komplizierte Richtung und hast einen Code, den sicher kein Anfänger beherrschen kann - darum genau ging es ja schon sinngemäß im Disput zwischen Armin und Karin.

Und nach wie vor bin ich der Meinung, dass die einfachste Lösung die mit Gültigkeitsprüfung und Bedingter Formatierung ist (wobei man sie zugegebenermaßen unter bestimmten Bedingungen "aushebeln" kann). Nur WARUM Du die nicht so zum Laufen bekommst, wie Du es willst, kann ich von hier aus nicht sehen. Eine Mustermappe könnte helfen zu helfen.

Grüße
EarlFred