Hallo,
ist es möglich, Tabellenfelder in einer Exceltabelle Passwort zu schützen? Es sollen 3 Abteilungen z.B. auf eine Einsatzplanung auf Basis von Excel zugreifen können, dabei aber die der jeweiligen anderen Abteilungen nicht verändern können.
Wenn nicht möglich, gibt es eine alternative Lösung zu dem Problem?
Vielen Dank schonmal!
ist es möglich, Tabellenfelder in einer Exceltabelle Passwort
zu schützen? Es sollen 3 Abteilungen z.B. auf eine
Einsatzplanung auf Basis von Excel zugreifen können, dabei
aber die der jeweiligen anderen Abteilungen nicht verändern
können.
Hi Pole,
Fritz darf nur Spalte A bearbeiten, Frieda nur Spalte B usw.
Ungetestet:
In den Codebereich von DieseArbeitsmappe:
Private Sub Workbook\_Open()
Call Start
End Sub
Private Sub Workbook\_BeforeClose(Cancel As Boolean)
With ThisWorkbook.Worksheets(1)
.Unprotect Password:="xyz"
.UsedRange.Locked = True
.Protect Password:="xyz"
End With
End Sub
in ein Modul:
Sub Start()
wer = Environ("username")
With ThisWorkbook.Worksheets(1)
.Unprotect Password:="xyz"
.UsedRange.Locked = False
Select Case wer
Case "Fritz"
Columns(2).Locked = True
Columns(3).Locked = True
Case "Frieda"
Columns(1).Locked = True
Columns(3).Locked = True
Case "Paul"
Columns(1).Locked = True
Columns(2).Locked = True
Case Else
End Select
.Protect Password:="xyz"
End With
End Sub
Gruß
Reinhard
Hi Pole und Reinhard,
zu Reinhards Lösung schlage ich zwei Änderungen und eine Alternative vor.
-
Wenn nur die UsedRange geschützt wird, können alle in den darüber hinausgehenden Bereich schreiben. Besser wäre es, alle Zellen zu schützem.
2.
Zum Testen und für Ausnhamefälle (z. B. neue Benutzer, die das Programm noch nicht kennt) kann im Else-Fall ein Passwort abgefragt werden, das dann die gesamte Tabelle entsperrt.
und die Alternative:
Je nach konkreter Tabellenstruktur kann es einfacher sein, nur einzelne Bereiche (z. B. Spalten) pro Abt. freizugeben. Der Code unten geht davon aus, dass jede Abt. in drei Spalten ändern darf.
Es kann natürlich auch praktischer sein, das Blatt allgmein freizugeben und pro Abt. bestimmte Bereiche zu schützen - so hat es Reinhard gelöst.
Noch eine Bemerkung:
Auch beim Open ist keine weitere „Start“-Prozedur nötig, der Code kann direkt im Workbook_Open() stehen.
Und hier der Code:
Private Sub Workbook\_Open()
With Worksheets(1)
.Unprotect Password:="xyz"
.Cells.Locked = True
Select Case Environ("username")
Case "Fritz"
.Range(.Columns(3), .Columns(5)).Locked = False
Case "Frieda"
.Range(.Columns(6), .Columns(8)).Locked = False
Case "Paul"
.Range(.Columns(9), .Columns(11)).Locked = False
Case Else
If InputBox("Passwort eingeben:", "Geschützt", "?") = "abc" Then \_
.Cells.Locked = False
End Select
.Protect Password:="xyz"
End With
End Sub
Private Sub Workbook\_BeforeClose(Cancel As Boolean)
With Worksheets(1)
.Unprotect Password:="xyz"
.Cells.Locked = True
.Protect Password:="xyz"
End With
End Sub
Eventuell ist es nötig, den Code ebenfalls zu schützem, da beide Passwörter (xyz und abc) hier direkt zu sehen sind.
Grüße aus Kamp-Lintfort
Erich
Hallo Erich,
jepp, mit dem usedrange hast du recht, nicht bedacht, dito für den Codeschutz.
Für unbekannte Benutzer hätte ich eher application.quit vorgesehen oder gar ExitWindowsEx(EWX_Force or EWX_Shutdown, 0); *kicher
Und call im Open-Ereignis finde ich übersichtlich und wartungsfreundlich.
Gruß
Reinhard
Ziemlich coole Lösung! Vielen Dank!
Also so schnell hätte ich das selber nicht hinbekommen, toll!
Hallo Reinhard,
Und call im Open-Ereignis finde ich übersichtlich und
wartungsfreundlich.
Warum im Open-, nicht aber im BeforeClose-Ereignis?
Mir erscheint das Aulagern - außer bei mehrfach genutztem Code - überflüssig (und wenig wartungsfreundlich).
Gruß
Erich