Zellen je nach Eingabe sperren

  • Excel

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von roddy.

    Zellen je nach Eingabe sperren

    Hallo,

    ich hab ein Berechnungstool, wofür verschiedene Eingabewerte erforderlich sind. Jetzt hab ich zbsp eine Zelle A1 oder eine Zelle B1 in die jeweils Werte eingegeben werden können. Wird zuerst in A1 eingegeben, soll B1 gesperrt und schraffiert sein. Wird zuerst in B1 eingegeben dann A1 gesperrt....

    Danke im voraus
    Das kannst du über das Worksheet_Change-Ereignis der entsprechenden Tabelle steuern. Der Parameter Target enthält die geänderte Zelle als Range-Objekt. Achtung: Werden mehrere Zellen gleichzeitig geändert (zum Beispiel beim Unten-Ausfüllen), ist Target der entsprechende Zellbereich.
    Ich hab' mir das so vorgestellt:

    Visual Basic-Quellcode

    1. Private Sub Worksheet_Change(ByVal Target As Range)
    2. Dim Sperrzelle As Range, sperren As Boolean
    3. If Target.FormulaR1C1 <> "" Then
    4. sperren = True
    5. Select Case Target.Address
    6. Case "$A$1": Set Sperrzelle = Range("B1")
    7. Case "$B$1": Set Sperrzelle = Range("A1")
    8. Case Else: sperren = False
    9. End Select
    10. If sperren Then
    11. 'Hintergrundmuster ändern (hier: Schrägstriche):
    12. With Sperrzelle.Interior
    13. .ColorIndex = 0
    14. .Pattern = xlLightUp
    15. .PatternColorIndex = xlAutomatic
    16. End With
    17. 'Gültigkeitsregel festlegen, sodass keine Werte eingegeben können:
    18. With Sperrzelle.Validation
    19. .Delete
    20. .Add Type:=xlValidateCustom, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="=FALSE"
    21. .IgnoreBlank = True
    22. .InCellDropdown = True
    23. .InputTitle = ""
    24. .ErrorTitle = ""
    25. .InputMessage = ""
    26. .ErrorMessage = "Hier dürfen keine Werte eingegeben werden."
    27. .ShowInput = True
    28. .ShowError = True
    29. End With
    30. End If
    31. End If
    32. End Sub


    Diesen Code in die Code-Ebene des betreffenden Tabellenblatts einfügen.
    ok, erstmal danke,

    gibt jedoch ab und an eine "Typenunverträglichkeit Fehler 13" für If Target.FormulaR1C1 <> "" Then

    das Makro läuft auch nicht gleich los, wenn ich eine der beiden zellen gefüllt hab.

    Wie könnte ich die Felder wieder freigeben lassen wenn ich den Wert aus einer der beiden Zellen lösche?

    roddy schrieb:

    Werden mehrere Zellen gleichzeitig geändert (zum Beispiel beim Unten-Ausfüllen), ist Target der entsprechende Zellbereich.


    Dass hatte ich bei meinem Beispiel nicht bedacht, daher die Fehlermeldung. :cursing:

    Jedenfalls müsste hiermit sowohl die Fehlermeldung nicht mehr kommen als auch das Entsperren ermöglicht werden:

    Visual Basic-Quellcode

    1. Private Sub Worksheet_Change(ByVal Target As Range)
    2. Dim Sperrzelle As Range, sperren As Boolean
    3. sperren = True
    4. Select Case Target.Address
    5. Case "$A$1": Set Sperrzelle = Range("B1")
    6. Case "$B$1": Set Sperrzelle = Range("A1")
    7. Case Else: sperren = False
    8. End Select
    9. If sperren Then
    10. If Target.FormulaR1C1 = "" Then
    11. 'Zellinhalt wurde gelöscht.
    12. 'Hintergrundmuster wiederherstellen (hier: kein Hintergrund):
    13. Sperrzelle.Interior.ColorIndex = xlNone
    14. 'Gültigkeitsregel löschen:
    15. Sperrzelle.Validation.Delete
    16. Else
    17. 'Es wurde ein Wert eingegeben.
    18. 'Hintergrundmuster ändern (hier: Schrägstriche):
    19. With Sperrzelle.Interior
    20. .ColorIndex = 0
    21. .Pattern = xlLightUp
    22. .PatternColorIndex = xlAutomatic
    23. End With
    24. 'Gültigkeitsregel festlegen, sodass keine Werte eingegeben können:
    25. With Sperrzelle.Validation
    26. .Delete
    27. .Add Type:=xlValidateCustom, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="=FALSE"
    28. .IgnoreBlank = True
    29. .InCellDropdown = True
    30. .InputTitle = ""
    31. .ErrorTitle = ""
    32. .InputMessage = ""
    33. .ErrorMessage = "Hier dürfen keine Werte eingegeben werden."
    34. .ShowInput = True
    35. .ShowError = True
    36. End With
    37. End If
    38. End If
    39. End Sub