Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
24.04.2024 17:19:09
Anzeige
Archiv - Navigation
1816to1820
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
Inhaltsverzeichnis

Zellen anhand einer Vorauswahl sperren

Zellen anhand einer Vorauswahl sperren
12.03.2021 08:49:22
Benny
Hallo,
ich habe mit Hilfe dieses Forums eine Excel Liste erstellt, die mir mit VB bestimmte (vorher geschützte Zellen) freigibt und grün einfärbt. Je nachdem was in C2 ausgewählt wird.
Ich dachte ich wäre schon am Ziel. Allerdings ist es jetzt so, dass er zwar das freigeben und einfärben macht, aber wenn ich dann in diese Zellen etwas eintrage und später erneut den Status von DX änder (indem ich diie Zelle einfach nur markiere und in die nächste springe), dann löscht er mir auch alle zuvor eingetragenen Werte aus. Aber ich aus D und E sondern erst ab F.
Kann mir dafür einer eine Erklärung geben?
Datei habe ich angehängt
Außerdem experimentiere ich gerade damit, dass ich alle Zellen auswählen möchte die dann entsperrtwurden und diese dann prüfen möchte auf Leer. Am Ende möchte ich die gesamte Zeile ausblenden wenn alle Felder gefüllt sind. oder aber in eine neue Spalte einen Status zum Beispiel "erledigt" setzen kann.
Dazu habe ich schon mal die Prüfung begonnen (aber zur Zeit auskommentiert). Bin ich da auf dem richtigen Weg?
'If CBool(Mid(List, i, 1)) = False Then
'MsgBox Zelle.Offset(0, i).Value
'End If

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
... nix angehängt :-(
12.03.2021 08:56:04
MCO
Hier ist nix ...

AW: ... nix angehängt :-(
12.03.2021 09:50:57
Benny
Ohh sorry. Einmal mit Profis zusammen arbeiten ^^.
Hab zwar hochgeladen aber den Link nicht eingefügt.
https://www.herber.de/bbs/user/144692.xlsb
Die Date ist eine xlsb, weil die xlsm mehr als 300 kb hatte

AW: Zellen anhand einer Vorauswahl sperren
12.03.2021 14:08:44
Lillian
Hallo Benny,
kannst du mir sagen, wozu die die Zeile
ZelleDavor.Range("D1:O1").ClearContents 'relative Adresse!
in
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
benötigst?
Ich hab die Datei probeweise mit Daten gefüllt und durch die Zeile löscht sich das bereits Eingetragene beim Ändern der Einteilung. Oder soll sich alles löschen, wenn du die Einteilung änderst? Ohne die Zeile bleibt alles stehen, nur die Farbe ändert sich jeweills und die Zellen werden schreibgeschützt.
Viele Grüße,
Lillian

Anzeige
AW: Zellen anhand einer Vorauswahl sperren
12.03.2021 14:42:03
Benny
Ah super. Das war´s.
Jetzt muss ich nur noch hin bekommen, dass ich die ausgefüllten Zeilen irgendwie markiere. Ich habe es jetzt soweit hinbekommen, dass ich alle Zellen prüfe, die ausgefüllt werden müssen und wenn alle Zellen ausgefüllt sind, dann habe ich einen Boolschen Wert in der Variable blnReady
Nur wie bekomme ich den Wert jetzt in eine weitere Spalte der aktuellen Zeile.
Hat da einer eine Idee?
Wenn alles ausgefüllt wurde ist der Wert am Ende True. Ansonsten False.
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Application.Intersect(Target, Range("E2:E5000")) Is Nothing Then
sortieren_datum
End If
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Static ZelleDavor As Range
On Error GoTo Catch
Try:
If ZelleDavor.Column = 3 And ZelleDavor.Row >= 2 Then
Application.EnableEvents = False
ActiveSheet.Unprotect Password:="test"
'ZelleDavor.Range("D1:O1").ClearContents 'relative Adresse!
Zellen_sperren ZelleDavor
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, Password:=" _
test"
Application.EnableEvents = True
End If
Catch:
Finally:
Set ZelleDavor = Target
End Sub
Sub Zellen_sperren(Zelle)
Dim blnReady As Boolean
blnReady = True
Dim List, i
List = Replace(List, " ", "")
Select Case Zelle.Value
Case "":               List = "2222222222222"
Case "Neueröffnung":   List = "0000001111000"
Case "Inhaberwechsel": List = "0000000000000"
Case "Umfirmierung":   List = "0000000000000"
Case "Schließung":     List = "0011110000111"
Case "weitere TID":    List = "0000001111111"
Case "TID Abfrage":    List = "0011001111111"
Case "KK Auftrag":     List = "0011111111000"
'case "xy": list = "..." '0:offen, 1:gesperrt
Case Else: List = "0000000000000"
List = Replace(List, " ", "")
End Select
For i = 1 To Len(List)
If List = 2222222222222# Then
Zelle.Offset(0, i).Locked = True
Zelle.Offset(0, i).Interior.ColorIndex = False
Else
If CBool(Mid(List, i, 1)) = False Then
If Zelle.Offset(0, i).Value = "" Then
blnReady = False
End If
End If
Zelle.Offset(0, i).Locked = CBool(Mid(List, i, 1))
Zelle.Offset(0, i).Interior.ColorIndex = 35 - 13 * CInt(Mid(List, i, 1)) '22:rot, 35:grü _
n
End If
Next
End Sub
Sub sortieren_datum()
Dim letzte_zeile As Long
ActiveSheet.Unprotect Password:="test"
letzte_zeile = Cells(Rows.Count, 1).End(xlUp).Row
Range("A2:R" & letzte_zeile).Sort Key1:=Range("E2"), Order1:=xlAscending, Header:=xlGuess,  _
_
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
ActiveSheet.Protect Password:="test"
End Sub
Hier die Datei
https://www.herber.de/bbs/user/144707.xlsb

Anzeige
AW: Zellen anhand einer Vorauswahl sperren
12.03.2021 21:28:02
Yal
Hallo Benny,
was gedenkst Du mit blnReady zu veranstalten?
Weil bis jetzt, setzst Du es zu True und dann zu False, aber es wird nicht verwendet.
Im übrigens:
List = Replace(List, " ", "")

Wenn List gerade eben instanziert worden und dementsprechend leer ist, ist nutzlos.
Ziel von diese nachträgliche Korrektur, ist bei der Lesbarkeit der Einträge zu helfen. Also etwa in diese Form.
    Select Case Zelle.Value
Case "":               List = "222 222 222 2222"
Case "Neueröffnung":   List = "000 000 111 1000"
Case "Inhaberwechsel": List = "000 000 000 0000"
Case "Umfirmierung":   List = "000 000 000 0000"
Case "Schließung":     List = "001 111 000 0111"
Case "weitere TID":    List = "000 000 111 1111"
Case "TID Abfrage":    List = "001 100 111 1111"
Case "KK Auftrag":     List = "001 111 111 1000"
Wenn Du aber die Lesbarkeit nicht brauchst, brauchst Du den Replace auch nicht.
VG
Yal

Anzeige
AW: Zellen anhand einer Vorauswahl sperren
13.03.2021 08:51:17
Benny
Hallo Yal,
ah ok. Wieder etwas verstanden.
Mit der Variable blnReady versuche ich abzufangen ob alle Pflicht Felder ausgefüllt worden sind. Dieses Ergebnis habe ich dann gehofft an eine weitere Zelle zu übergeben. So dass ich später nach diesem Wert filtern kann. Also soll es quasi eine Möglichkeit geben diese Zeilen auszublenden. Aber ich hab gestern selbst vermutet das ich da in eine falsche Richtung bewege. Wie würdest du das angehen?
Gruß
Benny

AW: Zellen anhand einer Vorauswahl sperren
14.03.2021 10:04:59
Benny
Also ich habe jetzt eine ganze Weile zum gebastelt und bin glaube ich fast am Ziel.
Ich befürchte nur das ich zu kompliziert gedacht habe und ggf einen nicht sehr pergormanten Code geschrieben habe, der vielleicht deutlich schlanker und schneller laufen würde.
Ich habe jetzt nur noch ein Problem: Den Status habe ich jetzt in Spalte R. Den wollte ich eigentlich durch sortieren filtern. Das scheint aber nicht zu gehen. Vermutlich weil das Blatt schreibgeschützt ist (Spalte R habe ich aber nicht geschützt).
Hat da jemand eine Idee? Oder muss ich das auch wieder mit VBA machen? Eventuell mit einem Button?
Hier der komplette Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Application.Intersect(Target, Range("E2:P5000")) Is Nothing Then
sortieren_datum
CheckStatus (Target.Row)
End If
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim Position As Integer
Static ZelleDavor As Range
On Error GoTo Catch
Try:
If ZelleDavor.Column = 3 And ZelleDavor.Row >= 2 Then
Application.EnableEvents = False
ActiveSheet.Unprotect Password:="test"
Position = ZelleDavor.Row
Call Zellen_sperren(ZelleDavor, Position)
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, Password:=" _
test"
Application.EnableEvents = True
End If
Catch:
Finally:
Set ZelleDavor = Target
End Sub
Sub Zellen_sperren(Zelle, Position)
Dim List, i
List = Replace(List, " ", "")
Select Case Zelle.Value
Case "":               List = "2222222222222"
Case "Neueröffnung":   List = "0000001111000"
Case "Inhaberwechsel": List = "0000000000000"
Case "Umfirmierung":   List = "0000000000000"
Case "Schließung":     List = "0011110000111"
Case "weitere TID":    List = "0000001111111"
Case "TID Abfrage":    List = "0011001111111"
Case "KK Auftrag":     List = "0011111111000"
'case "xy": list = "..." '0:offen, 1:gesperrt
Case Else: List = "0000000000000"
List = Replace(List, " ", "")
End Select
For i = 1 To Len(List)
If List = 2222222222222# Then
Zelle.Offset(0, i).Locked = True
Zelle.Offset(0, i).Interior.ColorIndex = False
Else
If CBool(Mid(List, i, 1)) = False Then
If Zelle.Offset(0, i).Value = "" Then
blnReady = False
End If
End If
Zelle.Offset(0, i).Locked = CBool(Mid(List, i, 1))
Zelle.Offset(0, i).Interior.ColorIndex = 35 - 13 * CInt(Mid(List, i, 1)) '22:rot, 35:grü _
n
End If
Next
End Sub
Sub CheckStatus(Zeilennummer)
Dim arrStatus As Variant
ActiveSheet.Unprotect Password:="test"
For Each Zeile In Range("F" & Zeilennummer & ":P" & Zeilennummer)
If Zeile.Locked = False Then
If Zeile.Value = "" Then
arrStatus = Array(0)
Else
arrStatus = Array(1)
End If
End If
Next Zeile
If Join(arrStatus, vbLf) = "0" Then
Range("R" & Zeilennummer).Value = "offen"
End If
If Join(arrStatus, vbLf) = "1" Then
Range("R" & Zeilennummer).Value = "erledigt"
End If
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, Password:="test"
Application.EnableEvents = True
End Sub
Sub sortieren_datum()
Dim letzte_zeile As Long
ActiveSheet.Unprotect Password:="test"
letzte_zeile = Cells(Rows.Count, 1).End(xlUp).Row
Range("A2:R" & letzte_zeile).Sort Key1:=Range("E2"), Order1:=xlAscending, Header:=xlGuess,  _
_
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
ActiveSheet.Protect Password:="test"
End Sub
Und hier die Datei:
https://www.herber.de/bbs/user/144759.xlsb

Anzeige
AW: Zellen anhand einer Vorauswahl sperren
14.03.2021 22:45:58
Yal
Hallo Benny,
beim Schützen eines Blattes kann Du einige Aktionen erlauben. Die rcihtige ist "Autofilter erlauben".
Um das dazu gehörende VBA_Coding zu finden, habe ich den Makro-Recorder verwendet (wer kann schon alles wissen):
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, _
Scenarios:=True, AllowFiltering:=True
Also AllowFiltering:=True
könnte dich weiterbringen.
VG
Yal

AW: Zellen anhand einer Vorauswahl sperren
15.03.2021 08:47:55
Yal
Hallo Benny,
es geht nicht um Pergormance (lustiger Vertipper. I like), sondern zuerst um Lesbarkeit des Codings: was wird man verstehen, wenn man nach 2 Monaten den Code wieder lesen muss? Oder jemand anderen lesen muss?
(Kommentar immer nach dem Code-Block)
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Application.Intersect(Target, Range("E2:P5000")) Is Nothing Then
sortieren_datum
CheckStatus (Target.Row)
End If
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim Position As Integer
Static ZelleDavor As Range
On Error GoTo Catch
Try:
If ZelleDavor.Column = 3 And ZelleDavor.Row >= 2 Then
Application.EnableEvents = False
ActiveSheet.Unprotect Password:="test"
Position = ZelleDavor.Row
Call Zellen_sperren(ZelleDavor, Position)
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, Password:=" _
test"
Application.EnableEvents = True
End If
Catch:
Finally:
Set ZelleDavor = Target
End Sub
Sub Zellen_sperren(Zelle, Position)
Dim List, i
Select Case Zelle.Value
Case "":               List = "2222222222222"
Case "Neueröffnung":   List = "0000001111000"
Case "Inhaberwechsel": List = "0000000000000"
Case "Umfirmierung":   List = "0000000000000"
Case "Schließung":     List = "0011110000111"
Case "weitere TID":    List = "0000001111111"
Case "TID Abfrage":    List = "0011001111111"
Case "KK Auftrag":     List = "0011111111000"
'case "xy": list = "..." '0:offen, 1:gesperrt
Case Else: List = "0000000000000"
End Select
For i = 1 To Len(List)
Select Case Mid(List, i, 1)
Case 0
If Zelle.Offset(0, i).Value = "" Then blnReady = False
Zelle.Offset(0, i).Locked = False
Zelle.Offset(0, i).Interior.ColorIndex = 35
Case 1
Zelle.Offset(0, i).Locked = True
Zelle.Offset(0, i).Interior.ColorIndex = 22
Case Else
Zelle.Offset(0, i).Locked = True
Zelle.Offset(0, i).Interior.ColorIndex = False
End Select
Next
End Sub

In diesem Bereich nichts geändert. Nur die Lesbarkeit der 3 Fälle 0,1,2 (=Else)

Sub CheckStatus(Zeilennummer)
Dim Zelle As Range
Dim Status As Integer
' wenn eine der Pflicht-Zelle (= nicht gespert), dann "offen"
For Each Zelle In Range("F" & Zellennummer & ":P" & Zellennummer).Cells
If Not Zelle.Locked Then Status = Status - CInt(Zelle.Value = "")
Next Zelle
Application.EnableEvents = False
ActiveSheet.Unprotect Password:="test"
Range("R" & Zeilennummer).Value = IIf(Status > 0, "offen", "erledigt")
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, Password:="test"
Application.EnableEvents = True
End Sub

Ensperren/sperren beschränkt auf das nötigste (kein muss).
Da der Test am Ende nur noch als ja oder nein ausgewertet wird, besteht nicht den Bedarf einen Array an Ja/Nein zu sammeln (die muss Du noch üben ;-)
CInt (...boolsche Test...) liefert -1 bei True sonst null. Daher - CInt(...), um den Status hoch zu zählen. Ab Status > 0 ist es offen.

Sub sortieren_datum()
Dim letzte_zeile As Long
ActiveSheet.Unprotect Password:="test"
letzte_zeile = .Cells(Rows.Count, 1).End(xlUp).Row
Range("A2:R" & letzte_zeile).Sort Key1:=Range("E2"), Order1:=xlAscending, _
Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
ActiveSheet.Protect Password:="test"
End Sub

Das Sortieren ist sauber. Nichts zu "verbessern".
VG
Yal

Anzeige
AW: Zellen anhand einer Vorauswahl sperren
15.03.2021 14:17:41
Benny
Hallo Yal,
danke für deine Mühe. Hab das jetzt mal versucht umzusetzen. Bei CheckStatus bekomme ich aber einen Überlauf Fehler an folgender Position:
If Not Zelle.Locked Then Status = Status - CInt(Zelle.Value = "")

Das war dann aber ein Fehler den ich wohl in der Historie selber eingebaut habe. Ich übernehme am Anfang der Funtion die Zeilennummer als Zeilennummer und greif diese dann später auf als Zellennummer. Die ist ja gar nicht definiert, daher nutzt er die Range F:P.
Funktioniert jetzt hervorragend und ich hab einiges dazu gelernt ;)

Anzeige
AW: Zellen anhand einer Vorauswahl sperren
15.03.2021 17:17:07
Yal
Hallo Benny,
der Fehler geht auf meinem Konto: ich habe per Suchen/Ersetzen Zeile in Zelle umgewandelt und übersehen, das "Zeilenummer" davon betroffen war.
Zeilenummer ist als Variablename in dem Fall richtig. Zellenummer dafür quatsch.
VG
Yal

156 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige