Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
884to888
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
884to888
884to888
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Die Locked Eigenschaft kann nicht festgelegt werde

Die Locked Eigenschaft kann nicht festgelegt werde
10.07.2007 09:24:27
Salim

Hallo zusammen,
Franz hat mir geholfen folgendes Codes zur entwickeln.
Sub Speichern()
Dim wks As Worksheet, wbThis As Workbook, wbSave As Workbook
Dim rng As Range
Set wbThis = ThisWorkbook
With wbThis.Worksheets("Tabelle1")
strDateiname = ThisWorkbook.Path & "\" & .Range(" J4") & "_" & .Range("R8") & "_" & _
.Range("R6") & "_" & "Backup" & "_" & Format(Date, "YYYYMMDD") & ".xls"
End With
wbThis.SaveCopyAs strDateiname
Set wbSave = Workbooks.Open(FileName:=strDateiname)
wbSave.Unprotect
For Each wks In wbSave.Worksheets
wks.Unprotect
For Each rng In wks.UsedRange.Cells
If Not IsEmpty(rng) Then rng.Locked = True
Next rng
wks.Protect
Next wks
wbSave.Protect
wbSave.Close savechanges:=True
End Sub


Es funktioniert.
Ich habe es etwas abgeändert, um den Code in meiner Arbeitsmappe einzufügen.
Jetzt kommt die Fehlermeldung: Die Locked Eigenschaft des Range-Objektes kann nicht festgelegt werden. Beim Debuggen wird die Zeile: rng.Locked = True gelb markiert.


Private Sub CommandButton1_Click()
Me.Hide
Dim wks As Worksheet, wbThis As Workbook, wbSave As Workbook
Dim rng As Range
Set wbThis = ThisWorkbook
With wbThis.Worksheets("Abrechnungsblatt")
strDateiname = ThisWorkbook.Path & "\" & .Range(" J4") & "_" & .Range("R8") & "_" & _
.Range("R6") & "_" & "Backup" & "_" & Format(Date, "YYYYMMDD") & ".xls"
End With
wbThis.SaveCopyAs strDateiname
Set wbSave = Workbooks.Open(Filename:=strDateiname)
wbSave.Unprotect
For Each wks In wbSave.Worksheets
wks.Unprotect
For Each rng In wks.UsedRange.Cells
If Not IsEmpty(rng) Then rng.Locked = True
Next rng
wks.Protect
Next wks
wbSave.Protect
wbSave.Close savechanges:=True
End Sub


Kann das jemand nachvollziehen? wäre für einen Feedback dankbar ;)
Danke und Gruss
Salim

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Die Locked Eigenschaft kann nicht festgelegt werde
10.07.2007 11:02:27
Wolli
Ich kann's nicht nachvollziehen. 1.) Wenn das Makro stoppt, tippe im Direktbereich (Strg+G) "Debug.Print rng.address", dann siehst Du, welche Zelle das Makro gerade bearbeiten will. 2.) Versuche, diese Zelle händisch zu sperren. Vielleicht kommst Du so auf den Fehler. Gruß, Wolli

AW: Die Locked Eigenschaft kann nicht festgelegt werde
10.07.2007 16:17:00
Salim
Danke für dein Feedback!!!
Gruss
Salim

AW: Die Locked Eigenschaft kann nicht festgelegt werde
10.07.2007 16:35:00
Salim
Hallo,
könntest du mir bitte kurz in Einzelschritte erklären wie das geht? habe mit Direktbereich noch nicht gearbeitet und kommemit der Online Suche nicht weiter....
Danke
Gruss
Salim

AW: Die Locked Eigenschaft kann nicht festgelegt werde
10.07.2007 17:07:00
Wolli
Wenn Du im Codefenster stehst, tippst Du Strg+G (oder Ansicht - Direktfenster). Wenn Du in diesem Fenster z.B. "Debug.print a" eingibst, wird dieser Befehl sofort nach dem drücken von "Enter" ausgeführt: Der Inhalt der Variablen "a" wird im Direktfenster angezeigt. Du kannst quasi jeden Programmbefehl, der für sich alleine stehen kann, dort ausführen, z.B. auch Range("A1:B10").select, dann werden im Tabellenblatt die Zellen markiert. Nur Schleifen und so geht nicht. Ist halt ein Direktbereich.
Wenn das Makro mit Fehler anhält, gehst Du auf "Debuggen". Dann ist die "falsche" Zeile gelb, aber das Programm ist noch nicht beendet. In diesem Zustand kannst Du also die Variableninhalte überprüfen (teilweise reicht es, im Programmcode mit der Maus über die Variable zu fahren) und andere Schweinereien machen, du kannst sogar in Grenzen noch den Programmcode modifizieren.
Um ein Programm in Einzelschritten ablaufen zu lassen, gehst Du in den Programmcode und drückst F8 (oder Debuggen - Einzelschritt). Mit jedem F8 wird der nächste Schritt ausgeführt und Du kannst sofort in der Tabelle nachsehen, was sich getan hat. Mit F9 setzt/löschst Du einen Haltepunkt (braune Markierung). Mit F5 läuft das Programm dann bis zum nächsten Haltepunkt bzw. bis zum Ende durch.
Viel Spaß! Wolli

Anzeige
AW: Die Locked Eigenschaft kann nicht festgelegt werde
10.07.2007 17:18:47
Salim
Ich werde es gleich ausprobieren! Vielen Dank für die lange Ausführung ;)
Übrigens, ich habe festgestellt, dass das löschen der Inhalte eines bestimmten Blattes dazu führt, dass der Makro fehlerfrei durchläuft!?
Danke
Gruss

AW: Die Locked Eigenschaft kann nicht festgelegt werde
10.07.2007 17:38:00
Wolli
Na, dann wird der Fehler wohl in diesem Blatt liegen :-) Vielleicht ist da noch was geschützt oder ein Passwort gesetzt oder so. Gruß + bis morgen, Wolli

AW: Die Locked Eigenschaft kann nicht festgelegt werde
10.07.2007 17:51:39
Salim
Hallo Wolli,
vielen Dank für die Unterstützung.;))))))))))))))
Über den Direktbereich habe ich herausgefunden welche Zelle betroffen war. Komischerweise war eine einfache Formel drin + mehrere Zellen verbunden. Irgendwie hat es den Lauf gestört.
Jetzt ist es ja so, dass alle Zellen darauf geprüft werden ob ein Inhalt vorhanden ist und dann wird gesperrt oder auch nicht. Wenn ich diesen Makro ausführe, gibt es ein flakerndes Bildschirm und es dauert ein bisschen. Jetzt die Frage: Würde mann den Aufwand reduzieren, wenn mann ein Bereich definieren würde Bsp. a1:x1000 der auf alle Tabellenblätter gesperrt (unabhängig von ursprünglichen Inhalt und Sperrung)? Wie würde so ein Befehl den aussehen? Herzlichen Dank nochmals.
Gruss
Salim

Anzeige
AW: Die Locked Eigenschaft kann nicht festgelegt w
10.07.2007 21:45:00
Wolli
1.) Na klar. Du prüfst und sperrst Zelle für Zelle. Wenn mehrere verbunden sind, kann Excel sie nicht einzeln ändern.
2.) Gegen das Flackern hilft:
am Programmanfang: Application.ScreenUpdation = False
am Programmende: Application.ScreenUpdation = True
3.) Wenn Dir der Inhalt eh egal ist, kannst Du natürlich einfach

For Each wks In wbSave.Worksheets
wks.Unprotect
Range("A1:X1000").Locked = true
wks.Protect
Next wks


oder für alle Zellen im Arbeitsblatt


For Each wks In wbSave.Worksheets
wks.Unprotect
Cells.Locked = true
wks.Protect
Next wks


machen. Gruß, Wolli

Anzeige
Heißt natürlich Application.ScreenUpdating (owT)
11.07.2007 10:12:42
Wolli

AW: Heißt natürlich Application.ScreenUpdating (owT)
11.07.2007 10:23:41
Salim
Guten Morgen Wolli,
irgenwie packe ich es nicht ;((((
Folgendes Code funktioniert:

Private Sub CommandButton1_Click()
Me.Hide
Inp = InputBox("Geben Sie das Passwort ein", "")
If Inp  "" Then
MsgBox "Falsches Passswort"
Exit Sub
End If
Dim wks As Worksheet, wbThis As Workbook, wbSave As Workbook
Dim rng As Range
Set wbThis = ThisWorkbook
With wbThis.Worksheets("Abrechnungsblatt")
strDateiname = ThisWorkbook.Path & "\" & .Range(" J4") & "_" & .Range("R8") & "_" & _
.Range("R6") & "_" & "Backup" & "_" & Format(Date, "YYYYMMDD") & ".xls"
End With
Application.ScreenUpdating = False
starttime = Time
wbThis.SaveCopyAs strDateiname
Set wbSave = Workbooks.Open(Filename:=strDateiname)
wbSave.Unprotect
For Each wks In wbSave.Worksheets
wks.Unprotect
For Each rng In wks.UsedRange.Cells
If Not IsEmpty(rng) Then rng.Locked = True
Next rng
wks.Protect
Next wks
wbSave.Protect
wbSave.Close savechanges:=True
stoptime = Time
elapsedtime = (stoptime - starttime) * 24 * 60 * 60
Application.ScreenUpdating = True
MsgBox "Ablaufzeit: " & Format(elapsedtime, "0") & " sec."
End Sub


Ich habe versucht deine Vorschläge im Code einzubauen:
1/ Cells.Locked = True : Fehlermeldung: Locked Eigenschaft konnte nicht festgelegt werden. Über debug.print cell.adress kamm keine Rückmeldung.
2/ Der Versuch: Die Zellen zu selektieren, kopieren und mit Werte ersetzten funktioniert auch nicht: Fehlermeldung: Zellen schreibgeschützt, obwohl wks.unprotect am Anfang steht?
Kannst du mich bitte nochmal unterstützen? vielen Dank ;)
So habe ich es versucht....


Private Sub CommandButton1_Click()
Me.Hide
Inp = InputBox("Geben Sie das Passwort ein", "")
If Inp  "" Then
MsgBox "Falsches Passswort"
Exit Sub
End If
Dim wks As Worksheet, wbThis As Workbook, wbSave As Workbook
Dim rng As Range
Set wbThis = ThisWorkbook
With wbThis.Worksheets("Abrechnungsblatt")
strDateiname = ThisWorkbook.Path & "\" & .Range(" J4") & "_" & .Range("R8") & "_" & _
.Range("R6") & "_" & "Backup" & "_" & Format(Date, "YYYYMMDD") & ".xls"
End With
Application.ScreenUpdating = False
starttime = Time
wbThis.SaveCopyAs strDateiname
Set wbSave = Workbooks.Open(Filename:=strDateiname)
wbSave.Unprotect
For Each wks In wbSave.Worksheets
wks.Unprotect
      Cells.select
Selection.copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Cells.locked = True
wks.Protect
Next wks
wbSave.Protect
wbSave.Close savechanges:=True
stoptime = Time
elapsedtime = (stoptime - starttime) * 24 * 60 * 60
Application.ScreenUpdating = True
MsgBox "Ablaufzeit: " & Format(elapsedtime, "0") & " sec."
End Sub


Anzeige
AW: Heißt natürlich Application.ScreenUpdating (owT)
11.07.2007 13:15:00
Wolli
So?

Private Sub CommandButton1_Click()
Me.Hide
Inp = InputBox("Geben Sie das Passwort ein", "")
If Inp  "" Then
MsgBox "Falsches Passswort"
Exit Sub
End If
Dim wks As Worksheet, wbThis As Workbook, wbSave As Workbook
Dim rng As Range
Set wbThis = ThisWorkbook
With wbThis.Worksheets("Abrechnungsblatt")
strDateiname = ThisWorkbook.Path & "\" & .Range(" J4") & "_" & .Range("R8") & "_" & _
.Range("R6") & "_" & "Backup" & "_" & Format(Date, "YYYYMMDD") & ".xls"
End With
Application.ScreenUpdating = False
starttime = Time
wbThis.SaveCopyAs strDateiname
Set wbSave = Workbooks.Open(Filename:=strDateiname)
wbSave.Unprotect
For Each wks In wbSave.Worksheets
wks.Unprotect
wks.Cells.Copy
wks.Cells.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
wks.Cells.Locked = True
wks.Protect
Next wks
wbSave.Protect
wbSave.Close savechanges:=True
stoptime = Time
elapsedtime = (stoptime - starttime) * 24 * 60 * 60
Application.ScreenUpdating = True
MsgBox "Ablaufzeit: " & Format(elapsedtime, "0") & " sec."
End Sub


Anzeige
AW: Heißt natürlich Application.ScreenUpdating (owT)
11.07.2007 13:41:39
Salim
Hallo Wolli,
funktioniert super! habe nicht gewusst, dass man die Zellen jedesmal dem wks zuordnen muss. Der Makro läuft viel schneller durch (6 sec. statt 25 sec.). Vielen Dank dafür.
Eine komische Sache habe ich noch:
Wenn ich folgendes Makro aktiviere:

Private Sub Workbook_open()
Application.ScreenUpdating = False
Worksheets("RSPLAN").ScrollArea = "A1:P552"
Worksheets("RSIST").ScrollArea = "A1:R552"
Worksheets("ZEIST").ScrollArea = "A1:N552"
Worksheets("Eingabeblätter").ScrollArea = "A1:B2"
ActiveWindow.DisplayHeadings = False
Application.CommandBars(1).Controls("Datei").Controls(5).Enabled = True
Application.ScreenUpdating = True
End Sub


Dann flackert der Bildschirm bei der Auslösung des Makros was du mir gerade zugeschickt hast?
Was bewirkt eigentlich Screen.updating = True?
Gruss
Salim

Anzeige
AW: Heißt natürlich Application.ScreenUpdating (owT)
12.07.2007 09:30:00
Wolli
Schau mal in Dein Englisch-Wörterbuch! Scr.upd = false heißt, dass der Bildschirminhalt "eingefroren" wird, solange das Makro läuft. Durch true wird er am Ende wieder freigegeben. Verhindert Flackern und Irritation des Anwenders. Gruß, Wolli

AW: Heißt natürlich Application.ScreenUpdating (owT)
12.07.2007 11:40:31
Salim
Danke!!!
Gruss
Salim
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige
Archiv - Verwandte Themen
Forumthread
Beiträge