Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
884to888
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
884to888
884to888
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Zelle sperren, wenn

Zelle sperren, wenn
12.07.2007 13:53:35
PeterO
Hallo Leute,
im Forum werd ich irgendwie nicht fündig. Es gibt zwar etliche Lösungsansätze, aber ich finde keine Lösung, die ich auf mein Problem ummünzen könnte.
Ich habe folgendes Problem:
In einer Tabelle werden fortlaufend Kundendaten eingetragen (je Kunde eine Zeile), beginnend in Zeile 6 (max bis Zeile 56). In der Spalte F wird ein Kürzel eingetragen (A, B oder C). Wird dort ein C eingetragen, sollen in der entsprechenden Zeile die Spalten P, R, T und V gesperrt werden.
Ich habe mir etwas mit VBA vorgestellt, da es im Hintergrund laufen soll und sich im grunde nur auf neue Eingaben oder Änderungen in der Spalte F beziehen soll.
Gruß Peter

19
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
über Gültigkeit
12.07.2007 14:15:52
WF
Hi Peter,
markiere die Spalten P, R, T, V
Daten / Gültigkeit / benutzerdefiniert =$F1"C"
Salut WF

AW: über Gültigkeit
12.07.2007 14:36:00
PeterO
Hallo WF,
soweit war ich schon. War auch richtig, hab nur einen wichigen Punkt vergessen:
Wenn das Kürzel in Spalte F nachträglich auf C geändert wird, müssen die Inhalte der Spalten P, R, T und V gelöscht ("") werden...
Sorry, aber danke schon mal für die schnelle Antwort.
Peter

AW: Zelle sperren, wenn
12.07.2007 14:50:00
Wolli
Hallo Peter, probier mal

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 6 And Target = "C" Then
Cells(Target.Row, 16).Locked = True
Cells(Target.Row, 18).Locked = True
Cells(Target.Row, 20).Locked = True
Cells(Target.Row, 22).Locked = True
End If
End Sub

Natürlich muss das Blatt geschützt sein, damit es wirkt.
Gruß, Wolli

Anzeige
Verbesserung
12.07.2007 14:56:00
Wolli

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Cells(1).Column = 6 And UCase(Target.Cells(1)) = "C" Then
Cells(Target.Row, 16).Locked = True
Cells(Target.Row, 18).Locked = True
Cells(Target.Row, 20).Locked = True
Cells(Target.Row, 22).Locked = True
End If
End Sub


AW: Verbesserung
12.07.2007 15:03:00
PeterO
bringt leider auch nichts

AW: Verbesserung
12.07.2007 16:15:31
Wolli
Hallo Peter,

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Cells(1).Column = 6 And UCase(Target.Cells(1)) = "C" Then
Cells(Target.Row, 16).ClearContents
Cells(Target.Row, 16).Locked = True
Cells(Target.Row, 18).ClearContents
Cells(Target.Row, 18).Locked = True
Cells(Target.Row, 20).ClearContents
Cells(Target.Row, 20).Locked = True
Cells(Target.Row, 22).ClearContents
Cells(Target.Row, 22).Locked = True
End If
If Target.Cells(1).Column = 6 And UCase(Target.Cells(1))  "C" Then
Cells(Target.Row, 16).Locked = False
Cells(Target.Row, 18).Locked = False
Cells(Target.Row, 20).Locked = False
Cells(Target.Row, 22).Locked = False
End If
End Sub


Außerdem:
- Grundeinstellung bei Excel ist, dass alle Zellen gesperrt sind. Dass man sie dennoch editieren kann, liegt nur daran, dass das Blatt nicht geschützt ist.
- Alle Zellen (die jemals editiert werden sollen) müssen folglich entsperrt sein.
- Während der Bearbeitung muss dann das Blatt geschützt sein.
- Wenn das Makro deswegen Probleme macht, setze ein:
vorher: Me.Unprotect
nachher: Me.Protect
Ggf. gefolgt von Passwort:="Geheim"
Wie isset nu?
PS: Mein Code ist der Richtige ;-)

Anzeige
OK, weiß warum
12.07.2007 16:22:00
Wolli
René hat wohl mit seinem Enableevents oder so recht. Jedes löschen eines Inhaltes löst aufs neue die Ereignisprozedur aus. Bei mir in meiner neuesten Version geht's aber auch so:

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Cells(1).Column = 6 And UCase(Target.Cells(1)) = "C" Then
Me.Unprotect Password:="Geheim"
Cells(Target.Row, 16).ClearContents
Cells(Target.Row, 16).Locked = True
Cells(Target.Row, 18).ClearContents
Cells(Target.Row, 18).Locked = True
Cells(Target.Row, 20).ClearContents
Cells(Target.Row, 20).Locked = True
Cells(Target.Row, 22).ClearContents
Cells(Target.Row, 22).Locked = True
Me.Protect Password:="Geheim"
End If
If Target.Cells(1).Column = 6 And UCase(Target.Cells(1))  "C" Then
Me.Unprotect Password:="Geheim"
Cells(Target.Row, 16).Locked = False
Cells(Target.Row, 18).Locked = False
Cells(Target.Row, 20).Locked = False
Cells(Target.Row, 22).Locked = False
Me.Protect Password:="Geheim"
End If
End Sub


Hoffe, das war's jetzt! Mache auch Feierabend. Schön'n Gruß, Wolli :-)))

Anzeige
AW: OK, weiß warum
12.07.2007 16:32:22
PeterO
Hallo Wolli,
ein erster Test aht funktioniert. Muss jetzt aber weg und werde morgen ausgiebig testen.
Werd jetzt noch mal kurz gucken, ob Renee auch noch eine Lösung aht.
Peter

AW: Verbesserung
12.07.2007 16:27:35
PeterO
Sorry, aber es kommt immer noch eine Fehlermeldung:
Laufzeitfehler 1004
Die Locked-Eigenschaft des range-Objektes kann nicht festgelegt werden.

AW: Zelle sperren, wenn
12.07.2007 15:01:26
PeterO
Hallo Wolli,
geht leider nicht. Es passiert rein gar nichts...
Könnte es ein Problem sein, dass die Zellen in der "Grundeinstellung" freigegeben sind?
Bitte auch folgendes beachten (hatte ich eingangs vergessen...):
Wenn das Kürzel in Spalte F nachträglich auf C geändert wird, müssen die Inhalte der Spalten P, R, T und V gelöscht ("") werden.
Peter

Anzeige
AW: Zelle sperren, wenn
12.07.2007 15:03:00
Renee
Hello Peter,
Hier wäre ein Lösung, bei der diese Zellen schlicht nicht mehr selektiert werden.
Das funktioniert auch ohne Blattschutz und hat den Vorteil wenn "C" wieder ändert, sind die Zellen wieder frei.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Cells(Target.Row, 6).Value = "C" And _
(Target.Column = 16 Or _
Target.Column = 18 Or _
Target.Column = 20 Or _
Target.Column = 22) Then
Application.EnableEvents = False
Target.Offset(0, -1).Select
Application.EnableEvents = True
End If
End Sub


Greetz Renee

Anzeige
ERGÄNZUNG zur Frage
12.07.2007 15:07:09
PeterO
Bitte auch folgendes beachten (hatte ich eingangs vergessen...):
Wenn das Kürzel in Spalte F nachträglich auf C geändert wird, müssen die Inhalte der Spalten P, R, T und V gelöscht ("") werden.

AW: ERGÄNZUNG zur Frage
12.07.2007 15:11:00
Renee
Hello Peter,
Ich hab das nicht vergessen, aber Du .... ;-)

Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 6 And UCase(Target) = "C" Then
Application.EnableEvents = False
Cells(Target.Row, 16) = ""
Cells(Target.Row, 18) = ""
Cells(Target.Row, 20) = ""
Cells(Target.Row, 22) = ""
Application.EnableEvents = True
End If
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If UCase(Cells(Target.Row, 6).Value) = "C" And _
(Target.Column = 16 Or _
Target.Column = 18 Or _
Target.Column = 20 Or _
Target.Column = 22) Then
Application.EnableEvents = False
Target.Offset(0, -1).Select
Application.EnableEvents = True
End If
End Sub


Rgds Renee

Anzeige
@ Wolli
12.07.2007 15:31:00
PeterO
hatte deinen Code noch ein wenig angepasst und einen Fehler eingebaut... mein Fehler. Hat nach der Korrektur funktioniert.
Aber: Für den Fall, dass in der Spalte F der Buchstabe von C wieder A oder B geändert wird, müssen die Zellen wieder freigegeben werden. Habe den Code daher wie folgt angepasst:

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Cells(1).Column = 6 And UCase(Target.Cells(1)) = "C" Then
ActiveSheet.Unprotect
Cells(Target.Row, 16).Value = ""
Cells(Target.Row, 16).Locked = True
Cells(Target.Row, 18).Value = ""
Cells(Target.Row, 18).Locked = True
Cells(Target.Row, 20).Value = ""
Cells(Target.Row, 20).Locked = True
Cells(Target.Row, 22).Value = ""
Cells(Target.Row, 22).Locked = True
ActiveSheet.Protect
Else
ActiveSheet.Unprotect
Cells(Target.Row, 16).Locked = False
Cells(Target.Row, 18).Locked = False
Cells(Target.Row, 20).Locked = False
Cells(Target.Row, 22).Locked = False
ActiveSheet.Protect
End If
End Sub


Jetzt kommt aber jedes mal die Fehlermeldung:
Laufzeitfehler 1004
Die Locked-Eigenschaft des range-Objektes kann nicht festgelegt werden.
Wo ist das Problem?
Peter

Anzeige
AW: @ Wolli
12.07.2007 15:39:00
Renee
Hello Peter,
Das Problem ist, dass Du falschen Code nimmst.
Was ist an meinem nicht gut ?
Warum habe ich Application.EnableEvents = .... eingebaut?
Dein ELSE-Zweig wird übrigens auch dann durchlaufen, wenn Du irgendwo im Blatt was änderst :-(((
Greetz Renee

AW: @ Renee
12.07.2007 16:04:51
PeterO
Immer cool bleiben. Ich teste halt beide Versionen. An deinem stört mich z.B. ein wenig, dass man beim weiterhopsen mit der Tab-Taste hängenbleibt. Sicher, ist nur ein "Schönheitsfehler".
Zudem brauche ich noch die Lösung für den "Rückschritt" von C auf A oder B, den ich in deinem Vorschlag noch nicht ausprobieren konnte. Du verwendest halt noch Befehle, die ich noch nicht kenne... Werds aber mal probieren. Oder hättest du noch mal Lust deinen Code zu erweitern?

Anzeige
AW: @ Renee
12.07.2007 16:29:58
Renee
Hi Peter,
I'm cool and I know it ;-)
Wenn Du unbedingt mit Protection arbeiten willst:
1. Wirf den Code für Worksheet_SelectionChange weg
2. Diese Routine stellt den Schutz ein, Du musst sie nur 1xMal laufen lassen. Nachher wirfst Du sie weg.

Private Sub EinmalOnly()
Dim rC As Range
If ActiveSheet.ProtectContents Then ActiveSheet.Unprotect
ActiveSheet.Cells.Locked = False
For Each rC In Range("F:F")
If UCase(rC.Value) = "C" Then
Cells(rC.Row, 16).Locked = True
Cells(rC.Row, 18).Locked = True
Cells(rC.Row, 20).Locked = True
Cells(rC.Row, 22).Locked = True
End If
Next
ActiveSheet.Protect
End Sub


4. Ersetze den Worksheet_Change durch diesen:


Private Sub Worksheet_Change(ByVal Target As Range)
Dim iCnt As Integer
If Not (Target.Column = 6) Then Exit Sub
Application.EnableEvents = False
ActiveSheet.Unprotect
If UCase(Target) = "C" Then
For iCnt = 1 To 4
Cells(Target.Row, 14 + iCnt * 2) = ""
Cells(Target.Row, 14 + iCnt * 2).Locked = True
Next iCnt
Else
For iCnt = 1 To 4
Cells(Target.Row, 14 + iCnt * 2).Locked = False
Next iCnt
End If
ActiveSheet.Protect
Application.EnableEvents = True
End Sub


Regards Renee

Anzeige
AW: @ Renee
12.07.2007 16:34:23
PeterO
Das muss ich mir in Ruihe zu Gemüte führen --- meine VBA-Kenntnisse :-(
Werds wohl erst morgen schaffen mich zurückzumelden.
Aber danke schon mal!

AW: @ Renee
12.07.2007 17:36:00
Renee
Hello again,
Deine Aussage:
dass man beim weiterhopsen mit der Tab-Taste hängenbleibt. Sicher, ist nur ein "Schönheitsfehler".
It's not an error it's a feature!
Du kannst einfach das -1 in ein 1 im Code umwandeln. Dann über- statt unterspringt der Cursor die Spalte.
Renee ;-)

301 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige