Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1024to1028
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

VBA-Problem Zellen Sperren

VBA-Problem Zellen Sperren
14.11.2008 14:12:00
Bruehmi
Hallo liebe Excel-Fan-Gemeinde!
Ich habe durch euch schon einige Probleme lösen können. Jedoch stehe ich im Moment vor einem Problem, auf das ich keine Antwort weiß.
Ich müsste per VBA Zellbereiche zum Einen dauerhaft sperren und zum Anderen einzelne Zellen in Abhängigkeit sperren.
Ich habe meine bisherige Excel-Datei mit Problemschilderung auf einen Webserver gelegt, da sie zu groß war um sie hier hochladen zu können.
Ich hoffe, dass mir jemand zumindest einen detallierten Ansatz geben kann. Kommunikation auch gerne per Email: bruehmi@gmail.com
Die Datei hat folgenden Pfad:
http://bruehmi.redio.de/EDV.xls
Ich hoffe inständig, dass mir jemand weiterhelfen kann!
Mit freundlichem Gruß
Daniel

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

Betreff
Datum
Anwender
Anzeige
AW: VBA-Problem Zellen Sperren
14.11.2008 17:23:50
fcs
Hallo daniel,
hier mal ein grober Ansatz. Das Makro müsstest du da dann im Anschluss deine Eintragungen und Formatierungen ausführen.
Falls du das ganze während der Eingabe von Daten ausführen willst, so dass nach jeder Eingabe die geänderten Zeilen aktualisiert werden, dann wird es komplizierter. Dann muss man ein Ereignis-makro einbauen, das auf zellwert-Änderungen reagiert. Außerdem muss du dann deine vorhandenen Makros anpassen, so dass während deren Ausführung die Ereignismakros deaktiviert sind.
Gruß
Franz

Sub ZeilenPruefen()
Dim Zeile As Long, wksSL As Worksheet, arrSperren As Variant
Dim Spalte As Long, SpalteSperr As Long
Dim bolSperren As Boolean
Const Zeile1 As Long = 21 '1. Datenzeile
Set wksSL = Worksheets("Stahlliste")
With wksSL
'Zeilen ab Zeile 21 bis zur letzten Positionsnummer in Spalte B abarbeiten
For Zeile = Zeile1 To .Cells(.Rows.Count, 2).End(xlUp).Row
'Prüfen, ob Werte in Spalte E >0
If .Cells(Zeile, 5).Value > 0 Then
'Prüfen der Werte Spalte J und setzen des Arrays mit den zu sperrenden Spalten
Select Case .Cells(Zeile, 10).Value
Case 0
arrSperren = Array(2, 3, 4, 5, 18) 'b, c, d, e und R
Case 11, 15
arrSperren = Array(3, 4, 5, 18) 'c, d, e und R
Case 13, 21, 25, 26
arrSperren = Array(4, 5, 18) 'd, e und R
Case 31
arrSperren = Array(5, 18) 'e und R
Case 33
arrSperren = Array(4, 5) 'd, e
Case 41, 44
arrSperren = Array(18) 'd, e und R
Case 46
arrSperren = Array(4, 18) 'd, e und R
Case Else
arrSperren = Array(999) 'nichts sperren
End Select
.Unprotect
For Spalte = 1 To 21
Select Case Spalte
Case 5, 8 To 9, 20
'do nothing Spalten sind permanent geschützt
Case 2, 3, 4, 5, 18, 999 '999 ist ein DummyWert, dass keine Spalten gesperrt werden
'diese sind die ggf. zu sperrenden Spalten
bolSperren = False
'Spaltennummer mit den zu sperrenden Spalten vergleichen
For SpalteSperr = LBound(arrSperren) To UBound(arrSperren)
If Spalte = arrSperren(SpalteSperr) Then
bolSperren = True
Exit For
End If
Next
If bolSperren = True Then
.Cells(Zeile, Spalte).Locked = True
Else
.Cells(Zeile, Spalte).Locked = False
End If
Case Else
'alle übrigen Eingabespalten
'do nothing
End Select
Next
.Protect
End If
Next
End With
End Sub


Anzeige
AW: VBA-Problem Zellen Sperren
17.11.2008 13:00:00
Bruehmi
Hallo Franz,
vielen Dank für deine Antwort! Vor allem Danke für die genaue Anpassung an meine Problemstellung.
Ich werde heute Nachmittag versuchen deinen Code zu implementieren.
Gruß
Daniel
AW: VBA-Problem Zellen Sperren
17.11.2008 22:49:00
Bruehmi
Ich habe den Code soweit ich wusste an meine Tabelle angepasst.
Wann er ausgeführt wird, scheint momentan nebensächlich, da er egal, welche Daten eingepflegt werden, immer die Spalten A - U ab Zeile 21 sperrt. Das ist aber leider nicht Sinn der Sache.
Außerdem müsste doch auch irgendwo der Blattschutz aktiviert werden...

Private Sub ZeilenPruefen()
Dim Zeile As Long, wksSL As Worksheet, arrSperren As Variant
Dim Spalte As Long, SpalteSperr As Long
Dim bolSperren As Boolean
Const Zeile1 As Long = 21 '1. Datenzeile
Anz = Range("E7").Value + 20
Set wksSL = Worksheets("Stahlliste")
With wksSL
'Zeilen ab Zeile 21 bis zur letzten Positionsnummer in Spalte B abarbeiten
For Zeile = Zeile1 To .Cells(.Rows.Count, 2).End(xlUp).Row
'Prüfen, ob Werte in Spalte E >0
If .Cells(Zeile, 5).Value > 0 Then
'Prüfen der Werte Spalte J und setzen des Arrays mit den zu sperrenden Spalten
Select Case .Cells(Zeile, 10).Value
Case 0
arrSperren = Array(14, 15, 16, 17, 18) 'b, c, d, e und R
Case 11, 15
arrSperren = Array(15, 16, 17, 18) 'c, d, e und R
Case 12
arrSperren = Array(15, 16, 17) 'c, d und e
Case 13, 21, 25, 26
arrSperren = Array(16, 17, 18) 'd, e und R
Case 31
arrSperren = Array(17, 18) 'e und R
Case 33
arrSperren = Array(16, 17) 'd, e
Case 41, 44
arrSperren = Array(18) 'R
Case 46
arrSperren = Array(16, 18) 'd und R
Case Else
arrSperren = Array(999) 'nichts sperren
End Select
.Unprotect
For Spalte = 21 To Anz
Select Case Spalte
Case 5, 8 To 9, 20
'do nothing Spalten sind permanent geschützt
Case 14, 15, 16, 17, 18, 999 '999 ist ein DummyWert, dass keine Spalten gesperrt  _
werden
'diese sind die ggf. zu sperrenden Spalten
bolSperren = False
'Spaltennummer mit den zu sperrenden Spalten vergleichen
For SpalteSperr = LBound(arrSperren) To UBound(arrSperren)
If Spalte = arrSperren(SpalteSperr) Then
bolSperren = True
Exit For
End If
Next
If bolSperren = True Then
.Cells(Zeile, Spalte).Locked = True
Else
.Cells(Zeile, Spalte).Locked = False
End If
Case Else
'alle übrigen Eingabespalten
'do nothing
End Select
Next
.Protect
End If
Next
End With
End Sub


Die Datei auf dem Webspace hab ich aktualisiert.
Gruß
Daniel

Anzeige
AW: VBA-Problem Zellen Sperren
18.11.2008 10:55:06
fcs
Hallo Daniel,
mit den folgenden Anpassungen sollte es funktionieren.
Der Blattschutz Aus/Ein war schon in der Prozedur eingebaut.
Gruß
Franz

Private Sub ZeilenPruefen()
Dim Zeile As Long, wksSL As Worksheet, arrSperren As Variant
Dim Spalte As Long, SpalteSperr As Long, Anz As Long
Dim bolSperren As Boolean
Const Zeile1 As Long = 21 '1. Datenzeile
Set wksSL = Worksheets("Stahlliste")
With wksSL
Anz = wksSL.Range("E7").Value + 20 '=letzte zeile mit Positionsnummer
'Zeilen ab Zeile 21 bis zur letzten Positionsnummer abarbeiten
For Zeile = Zeile1 To Anz
'Prüfen, ob Werte in Spalte E >0
If .Cells(Zeile, 5).Value > 0 Then
'Prüfen der Werte Spalte J und setzen des Arrays mit den zu sperrenden Spalten
Select Case .Cells(Zeile, 10).Value
Case 0
arrSperren = Array(14, 15, 16, 17, 18) 'b, c, d, e und R
Case 11, 15
arrSperren = Array(15, 16, 17, 18) 'c, d, e und R
Case 12
arrSperren = Array(15, 16, 17) 'c, d und e
Case 13, 21, 25, 26
arrSperren = Array(16, 17, 18) 'd, e und R
Case 31
arrSperren = Array(17, 18) 'e und R
Case 33
arrSperren = Array(16, 17) 'd, e
Case 41, 44
arrSperren = Array(18) 'R
Case 46
arrSperren = Array(16, 18) 'd und R
Case Else
arrSperren = Array(999) 'nichts sperren
End Select
.Unprotect 'Blattschutz aufheben
For Spalte = 1 To 21 'Spalte A bis U ggf. sperren gemaß oben ermitteltem Array
Select Case Spalte
Case 5, 8 To 9, 20
'Spalten sind permanent geschützt
.Cells(Zeile, Spalte).Locked = True
Case 14, 15, 16, 17, 18, 999 '999 ist DummyWert, dass keine Spalten gesperrt werden
'diese sind die ggf. zu sperrenden Spalten
bolSperren = False
'Spaltennummer mit den zu sperrenden Spalten vergleichen
For SpalteSperr = LBound(arrSperren) To UBound(arrSperren)
If Spalte = arrSperren(SpalteSperr) Then
bolSperren = True
Exit For
End If
Next
If bolSperren = True Then
.Cells(Zeile, Spalte).Locked = True
Else
.Cells(Zeile, Spalte).Locked = False
End If
Case Else
'alle übrigen Eingabespalten nicht sperren
.Cells(Zeile, Spalte).Locked = False
End Select
Next
.Protect 'Blattschutz setzen
End If
Next
End With
End Sub


Anzeige
AW: VBA-Problem Zellen Sperren
18.11.2008 11:05:00
Bruehmi
Danke Franz, werde den Code heute mittag testen, da ich hier kein Excel zur Verfügung habe.
Jetzt kommt noch die Frage, wo ich das ganze einbauen soll. Wenn ich das richtig sehe, muss ich die Prozedur aufrufen, sobald in Zelle J21+x eine Eingabe gemacht wird.
Der Code sperrt ja nur, wenn ich in J21+x einen Wert habe. Normalerweise schreibt man die Zeilen von links nach rechts erst fertig, bevor man (in meinem Fall) auf den Button Berechnen geht. Ich müsste doch aber erst alle Werte in J21-J21+x haben, dass dann in den zu sperrenden Zellen keine Eingabe erfolgen kann, richtig?
Gruß
Daniel
Anzeige
AW: VBA-Problem Zellen Sperren
18.11.2008 12:15:31
fcs
Hallo Daniel,
ich musste die Prozedur nochmals anpassen, damit Sperren von Zellen aufgehoben werden, wenn Wert in Spalte E Damit die Prozeduren im Verbund funktionieren muss du in den Prozeduren, die per Button gestartet werden noche den Blattschutz aufheben bzw. setzen.
Die Prozeduren, in denen du die Prozedur "ZeilenPruefen" aufrufst scheinen OK zu sein.
Gruß
Franz

Private Sub ZeilenPruefen()
Dim Zeile As Long, wksSL As Worksheet, arrSperren As Variant
Dim Spalte As Long, SpalteSperr As Long, Anz As Long
Dim bolSperren As Boolean
Const Zeile1 As Long = 21 '1. Datenzeile
Set wksSL = Worksheets("Stahlliste")
With wksSL
Anz = .Range("E7").Value + 20 '=letzte zeile mit Positionsnummer
'Zeilen ab Zeile 21 bis zur letzten Positionsnummer abarbeiten
.Unprotect 'Blattschutz aufheben
For Zeile = Zeile1 To Anz
'Prüfen, ob Werte in Spalte E >0
If .Cells(Zeile, 5).Value > 0 Then
'Prüfen der Werte Spalte J und setzen des Arrays mit den zu sperrenden Spalten
Select Case .Cells(Zeile, 10).Value
Case 0
arrSperren = Array(14, 15, 16, 17, 18) 'b, c, d, e und R
Case 11, 15
arrSperren = Array(15, 16, 17, 18) 'c, d, e und R
Case 12
arrSperren = Array(15, 16, 17) 'c, d und e
Case 13, 21, 25, 26
arrSperren = Array(16, 17, 18) 'd, e und R
Case 31
arrSperren = Array(17, 18) 'e und R
Case 33
arrSperren = Array(16, 17) 'd, e
Case 41, 44
arrSperren = Array(18) 'R
Case 46
arrSperren = Array(16, 18) 'd und R
Case Else
arrSperren = Array(999) 'nichts sperren
End Select
For Spalte = 1 To 21 'Spalte A bis U ggf. sperren gemaß oben ermitteltem Array
Select Case Spalte
Case 5, 8 To 9, 20
'Spalten sind permanent geschützt
.Cells(Zeile, Spalte).Locked = True
Case 14, 15, 16, 17, 18, 999 '999 ist DummyWert, dass keine Spalten gesperrt werden
'diese sind die ggf. zu sperrenden Spalten
bolSperren = False
'Spaltennummer mit den zu sperrenden Spalten vergleichen
For SpalteSperr = LBound(arrSperren) To UBound(arrSperren)
If Spalte = arrSperren(SpalteSperr) Then
bolSperren = True
Exit For
End If
Next
If bolSperren = True Then
.Cells(Zeile, Spalte).Locked = True
Else
.Cells(Zeile, Spalte).Locked = False
End If
Case Else
'alle übrigen Eingabespalten nicht sperren
.Cells(Zeile, Spalte).Locked = False
End Select
Next
Else
For Spalte = 1 To 21 'Spalte A bis U entsperren bis auf Formelspalten
Select Case Spalte
Case 5, 8 To 9, 20
'Spalten sind permanent geschützt
.Cells(Zeile, Spalte).Locked = True
Case Else
'alle übrigen Eingabespalten nicht sperren
.Cells(Zeile, Spalte).Locked = False
End Select
Next
End If
Next
.Protect 'Blattschutz setzen
End With
End Sub
Private Sub Positionen_generieren()
Dim i As Integer
Worksheets("Stahlliste").Unprotect
Call ZeilenSpalten_generieren
Range("A16:U20").Select
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With
Call Spalten_mit_Formeln_formatieren
'Call Formelzellen_sperren
Worksheets("Stahlliste").Protect
Call ZeilenPruefen
Call Eingabeaufforderung
End Sub
Sub Berechnen()
Dim Anz, k, Ergebnis As Double
Application.ScreenUpdating = False
Worksheets("Stahlliste").Unprotect
Call Berechnen_Spalte_E
Call Berechnen_Spalte_H
Call Berechnen_Spalte_I
Call Berechnen_Spalte_T
Worksheets("Stahlliste").Protect
Application.ScreenUpdating = True
Call ZeilenPruefen
End Sub


Anzeige
AW: VBA-Problem Zellen Sperren
18.11.2008 15:07:21
Bruehmi
Vielen Dank Franz, die Spalten werden jetzt richtig gesperrt!
Leider passt das mit der bedingten Sperrung der einzelnen Zellen noch nicht.
Den Code meiner beiden Mosule hab ich hochgeladen.
Ich habe mir gedacht, dass ich folgendes ins Worksheet direkt schreiben könnte:

Private Sub Worksheet_Change(ByVal Target As Range)
Anz, k As integer
Anz = Range("E7").Value + 20
For k = 21 To Anz
If Target.Address = "Range("J" & k)" And Target = 0 Then
ActiveSheet.Unprotect
Range("N" & k).Select
Range("O" & k).Select
Range("P" & k).Select
Range("Q" & k).Select
Range("R" & k).Select
Selection.Locked = True
Selection.FormulaHidden = False
ActiveSheet.Protect
End If
If Target.Address = "Range("J" & k)" And Target = 11 Or 15 Then
ActiveSheet.Unprotect
Range("O" & k).Select
Range("P" & k).Select
Range("Q" & k).Select
Range("R" & k).Select
Selection.Locked = True
Selection.FormulaHidden = False
ActiveSheet.Protect
End If
Next k
End Sub


Scheinbar funktioniert das so nicht... weißt du, was ich ändern müsste?
https://www.herber.de/bbs/user/56893.txt
https://www.herber.de/bbs/user/56894.txt

Anzeige
AW: VBA-Problem Zellen Sperren
18.11.2008 18:28:00
fcs
Hallo Daniel,
ich verstehe aus dem Code nicht was du überhaupt erreichen willst.
Bei Eingabe in welche Zelle(n) soll das Makro Aktionen ausführen und welche?
Generell solltest du außer bei Aktionen für einzelne Zellen mit Cells statt mit Range für die Zelle-Adressierung in VBA-Code arbeiten. Die Programmierung ist so wesentlich einfacher.
Für Einzelzellen
Cells(Zeile, Spalte)
für Bereiche:
Range(Cells(Zeile1, Spalte1), Cells(Zeile2, Spalte2))
Das ist deutlich einfacher, als wenn man versucht
Range("A" & Zeile)
oder
Range("A" & Zeile1 & ":K" & Zeile2)
In der Programmierung umzusetzen. Außerdem ist Cells etwas Schneller als Range in der Ausführung.
Generelles Problem, wenn du das Ereignismakro in deine Blätter integrierst:
Du muss in den anderen Haupt-Prozeduren die Ausführung von Ereignismakros deaktivieren, sonst laufen die Makros ggf. lang oder auch in eine Einlosschleife weil bei jeder Werteingaeb in die Zellen das Ereignismakro erneut gestartet wird.
Am Beginn der Prozeduren
Application.EnableEvents=False
Am Ende der Prozeduren
Application.EnableEvents=True
Gruß
Franz
Anzeige
AW: VBA-Problem Zellen Sperren
18.11.2008 20:18:07
Bruehmi
Hmmm... ich werd mir bis morgen darüber Gedanken machen!
Übrigens habe ich herausgefunden, dass die Case-Fälle, die du für die Zellen hinter J21-J21+x geschrieben hast doch funktionieren. (a,b,c,d,e,R)
Ich hab als Beispiel mal ein paar Stabformen 0,11,13,15... eingegeben und die jeweiligen Zellen wurden gesperrt. Allerdings erst nachdem ich schon etwas in die Zellen geschrieben habe. D.h sie werden erst nach Eingabe gesperrt und leider nicht schon vorher. Hast du dafür vielleicht noch eine Änderungsidee?
Immerhin macht das Sperren von Zellen ja nur Sinn, wenn sie vor einer Eingabe gesperrt werden...
Gruß
Daniel
Anzeige
AW: VBA-Problem Zellen Sperren
19.11.2008 12:51:40
fcs
Hallo Daniel,
Excel muss ja Kriterien haben an Hand derer es bestimmte Aktionen ausführen soll.
Du muss jetzt also deine Strategie beim Anlegen der Stabzeilen und bei der Eingabe von Werten anpassen.
Wenn mit Positionen generieren die Tabelle ab Zeile 21 neu formatiert wird, dann dürfen am Ende nur die Zellen (bzw. Spalten) nicht gesperrt sein, in die für jedes Bauteil Eingaben gemacht werden müssen/dürfen.
Mit Fortschritt der Eingaben, speziell der Stabform in Spalte J werden dann weitere Zellen entsperrt.
Ich hab dir mal die Makros in der Datei angepasst/erstellt, die die Eingaben im Blatt überwachen und die ZeilePruefen_Prozedur angepasst. Dabei werden die Zellen in die zurZeit keine Eingaben gemacht werden können etwas heller formatiert.
https://www.herber.de/bbs/user/56936.xls
Gruß
Franz
Anzeige
AW: VBA-Problem Zellen Sperren
19.11.2008 13:15:24
Bruehmi
Echt Klasse Franz, vielen vielen Dank!!!
Hab's auch schon ausprobiert und es klappt wunderbar.
Kann ich mich bei dir irgendwie erkenntlich zeigen? Alleine hätte ich das nie geschafft!

232 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige