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.
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.
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 ZeilenMe.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"
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
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.
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ß
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".
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.
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 ZeileZeitspanne = 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
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.
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.

