leider habe ich nur geringe VBA Kenntnisse und würde mich über Hilfe von Euch freuen.
Funktionsbeschreibung der Arbeitsmappe:
Ich habe eine Arbeitsmappe, die aus zwei Blättern besteht.
In dem Blatt Berechtigungen wird der aktuelle Benutzer ausgelesen:
--------------------------------------------
Private Sub Workbook2_open()
Sheets("Berechtigungen").Unprotect "Passwort"
'UserName Windows
'Range("Berechtigungen!B2")=Environ("UserName")
'UserName Excel
Range("Berechtigungen!B2") = Application.UserName
Sheets("Berechtigungen").Protect "Passwort"
End Sub
--------------------------------------------
Die Rollen des Benutzers werden dann im Blatt Berechtigungen ausgelesen und in Berechtigungen!$B$4, Berechtigungen!$B$5, Berechtigungen!$B$6, Berechtigungen!$B$7 gespeichert. Ebenfalls wird der richtige Name zugeordnet (Berechtigungen!$B$3). Das Blatt Berechtigungen ist komplett geschützt.
Das Blatt Aktionen ist das eigentliche Blatt, in welches die Benutzer den Arbeitsstatus ankreuzen können. Dieses Blatt ist ebenfalls geschützt bis auf die Ankreuzzellen. Diese Zelle haben eine Gültigkeitsoption, in der sie überprüfen, ob der aktuelle Benutzer der das Kreuz setzt auch berechtigt ist, das "x" zu setzen. Die daneben benachbarten Zellen tragen, wenn ein "x" gesetzt wurde Name und Datum ein.
Kreuz (J14) Daten>Gültigkeit
=UND(ODER(WENNFEHLER(SUCHEN(Berechtigungen!$B$4; B14);0)=1; WENNFEHLER(SUCHEN(Berechtigungen!$B$5; B14);0)=1;WENNFEHLER(SUCHEN(Berechtigungen!$B$6; B14);0)=1;WENNFEHLER(SUCHEN(Berechtigungen!$B$7; B14);0)=1);J20="x";C20="Holz")
Name (K14): =WENN(ISTLEER(J14);"";Berechtigungen!$B$3)
Datum (L14): =WENN(K14="";"";HEUTE())
Danach wird durch ein VBA Makro die Zellen mit den Kreuzen nach dem Speichern ebenfalls gesperrt.
Es gibt mehrere Ankreuzspalten mit Name und Datum.
--------------------------------------------
Option Explicit
Private bRangeEdited As Boolean
Private WithEvents ws As Worksheet
Private Sub Workbook_open()
Set ws = Range("Aktionen!A1:Aktionen!AF45").Parent
End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim sMSG As String
sMSG = "Das Speichern der Datei schützt Ihre Eingaben vor nachträglicher Veränderung!" & _
vbLf
sMSG = sMSG & "Möchten Sie fortfahren?"
If Not bRangeEdited Then GoTo Xit
If Not Me.ReadOnly Then
With Range("Aktionen!A1:Aktionen!AF45")
If MsgBox(sMSG, vbExclamation + vbYesNo) = vbNo Then
Cancel = True
GoTo Xit
End If
.Parent.Unprotect "Passwort"
If .SpecialCells(xlCellTypeBlanks).Address .Address Then
.SpecialCells(xlCellTypeConstants).Locked = True
bRangeEdited = False
End If
.Parent.Protect "Passwort"
End With
End If
Xit:
End Sub
Private Sub ws_Change(ByVal Target As Range)
If Not Intersect(Range("Aktionen!A1:Aktionen!AF45"), Target) Is Nothing Then
bRangeEdited = True
End If
End Sub
--------------------------------------------
Problembeschreibung:
Alles funktioniert so weit. Allerdings, wenn ein anderer Benutzer die Datei öffnet, geht natürlich die Beziehung zu den abhängigen Zellen (Name, Datum) verloren. In dem Blatt Aktionen kann man die Eintragungen vom vorherigen Benutzer nicht mehr korrekt sehen (#NV). Der Bezug fehlt jetzt.
Meine Überlegung wäre gewesen, dass die Zellen, welche Name und Datum enthalten nach dem Ankreuzen und Speichern in WERTE umgewandelt werden. Ist das mit VBA möglich? Ich habe schon viel gesucht, aber leider nichts gefunden.
Vielleicht gibt es ja auch eine andere Lösung.
Für Hilfe bin ich schon im Voraus dankbar, leider eilt es ein wenig ;(
Schöne Grüße
Peter