Hallo Joe,das ist Trick 17 ;-)
Hier erst noch mal der Code:
Und nun die Erklärung:
If Target.Column <> 8 Then Exit Sub
beschränkt die Zulässigkeitsprüfung auf die Spalte H (=8).
Für jede Zelle in Spalte H gibt es nun einen Bereich von 9 Zellen, in denen nur ein x stehen darf. Der Versuch, in diesen Bereich ein weiteres x einzutragen, soll unterbunden werden. Hierzu muß ich zunächst in Abhängigkeit von der markierten Zelle (=Target) den Anfang und das Ende des relevanten Bereichs bestimmen, genauer gesagt: die Zeilennummer der ersten und letzten Zelle.
a = Int((Target.Row - 0.5) / 9) * 9 + 1
bestimmt die Zeilenummer der ersten Zelle. In der ersten Version hieß diese Codezeile noch sinngemäß
a = Int((Target.Row) / 9) * 9 + 1
Nehmen wir mal an die aktuelle Zelle sei H14. Dann ist der relevante Bereich H10:H18. Ich muß also aus der Target.Row (=14) den Wert 10 (für H10) errechnen und in der Variablen a abspeichern.
Schrittweise berechnet das die Codezeile wie folgt:
(Target.Row) / 9 = 14/9 = 1,55
INT(1,55) = 1 (Ganzzahl von 1,55)
1 * 9 + 1 = 10
Das Ergebnis ist also korrekt.
Für die Zelle H18 gibt es allerdings ein Problem. Hier wäre der relevante Bereich ja auch H10:H18. Als Berechnungsergebnis käme allerdings nicht 10, sondern 19 heraus (bitte selbst nachvollziehen). Um das zu korrigieren, muß von Target.Row ein Wert größer Null und kleiner 1 abgezogen werden. Ich habe mich für 0,5 entschieden, andere Werte würden aber genauso funktionieren.
e = a + 8
berechnet aufbauend auf a die Zeilenummer der letzten Zelle im relevanten Bereich.
If Application.WorksheetFunction.CountIf(Range(Cells(a, 8), Cells(e, 8)), "x") > 1 Then
prüft über die Funktion CountIf (entspricht ZÄHLENWENN), ob im relevanten Zellbereich einschließlich des gerade eingegebenen Wertes mehr als ein x vorkommt. Wenn ja, löscht
Target.ClearContents
die aktuelle Eingabe in der markierten Zelle.
HTH
Gruß
Martin Beck