Supportnet Computer
Planet of Tech

Supportnet / Forum / Tabellenkalkulation

Makro für Zellenschutz in Excel





Frage

Hallo! Ich möchte Zellen automatisch vor unbeabsichtigtem Überschreiben schützen. Zur Sachlage: Es handelt sich um eine Messwerttabelle, in die Mittels Messuhr Daten eingetragen werden. Wenn sich der entsprechende Mitarbeiter in der Zeile vertut, überspeichert er die Messwerte. Gibt es eine Möglichkeit die ausgefüllten Zellen automatisch zu sperren? Entweder sofort nach der Eingabe, oder (besser), die vom Vortag ausgefüllten Zellen? Also alle Zellen in denen ein Wert steht. Z.B. über ein Makro das beim Aufruf der Arbeitsmappe ausgeführt wird? Danke für die Hilfe

Antwort 1 von coros

Hi Sui,

zunächst einmal musst Du alle Zellen, in die Eingaben gemacht werden dürfen, markieren und dann unter Zellen formatieren in der Registerkarte Schutz den Haken bei Gesperrt entfernen. Dann muss das Tabellenblatt geschützt werden. Ob mit oder ohne Passwort ist dabei egal. Danach füge den nachfolgenden Code in das VBA Projekt des Tabellenblattes, in dem die Zellen nach der Eingabe geschützt werden sollen, ein.

Option Explicit

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

Mit dem obigen Code wird nach der Eingabe der Blattschutz aufgehoben, die Zelle für Eingaben gesperrt und dann wieder der Blattschutz aktiviert. Wenn Du ein Blattschutzpasswort verwendet hast, muss dieses in den Zeilen

Me.Unprotect ""
Me.Protect ""

zwischen die Anführungszeichen ("") geschrieben werden.

Ich hoffe, Du kommst klar. Bei Fragen melde Dich bitte.

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 2 nach. Dort stelle ich dazu eine bebilderte Anleitung zur Verfügung, die Dir sicherlich helfen wird.

MfG,
Oliver
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 Sui

Super!

Das erspart mir eine Menge Arbeit.
Ich sollte eigentlich jeden Tag manuell das Zeugas sperren. 24x PW eintippen ;-)


ES klappt mit deiner Lösung perfekt. Ich liebe Foren!

Aber eine Kleinigkeit hätt ich noch:

Ich hatte mit folgenden Code kopiert, um auotomatisch ein Datum einzufügen.

-----------
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Intersect(Target, Range("C15:C65536")) Is Nothing Then
Else
Cells(Target.Row, 4) = Format(Now, "dd.mm.yyyy")
End If
End Sub
------------


Wie bekomm ich das zusammen mit deinem Code aktiv?

Deiner endet ja mit "End sub"

Antwort 3 von coros

Hi Sui,

das End Sub sagt nur aus, dass die Prozedur dort zu ende ist. Danach kann eine neue, allerdings keine mit demselben Ereignis, beginnen. Das würde bei Dir dann folgendermaßen aussehen:

Rem mein Code

Option Explicit

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

Rem---------------------------------------------------------
Rem Dein Code

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Intersect(Target, Range("C15:C65536")) Is Nothing Then
Else
Me.Unprotect ""
Cells(Target.Row, 4) = Format(Now, "dd.mm.yyyy")
Me.Protect ""
End If
End Sub 

Wobei ich Deinen Code an den Stellen, an denen er unterstrichen ist, etwas geändert habe, da Du nun durch den Blattschutz, beim Einfügen des Datums den Blattschutz automatisch vor dem Eintragen aufheben und dann wieder einschalten lassen musst.

MfG,
Oliver
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 Sui

Danke, das klappt.


Ich weiß allerdings nicht, ob das in unserer Produktion mit unserern Mitarbeitern funktioniert. Ich denke diese werden sich ständig vertuen und dann die Zellen gesperrt vorfinden.

Werd das aber erst einmal ausprobieren *g*

Gibt es auch eine Möglichkeit periodisch über ein Zeitintervall alle ausgefüllten Zellen zu sperren?
Z.B. alle 5min?


VBA ist schon genial....wenn man es kann :-/

So, meld mich morgen noch einmal, da ich jetzt in den Feierabend entfleuche.

Gruß

Antwort 5 von coros

Hi Sui,

dann muss man das folgendermaßen realisieren. Lösche meinen alten Code, also alles was zwischen "Sub Worksheet_Change(ByVal Target As Range)" und "End Sub" einschließlich dieser beiden Zeilen.

Dann kopiere nachfolgenden Code in das VBA Projekt "DieseArbeitsmappe".

Option Explicit

Private Sub Workbook_Open()
Zellen_sperren
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Timer_stoppen
End Sub

Außerdem kopiere nachfolgende Makros in ein "StandardModul".

Option Explicit
Public Zeitspanne As Variant

Sub Zellen_sperren()
Dim Bereich As Range
For Each Bereich In ActiveSheet.UsedRange.Cells
If WorksheetFunction.CountA(Bereich) <> 0 Then
ActiveSheet.Unprotect ""
Bereich.Locked = True
ActiveSheet.Protect ""
End If
Next
Zeitspanne = Now + TimeValue("00:05:00")
Application.OnTime Zeitspanne, "Zellen_sperren"
End Sub

Sub Timer_stoppen()
Application.OnTime EarliestTime:=Zeitspanne, Procedure:="Zellen_sperren", schedule:=False
End Sub 

Beim Öffnen der Datei wird das Makro "Zellen_sperren" ausgeführt, welches die Zellen, in denen etwas steht, sperrt. Am Ende des Makros wird mit der ApplicationOnTime-Methode das Makro nach 5 Minuten erneut gestartet. Soll diese Zeit verändert werden, so muss in dem Makro in der Zeile

Zeitspanne = Now + TimeValue("00:05:00")

die Zeit, hier 00:05:00 für 5 Minuten, geändert werden. Beim Beenden wird das Makro "Timer_stoppen " ausgeführt, welches die ApplicationOnTime-Methode wieder stoppt. Das ist zwingend notwendig, da ansonsten Excel erneut gestartet würde.

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

Solltest Du nicht wissen, wie Du den Code und das Makro in Deine Datei bekommst, dann schau mal auf meiner HP in der Rubrik Anleitungen und dort dann in der Anleitungsnummer 1 und 3 nach. Dort stelle ich dazu eine bebilderte Anleitung zur Verfügung, die Dir sicherlich helfen wird.

MfG,
Oliver
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 6 von Sui

Hallo,

leider geht die letztgenannte Lösung nicht.

Beim Start kommt folgende Fehlermeldung:

"Laufzeitfehler 1004: Die Lockedeigenschaft des Range-Objekts kann nicht festgelegt werden"

Beim Ende:

"Laufzeitfehler 1004: Die Methode "OnTime" für das Objekt _Application ist fehlgeschlagen"


Bin da selbst leider gar kein *Z* drin

Antwort 7 von coros

Hi Sui,

welche Excelversion nutzt Du? Ich habe hier im Moment Excel 2003 und dort funktioniert das alles tadellos. Bedingung ist natürlich, dass alles an der richtigen Stelle im VBA-Editor steht.

Besteht die Möglichkeit mir die Datei mal zu schicken, wenn Du es nicht hinbekommst? Wenn ja, dann entnehme meine E-Mailadresse bitte meiner HP unter anderem aus dem Impressum. Binde in der Betreffzeile irgendwie das Wort "Supportnet" und den Namen (Nickname), unter dem Du hier gepostet hast mit ein, da ich alle Mails deren Absender ich nicht kenne, ungelesen lösche.

MfG,
Oliver
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.

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


Ähnliche Themen:


Suche in allen vorhandenen Beiträgen: