Registriert seit: 03.11.2022
Version(en): 2019
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
Registriert seit: 12.06.2020
Version(en): 2024, 365business
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.
Registriert seit: 17.04.2014
Version(en): MS Office 365(32)
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
Registriert seit: 11.12.2022
Version(en): 365 / 2021
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 --------------- - Wenn du nicht weißt, wo du hin willst, ist es egal, welchen Weg du einschlägst.
Registriert seit: 03.11.2022
Version(en): 2019
20.09.2023, 11:54
(Dieser Beitrag wurde zuletzt bearbeitet: 20.09.2023, 12:01 von Karlheinz16.)
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
Registriert seit: 03.11.2022
Version(en): 2019
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
Registriert seit: 11.12.2022
Version(en): 365 / 2021
20.09.2023, 17:55
(Dieser Beitrag wurde zuletzt bearbeitet: 20.09.2023, 17:56 von DIZA.)
(20.09.2023, 12: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 --------------- - Wenn du nicht weißt, wo du hin willst, ist es egal, welchen Weg du einschlägst.
Registriert seit: 03.11.2022
Version(en): 2019
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
Registriert seit: 11.12.2022
Version(en): 365 / 2021
Hallo, pack vor der End If Zeile noch ein Code: Range("E" & Target.Row).Select
Gruß Dirk --------------- - 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:1 Nutzer sagt Danke an DIZA für diesen Beitrag 28
• Karlheinz16
Registriert seit: 03.11.2022
Version(en): 2019
jetzt klappts, prima
Nochmals vielen Dank
Gruß
Karlheinz
|