Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Bedingung erfüllt - dann Zelle X,Y,Z Sperren...

Bedingung erfüllt - dann Zelle X,Y,Z Sperren...
07.01.2005 21:54:38
Jean-Pierre
Hallo zusammen,
allen ein frohes neues Jahr!
Nun zur Frage, wie lautet der Code (VBA) wenn ich folgendes erreichen möchte:
In Spalte B wird eine Zahl eingetragen (1-3) aufgrund dieser Angabe werden dann entsprechende Zellen schwarz gefärbt (Bedingte Formatierung) ich möchte jedoch über VBA diese Zellen sperren bzw. entsperren.
Beispiel:
In B1 steht 1 dann sollen die Zellen H1-Q1, für eine Eingabe gesperrt werden.
Steht jedoch eine 2 drinn dann sollen die Zellen M1-Q1 gesperrt werden.
Wenn eine 3 drin steht sollen die Zellen nicht gesperrt werden.
Kleine besonderheit dabei, in K1 und P1 werden anhand einer Formel Berechnungen durchgeführt diese beziehen sich jedoch nur auf einen Inhalt in H1,I1 & J1 (Formel in K1) bzw. M1,N1 & O1 (Formel in P1).
Ich möchte verhindern, dass man in besagte Zellen etwas eingibt (ich weiss man sieht es eh nicht) wenn man mit TAB weitergeht. Deswegen sperren.
In diesem Tabellenblatt habe ich bereits folgenden Code drin:

Private Sub Workbook_BeforePrint(Cancel As Boolean)
ActiveSheet.PageSetup.PrintArea = "$A$1:$I" & Range("A65536").End(xlUp).Row
End Sub

Ich hoffe Ihr könnt mir helfen - ich bin ein totaler nop was VBA angeht :-((
Schöne Grüße aus Berlin
Jean-Pierre
Anzeige

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Bedingung erfüllt - dann Zelle X,Y,Z Sperren..
07.01.2005 22:13:18
Josef
Hallo Jean-Pierre!
Das geht zB.so:


      
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$B$1" Then
Select Case Target
Case 1
Range("H1:Q1").Locked = 
True
Case 2
Range("H1:Q1").Locked = 
False
Range("M1:Q1").Locked = 
True
Case 3
Range("H1:Q1").Locked = 
False
Case Else
End Select
End If
End Sub
'Das Tabellenblatt musst du per VBA schützen!
'ZB:
Sub Schutz()
Sheets(1).Protect password:="passwort", userinterfaceonly:=
True
End Sub 


Gruß Sepp
Anzeige
AW: Bedingung erfüllt - dann Zelle X,Y,Z Sperren..
07.01.2005 22:25:39
Jean-Pierre
Hallo Sepp,
vielen Dank für die Arbeit, hab da gleich 2 Fragen.
1) Meinen bisherigen Code (leere Zeilen nicht Drucken) wie Bau ich den ein?
2) Wie muss ich das abändern wenn B1-B50 beachtet werden soll und analog dazu natürlich auch die H1-Q1 bis H50-Q50.
Sorry war in meiner Anfrage im Text nicht ganz klar erwähnt. :-( (Ich gelobe Besserung)
Gruß aus Berlin
Jean-Pierre
Anzeige
AW: Bedingung erfüllt - dann Zelle X,Y,Z Sperren..
07.01.2005 22:38:41
Josef
Hallo Jean-Pierre!
Kein problem!
Dein "Before_Print" lass mal so wie es ist!
Hier der code für "B1:B50":


      
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("B1:B50")) Is Nothing Then
If Target.Count > 1 Then Exit Sub
Select Case Target
Case 1
Range(Cells(Target.Row, 8), Cells(Target.Row, 17)).Locked = 
True
Case 2
Range(Cells(Target.Row, 8), Cells(Target.Row, 17)).Locked = 
False
Range(Cells(Target.Row, 13), Cells(Target.Row, 17)).Locked = 
True
Case 3
Range(Cells(Target.Row, 8), Cells(Target.Row, 17)).Locked = 
False
Case Else
End Select
End If
End Sub 


Gruß Sepp
Anzeige
AW: Bedingung erfüllt - dann Zelle X,Y,Z Sperren..
07.01.2005 23:19:20
Jean-Pierre
Hallo Sepp,
Danke nochmals!
Ich bekomme bei Eingabe 1 in B31 (Spontan genommen) folgenden Fehler:
Laufzeitfehler '1004':
Die Locked-Eigenschaft des Range-Objektes kann nicht festgelegt werden.
Verweis im Debug auf Case 1...

Private Sub Workbook_BeforePrint(Cancel As Boolean)
ActiveSheet.PageSetup.PrintArea = "$A$1:$T" & Range("A65536").End(xlUp).Row
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("B1:B50")) Is Nothing Then
If Target.Count > 1 Then Exit Sub
Select Case Target
Case 1
--> Range(Cells(Target.Row, 8), Cells(Target.Row, 17)).Locked = True
Case 2
--> Range(Cells(Target.Row, 8), Cells(Target.Row, 17)).Locked = False
Range(Cells(Target.Row, 13), Cells(Target.Row, 17)).Locked = True
Case 3
--> Range(Cells(Target.Row, 8), Cells(Target.Row, 17)).Locked = False
Case Else
End Select
End If
End Sub

Die Zeile vom Debuggen hab ich mit --> markiert.
Gebe ich die Zahl 2 ein erscheint der Fehler erneut verweist im Debug auf Case 2
Und bei Eingabe der Zahl 3 das gleiche mit Debug Verweis auf Case 3.
Was ist da verkehrt bzw. falsch?
Gruß aus Berlin
Jean-Pierre
Anzeige
AW: Bedingung erfüllt - dann Zelle X,Y,Z Sperren..
07.01.2005 23:38:46
Josef
Hallo Jean-Pierre!
Ich hab' ja in meinem ersten Postig geschrieben, das du den
Blattschutz mit VBA setzen musst!

Sub schutz()
Sheets("DeineTabelle").Protect Password:="passwort", UserInterfaceOnly:=True
End Sub

Gruß Sepp
AW: Bedingung erfüllt - dann Zelle X,Y,Z Sperren..
07.01.2005 23:46:20
Jean-Pierre
Hallo Sepp,
hmmm, bin in VBA nicht so bewandert. :-((
Hab den Code jetzt so abgespeichert:

Private Sub Workbook_BeforePrint(Cancel As Boolean)
ActiveSheet.PageSetup.PrintArea = "$A$1:$T" & Range("A65536").End(xlUp).Row
Sub schutz()
Sheets("DeineTabelle").Protect Password:="passwort", UserInterfaceOnly:=True
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("B1:B50")) Is Nothing Then
If Target.Count > 1 Then Exit Sub
Select Case Target
Case 1
Range(Cells(Target.Row, 8), Cells(Target.Row, 17)).Locked = True
Case 2
Range(Cells(Target.Row, 8), Cells(Target.Row, 17)).Locked = False
Range(Cells(Target.Row, 13), Cells(Target.Row, 17)).Locked = True
Case 3
Range(Cells(Target.Row, 8), Cells(Target.Row, 17)).Locked = False
Case Else
End Select
End If
End Sub

Trotzdem kommt der Fehler wieder...
Gruß aus Berlin
Jean-Pierre
Anzeige
AW: Bedingung erfüllt - dann Zelle X,Y,Z Sperren..
08.01.2005 10:55:09
Josef
Hallo Jean-Pierre!
In die Tabelle gehört dieser Code:
(rechtsklick auf Blattregister &gt Code anzeigen &gt in's rechte Fenster kopieren!)


      
Option Explicit
Private Sub Workbook_BeforePrint(Cancel As Boolean)
ActiveSheet.PageSetup.PrintArea = "$A$1:$T" & Range("A65536").End(xlUp).Row
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("B1:B50")) Is Nothing Then
   
If Target.Count > 1 Then Exit Sub
      
Select Case Target
         
Case 1
            Range(Cells(Target.Row, 8), Cells(Target.Row, 17)).Locked = 
True
         
Case 2
            Range(Cells(Target.Row, 8), Cells(Target.Row, 17)).Locked = 
False
            Range(Cells(Target.Row, 13), Cells(Target.Row, 17)).Locked = 
True
         
Case 3
            Range(Cells(Target.Row, 8), Cells(Target.Row, 17)).Locked = 
False
         
Case Else
      
End Select
End If
End Sub 


In "DieseArbeitsmappe" gehört dieser Code:
(Doppelklick im VBA-Editor auf "DieseArbeitsmappe")


      
Option Explicit
Private Sub Workbook_Open()
'Tabellenname und Passwort anpassen!
   With Sheets("DeineTabelle")
      .Unprotect password:="passwort"
      .Protect password:="passwort", UserInterfaceOnly:=
True
   
End With
End Sub 


Datei speichern, schliessen und wieder öffnen.
Gruß Sepp
Anzeige
Korrektur!
08.01.2005 11:31:39
Josef
Hallo Jean-Pierre!
Das "Before_Print" gehört natürlich auch in "DieseArbeitsmappe" und nicht
in die Tabelle!


      
Option Explicit
Private Sub Workbook_Open()
'Tabellenname und Passwort anpassen!
   With Sheets("DeineTabelle")
      .Unprotect password:="passwort"
      .Protect password:="passwort", UserInterfaceOnly:=
True
   
End With
End Sub
Private Sub Workbook_BeforePrint(Cancel As Boolean)
ActiveSheet.PageSetup.PrintArea = "$A$1:$T" & Range("A65536").End(xlUp).Row
End Sub 


Gruß Sepp
Anzeige
o.T. - Herzlichen Dank!!!
08.01.2005 14:10:53
Jean-Pierre
Hallo Sepp,
herzlichen Dank auch für deine Geduld mit mir.
Schönes Wochenende und
Grüße aus Berlin
Jean-Pierre
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Zellen in Excel sperren, wenn eine Bedingung erfüllt ist


Schritt-für-Schritt-Anleitung

Um Zellen in Excel zu sperren, wenn eine bestimmte Bedingung erfüllt ist, kannst du VBA (Visual Basic for Applications) verwenden. Hier ist eine einfache Anleitung:

  1. VBA-Editor öffnen: Drücke ALT + F11, um den VBA-Editor zu öffnen.

  2. Das entsprechende Arbeitsblatt auswählen: Klicke im Projekt-Explorer auf das Arbeitsblatt, für das du die Zellen sperren möchtest.

  3. Code einfügen: Füge den folgenden Code in das Codefenster ein:

    Option Explicit
    
    Private Sub Worksheet_Change(ByVal Target As Range)
       If Not Intersect(Target, Range("B1:B50")) Is Nothing Then
           If Target.Count > 1 Then Exit Sub
           Select Case Target.Value
               Case 1
                   Range(Cells(Target.Row, 8), Cells(Target.Row, 17)).Locked = True
               Case 2
                   Range(Cells(Target.Row, 8), Cells(Target.Row, 17)).Locked = False
                   Range(Cells(Target.Row, 13), Cells(Target.Row, 17)).Locked = True
               Case 3
                   Range(Cells(Target.Row, 8), Cells(Target.Row, 17)).Locked = False
               Case Else
           End Select
       End If
    End Sub
  4. Blattschutz aktivieren: Um sicherzustellen, dass die Sperrung funktioniert, musst du das Blatt schützen. Füge diesen Code in das Modul "DieseArbeitsmappe" ein:

    Private Sub Workbook_Open()
       With Sheets("DeineTabelle")
           .Unprotect Password:="passwort"
           .Protect Password:="passwort", UserInterfaceOnly:=True
       End With
    End Sub
  5. Speichern und testen: Schließe den VBA-Editor, speichere die Datei als xlsm (Makro-fähige Arbeitsmappe) und teste die Funktionsweise.


Häufige Fehler und Lösungen

Fehler 1: Laufzeitfehler '1004'

  • Ursache: Du hast das Blatt nicht geschützt.
  • Lösung: Stelle sicher, dass der Blattschutz aktiviert ist, indem du den oben genannten Code verwendest.

Fehler 2: Zellen werden nicht gesperrt

  • Ursache: Event-Handler funktioniert nicht.
  • Lösung: Vergewissere dich, dass der Code im richtigen Arbeitsblatt-Modul eingefügt wurde.

Alternative Methoden

Wenn du keine VBA-Makros verwenden möchtest, kannst du auch die bedingte Formatierung nutzen, um Zellen auszugrauen. Dies ist jedoch keine echte Sperrung:

  1. Wähle die Zellen aus, die du formatieren möchtest.
  2. Gehe zu Start > Bedingte Formatierung > Neue Regel.
  3. Wähle Formel zur Ermittlung der zu formatierenden Zellen verwenden und gib eine Formel ein, die auf die Bedingung basiert (z.B. =$B1=1).
  4. Setze die Formatierung auf ausgrauen.

Praktische Beispiele

  • Wenn in Zelle B1 die Zahl 1 eingegeben wird, werden die Zellen H1 bis Q1 gesperrt.
  • Bei Eingabe von 2 werden die Zellen M1 bis Q1 gesperrt, während H1 bis Q1 entsperrt bleiben.

Diese Logik kann auf die Zeilen bis B50 und H50-Q50 erweitert werden, indem du die oben genannten Codes anpasst.


Tipps für Profis

  • Nutze die Funktion UserInterfaceOnly beim Schutz des Blattes, um sicherzustellen, dass der VBA-Code weiterhin funktioniert, auch wenn das Blatt geschützt ist.
  • Teste den Code immer in einer Kopie deiner Datei, um Fehler zu vermeiden.

FAQ: Häufige Fragen

1. Wie kann ich die Zellen sperren, wenn eine Bedingung erfüllt ist, ohne VBA zu verwenden? Du kannst die bedingte Formatierung verwenden, um Zellen visuell zu markieren, aber eine echte Sperrung erfordert VBA.

2. Funktioniert dieser Code in Excel 2016? Ja, der Code funktioniert in Excel 2016 sowie in neueren Versionen, die VBA unterstützen.

3. Was mache ich, wenn ich mehrere Bedingungen hinzufügen möchte? Erweitere einfach den Select Case-Block im Code, um zusätzliche Bedingungen zu berücksichtigen.

4. Wie kann ich den Blattschutz aufheben? Verwende den VBA-Befehl .Unprotect Password:="dein_passwort" im Code.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige