Supportnet Computer
Planet of Tech

Supportnet / Forum / Tabellenkalkulation

Zellen schreibschützen beim "Speichern"





Frage

Hallo, in einigen Threats wurde schon auf eine VBA-Lösung hingearbeitet, wie man Zellen schützen kann, nachdem man dort Inhalte eingetragen hatte: Lösung1 ================================= Sub Worksheet_Change(ByVal Target As Range) With Target Me.Unprotect "" Application.EnableEvents = False .Locked = True Application.EnableEvents = True Me.Protect "" End With End Sub Lösung2 (Herber-Seite) ====================== http://www.herber.de/forum/archiv/348to352/t351869.htm Option Explicit Private Sub Workbook_Open() chkVal = False End Sub Code eingefügt mit Syntaxhighlighter 1.16 ------------------------------ Option Explicit Private Sub CommandButton1_Click() chkVal = True End Sub Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Address(False, False) = "D3" And chkVal = True Then chkVal = False ElseIf Target.Address(False, False) = "D3" And chkVal = False Then Target.Offset(0, -1).Select End If End Sub ================================= In meinem Fall haben mehrere Personen Zugriff auf diesen Rechner bzw. diese Excel-Tabelle, was auch beabsichtigt ist. Um jedoch die Möglichkeit zu erhalten, Eingabefehler zu korregieren, bräuchte ich die Möglichkeit mit dem Zellenschutz solange zu warten, bis die Person auf Speichern gedrückt hat. Hätte auch nichts gegen ein extra "Sichern"-Button in der Tabelle. Ich denke mal (bin in VBA nicht soo fit) die oben beschriebene Formel muß nur geringfügig erweitert werden. Mfg. frank

Antwort 1 von coros

Moin Frank,

kopiere nachfolgende VBA Codes in das VBA Projekt "DieseArbeitsmappe".

Public Sperrfunktion As Integer

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim Letzte_Zeile As Long, Letzte_Spalte As Integer, _
Wiederholungen_Zeile As Long, Wiederholungen_Spalte As Integer
Sperrfunktion = 1
ActiveSheet.Unprotect ""
Letzte_Zeile = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row
Letzte_Spalte = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Column
For Wiederholungen_Zeile = 1 To Letzte_Zeile
For Wiederholungen_Spalte = 1 To Letzte_Spalte
If Cells(Wiederholungen_Zeile, Wiederholungen_Spalte) <> "" Then
Cells(Wiederholungen_Zeile, Wiederholungen_Spalte).Locked = True
End If
Next
Next
ActiveSheet.Protect ""
Sperrfunktion = 0
End Sub

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
If Target.Locked And Sperrfunktion = 0 Then
    ActiveSheet.Protect ""
Else
  ActiveSheet.Unprotect ""
End If
End Sub


Bei dem ersten Code wird immer beim Speichern der Bereich, der Daten enthält ermittelt. In diesem ermittelten Bereich werden die Zellen, die Daten enthalten gesperrt. Alle andern Zellen bleiben offen. Somit sind die Zellen, die Du bearbeitest bis zum Speichern änderbar. Der zweite Code ermöglicht einem dann noch bei allen Zellen, die nicht geschützt sind und obwohl der Blattschutz gesetzt ist, dass man dort auch Änderungen z.B. an der Formatierung usw. vornehmen kann. Das ist normalerweise bei gesetztem Blattschutz, auch bei den Zellen, die nicht gesperrt sind, nicht möglich. Mit dem Code wird geprüft, ob die aktive Zelle gesperrt ist. Wenn ja, bleibt der Blattschutz aktiviert. Wenn die Zelle aber nicht gesperrt ist, wird derBlattschutz aufgehoben. Da es sich hierbei um ein SelectionChange-Ereignis handelt, wird der Code bei jedem Wechsel der Zelle durchgeführt und der Blattschutz ist somit auch immer nur in den Zelle deaktiviert, die nicht gesperrt sind.

Ich hoffe, der VBA Code ist so, wie Du es Dir gedacht hast. Bei Fragen oder Problemen melde Dich.

Solltest Du nicht wissen, wie Du den Code in Deine Datei bekommst, dann schau mal auf meiner HP in der Rubrik Anleitungen und dort dann in der Anleitungsnummer 1 nach. Dort stelle ich dazu eine bebilderte Anleitung zur Verfügung, die Dir sicherlich helfen wird.
MfG,
coros
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein
Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.

Antwort 2 von truecolor

Hallo coros,

SO möchte ich auch mal so super Lösungen aus dem Ärmel schütteln können.

Vielen Dank für Deine tolle Lösung

PS: Vielleicht noch drei Feinheiten

- Je nach Sicherheitsstufe erfolgt beim Starten dieser Tabelle eine Macro-Abfrage. Wie kann man verhindern, dass ein User die Tabelle ohne aktivierte Macros bearbeitet?

- Markiert man die nach einem Speichern geschützte Zellen und nimmt unter Eigenschaften den Blattschutz raus, kann man den Inhalt der Zellen doch wieder ändern.

- wie kann man als einziger falsch eingetragene und gespeicherte Zelleninhalte unter Berücksichtigung der ersten beiden Punkte korregieren?

Antwort 3 von coros

Moin Frank,

danke Dir für Dein Lob.

Zu Deiner Frage 1: Verhindern kannst Du das eigentlich gar nicht. Du kannst es aber Leuten, die nicht all zu viel Ahnung von Excel und VBA haben, die Sache ein wenig erschweren. Zunächst einmal kannst Du verhindern, dass beim Öffnen Deine eigentlichen Tabellenblätter angezeigt werden, sondern eine Art Willkommensseite. Dazu musst Du beim Beenden die Datei immer über ein Workbook_BeforeClose-Ereignis zwangsweise Speichern lassen und mit der Anweisung

Sheets("Der Blattname").Visible = False
ThisWorkbook.Close True

alle Blätter automatisch ausblenden und die Datei speichern lassen.

Diese Anweisung zum Ausblenden muss je Blatt beim Speichern vorhanden sein. Zugleich blendest Du ein ausgeblendetes Blatt mit der Anweisung

Sheets("Die Willkommensseite").Visible = True


ein. Somit sind beim nächsten Öffnen alle Blätter bis auf das eine Tabellenblatt ausgeblendet. Mit einem Workbook_Open-Ereignis blendest Du alle Blätter wieder ein und das eine Blatt wieder aus. Wenn nun jemand Makros aktivieren ablehnt hat er nur das Eingangsblatt und keine Datenblätter und kann somit nichts in der Datei machen. Akzeptiert er hingegen die Makros werden alle Datenblätter wieder eingeblendet und das Eingangsblatt verschwindet. Zusammenfassend sieht dann so ein VBA Code z.B. folgendermaßen aus, der in das VBA Projekt "DieseArbeitsmappe" gehört.

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Sheets("Eingangsblatt").Visible = True
Sheets("Datenblatt1").Visible = False
Sheets("Datenblatt2").Visible = False
Sheets("Datenblatt3").Visible = False
ThisWorkbook.Close True
End Sub

Private Sub Workbook_Open()
Sheets("Datenblatt1").Visible = True
Sheets("Datenblatt2").Visible = True
Sheets("Datenblatt3").Visible = True
Sheets("Eingangsblatt").Visible = False
End Sub


Außerdem solltest Du Deinem VBA Code wenigstens einen kleinen Schutz verabreichen, in dem DU das Projekt mit einem Passwort schützt. Gehe dazu in der VBA Umgebung in der Menüleiste auf Extras => Eigenschaften von VBA Projekt... und wechsele dort dann auf die Registerkarte Schutz. Aktiviere dort "Projekt für die Anzeige sperren" und vergebe ein Passwort.

Zu 2. Ja, so ist es.

Zu 3. In dem Du z.B. hinter einer Schaltfläche folgenden Code verwendest.

Sub Blattschutz_entfernen()
Blattschutzpasswort = InputBox("Bitte Paßwort eingeben!", "Abfrage")
If Blattschutzpasswort = "" Then Exit Sub
If Blattschutzpasswort = "Hier Dein Paßwort" Then
ActiveSheet.Unprotect "Dein Passwort"
Else
MsgBox "Sie haben ein falsches Paßwort eingegeben! Bitte wiederholen Sie die Eingabe.", vbCritical, "Fehler!"
End If
End Sub



Bei dem Makro erscheint eine InputBox, in der man das Passwort eingeben muss. Wenn falsch, passiert nichts. Wenn richtig, wird der Blattschutz ausgeschaltet.. Gesetzt wird es dann ja wieder bei dem Abarbeiten des Makros aus meiner 1. Antwort vom 03.05.2005.

Ich hoffe, Du kommst klar. Bei Fragen oder Problemen melde Dich.

MfG,
coros
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein
Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.

Antwort 4 von AndyH

Hallo,

Ich wollte das VBA für meine Tabelle übernehmen, bin aber auf Probleme gestossen.

Ich habe in Spalte A und C fixe Werte, die geschützt sein sollen. In B, D-H werden Eingaben gemacht. In Spalte I soll automatisch der (eingeloggte) Benutzername eingetragen werden und in Spalte J das Tagesdatum. I und J sind auch schreibgeschützt.

Ich befürchte, dass das obige VBA über die "mittlere" Spalte C stolpert. Jedenfalls motzt der Debugger beim Speichern ...

Zusätzliche Frage: Wenn die Datei von mir gespeichert ist, und der Kollege sie öffnet, werden die schreibgeschützten Felder (User und Datum) nicht mit seinen Werten überschrieben?

Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Ähnliche Themen:


Suche in allen vorhandenen Beiträgen: