Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Zellen sperren wenn andere Zelle leer
#1
Hallo Gemeinschaft,
ich habe da eine Herausforderung für mich, die leider nicht lösen kann. Ich habe eine Tabelle gebastelt, in der in Zelle A3 der Gegenstand steht, in Zelle B3 der Lagerort und in Zelle C3 steht, ob der Artikel gebraucht wird, oder nicht. Wenn jetzt in Zelle C3 ein "x" steht, soll Zelle D3 gesperrt werden. A3 und B3 sind von Haus aus gesperrt. Ich habe auch schon etwas gefunden, dass meiner Meinung nach funktionieren müsste, tut es aber nicht.
Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Dim i As Long
For i = 1 To anzahlzeilen
If Cells(i, 3).Value = "x" Then
Range(Cells(i, 3)).Locked = False
Range(Cells(i, 4)).Locked = True
Else
Range(Cells(i, 3)).Locked = True
Range(Cells(i, 4)).Locked = False
End If
Next i
End Sub
was mache ich falsch? Ich habe diesen Code bei Objekte eingefügt, funktioniert nicht. Bei Module eingefügt, funktioniert auch nicht. Kann mir bitte jemand detailiert erklären, wie es richtig geschrieben sein muss.
Vielen Dank für eure Mühe.
Gruß Karlheinz

Nochmals vielen Dank

Gruß

Karlheinz
Antworten Top
#2
der code gehört ins codemodul des Arbeitsblattes. 
rechte Maustaste auf den Blattnamen -- Code anzeigen klicken. -- einfügen.

Der Parameter Target repräsentiert die Zelle, die gerade ausgewählt wurde. 
dein Code wird bei jedem Ändern der Selection ausgeführt. 

Wieso wird dort eine Schleife ausgeführt?
Wieso gibt es eine Variable anzahlzeilen, die keinen Wert zugewiesen bekommt? 
Dadurch wird die Schleife nicht durchlaufen. Mal abgesehen davon ob die so sinnvoll ist.  

bei change und selection_change, prüft man meist ob Target also die gerade betroffene Zelle oder der Zellbereich überhaupt die sind, welche betrachtet werden sollen. 
das  macht man meist über eine Prüfung der Zelladresse  mittels Vergleich der Zeilennummer, Spaltennummer oder der funktion intersect() 
wenn das dann zutrifft erledigt man die Dinge, die man möchte.  

Schreibt man Werte in Zellen oder wählt andere Zellen aus sollte man die Eventbehandlung ausschalten um nicht erneut das Event aufzurufen wenn man noch in der Funktion drin ist.
Antworten Top
#3
Hallo Karlheinz,

Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  Dim i As Long
  For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row
    Cells(i, 4).Locked = Cells(i, 3).Value = "x"
  Next i
End Sub

Gruß, Uwe
Antworten Top
#4
Hallo,
wenn du lediglich bei einem x in C verhindern möchtest das jemand den Inhalt von D ändert sollte auch das ein Weg sein.

In den Code des Arbeitsblattes
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column = 4 And Cells(Target.Row, 3).Value = "x" Then
        Application.EnableEvents = False: Application.Undo: Application.EnableEvents = True
    End If
End Sub
Gruß Dirk
---------------
100  - Wenn du nicht weißt, wo du hin willst, ist es egal, welchen Weg du einschlägst.

Antworten Top
#5
Hallo ralf_b
vielen Dank für deinen Beitrag. Ich versuche, so gut es geht, deine Fragen zu beantworten.
-Ich habe ja geschrieben, dass ich den Code auf beide Möglichkeiten probiert habe, um sicher zu stellen, dass ich keinen Fehler gemacht habe.
-da meine Tabelle eine Auflistung von Gegenständen ist, die in den Wohnwagen kommen, betrifft das ja mehrere Zeilen.
Wie gesagt, leider passiert bei diesem Code nichts.

Hallo DIZA
vielen Dank für deine Teilnahme. Wenn ich jetzt bei C3 ein "x" eintragen möchte, kommt sofort der Laufzeitfehler 1004, Die Locked-Eigenschaft des Range-Objektes kann nicht festgelegt werden.
Weder das Blatt noch die Zellen sind schreibgeschützt. Keine Ahnung, an was das liegt.

Nochmals vielen Dank

Gruß

Karlheinz
Antworten Top
#6
Hallo DIZA, die erste Antwort war leider falsch, ich habe die Namen verwechselt, sorry. Die Antwort gilt KUWER.
Bei deinem Code wird nicht verhindert, dass in D ein Eintrag gemacht wird, sondern er löscht in einfach. Wenn jetzt natürlich noch die nächste freie Zelle ausgewählt würde, wäre es super.

Nochmals vielen Dank

Gruß

Karlheinz
Antworten Top
#7
(20.09.2023, 11:45)Karlheinz16 schrieb: Bei deinem Code wird nicht verhindert, dass in D ein Eintrag gemacht wird, sondern er löscht in einfach. 

Er löscht ihn nicht einfach, sondern macht die Eingabe rückgängig, wenn die Zelle vorher leer war dann sieht es so aus als wenn gelöscht wird. Sollte in der Zelle etwas eingetragen gewesen sein, wird der "alte" Wert wieder hergestellt.

- springen in nächste freie Zelle ? in welcher Spalte ? / nur wenn "x" in C oder generell ?
= das musst du schon etwas genauer definieren.
Gruß Dirk
---------------
100  - Wenn du nicht weißt, wo du hin willst, ist es egal, welchen Weg du einschlägst.

Antworten Top
#8
Zitat: springen in nächste freie Zelle ? in welcher Spalte ? / nur wenn "x" in C oder generell ?
Spalte E wäre die nächste, nicht gesperrte Spalte, da in Spalte C nur ein "x" eintragen werden, ja

Nochmals vielen Dank

Gruß

Karlheinz
Antworten Top
#9
Hallo,
pack vor der End If Zeile noch ein
Code:
Range("E" & Target.Row).Select
Gruß Dirk
---------------
100  - Wenn du nicht weißt, wo du hin willst, ist es egal, welchen Weg du einschlägst.

[-] Folgende(r) 1 Nutzer sagt Danke an DIZA für diesen Beitrag:
  • Karlheinz16
Antworten Top
#10
jetzt klappts, prima

Nochmals vielen Dank

Gruß

Karlheinz
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste