Hallo "imebro",
"PersChef" trägt seine Code in Spalte "O" ein?
Am 13.04. schreibst Du Spalte "K". Gut, wahrscheinlich eine Fehlangabe wg. Eile.
Eines noch vorweg, das habe ich eben erst gemerkt. Das Sperren der Zellen pro Zeile. Bei mir
funktioniert Deine Zeile "objCell.EntireRow.Locked = True" in "Workbook_BeforeSave" nicht. Ich habe
deshalb "Worksheet_Change" ergänzt (siehe Codeausschnitt).
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 17 Then '=Spalte "Q"
Select Case Target.Row
Case 9 To 20 'Zeilen 9...20
If ActiveSheet.Cells(Target.Row, 17) = Date Then
ActiveSheet.Range(Cells(Target.Row, 1), Target.Cells(Row, 17)).Locked _
= True 'neu
ActiveSheet.Protect(Password:="XXXXXXX", UserInterfaceOnly:=True) = _
True
ThisWorkbook.Save
MsgBox "Zeile " & Target.Row & ":" & vbCrLf & "Dieser Urlaub ist" & _
"jetzt nicht mehr veränderbar!", 64
End If
End Select
End If
End Sub
'Die Zeile "objCell.EntireRow.Locked = True" in "Workbook_BeforeSave"
' streichen/deaktivieren. Es ist wirklich schwer, etwas nachzuvollziehen, wenn man nicht alle Details eines Projektes kennt.
In meiner Testdatei hab ich das folgendermaßen nachvollzogen:
als "Code" für die Eingabespalte "K" verwende ich "ok" (ich muss ja den "Code" vom PersCh nicht verschleiern)
die Zellen "O9"..."O20" sind "bedingt formatiert" mit "=Wenn(K9="ok;"ok","")" usw. Zeile fortlfd. angepasst natürlich;
die Zellen "P9"..."P20" sind "bedingt formatiert" mit "=Wenn(O9="ok";"genehmigt","") usw. Zeile fortlfd. angepasst natürlich;
Im Ablauf passiert nun folgendes:
- PersCh gibt Code in "K9" ein (bei mir "ok")
- Zelle "O9" reagiert wegen "=Wenn(K9="ok;"ok","")" und beschreibt sich mit "ok"
- Zelle "P9" reagiert wegen "=Wenn(O9="ok";"genehmigt";"") und beschreibt sich selbst mit "genehmigt"
- jetzt tritt "Worksheet_Calculate" in Aktion und sucht alle 12 Zeilen der Spalte "O" nach einem "ok" ab
(denn hier steht ja "For Each objCell In Range("O9:O20")") und
wird in Zeile 9 (also Zelle "O9") fündig ("If .Text = "ok" Then").
Weil nun hier "If Not IsDate" wahr ist (die Zelle "Q9" ist ja noch leer), wird das Datum eingetragen
(If Not IsDate(.Offset(0, 2).Value) Then .Offset(0, 2) = Date).
(PS: dieses Eintragen ruft "Worksheet_Calculate" erneut auf, ist aber nicht von Belang, da das ergebnislos bleibt.)
- Jetzt tritt (automatisch) das Ereignis "Worksheet_Change" ein und reagiert auf den erfolgten Datums-Eintrag in Zelle "Q9".
"Worksheet_Change" ermittelt Zeile 9 und Spalte 17 ("Q") und fragt mit
"If ActiveSheet.Cells(Target.Row, 17) = Date Then", ob hier ein Datum drinsteht. Ergebnis positiv, ja, es ist so.
- Da positiv geprüft wurde, kommt es nun zu
(1.) "ActiveSheet.Range(Cells(Target.Row, 1), Target.Cells(Row, 17)).Locked = True" (neu: das Zellen-Sperren)
(2.) "ActiveSheet.Protect(Password:="XXXXXXX", UserInterfaceOnly:=True) = True" (Tabellenblatt schützen)
(3.) "ThisWorkbook.Save" (Arbeitsmappe speichern)
- "ThisWorkbook.Save" ruft "Workbook_BeforeSave" auf und hier werden alle Zellen "Q9"..."Q20" auf einen
Eintrag "Datum" geprüft ("For Each objCell In .Range("Q9:Q20")").
Jede Zeile, die in Spalte "Q" einen Datumseintrag hat ("If IsDate(objCell.Value) Then"),
wird nun duch die Anweisung "objCell.Interior.Color = RGB(221..." ausgegraut
(das passiert übrigens auch für Zeilen, die schon mal durch das Genehmigungsverfahren gelaufen sind).
- Nun kehrt die Programmabfolge SPEICHERND nach "Worksheet_Change" zurück, denn es gilt noch die MsgBox-Anweisung zu erledigen.
- Ist das geschafft, läuft "Worksheet_Calculate" weiter ab, denn es wurden ja noch nicht alle Zeilen auf Datumseintrag
geprüft. Das wäre für Deine Anwendung eigentlich nicht weiter notwendig,
da aber überall "For Each objCell In Range("O9:O20")" (also "für alle Zellen "O9" bis "O20"") angewiesen ist,
muss also auch alles (hier ohne weitere Ergebnisse) abgearbeitet werden.
Was ich nun noch mehr für Dich tun könnte, das weiß ich nicht. Bei mir läuft es so ab, wie Du es gewünscht hast
(natürlich alles nur auf "PersCh" bezogen). VG.
PS: sollte es immer noch nicht laufen, dann besser per Mail, denn wir müssen diesen Beitrag ja nicht noch weiter aufblasen. |