![]() |
Betrifft: Autom. Zeilenhöhe verbundene Zelle mit Blattschutz
von: Chris
Geschrieben am: 25.09.2014 10:34:53
Hallo,
hab noch ein "kleines" Problem das ich leider nicht lösen kann.
Ich habe den Code aus folgendem Beitrag https://www.herber.de/mailing/Zeilenhoehe_bei_verbundenen_Zellen_anpassen.htm
in ein Tabellenblatt kopiert und er funktioniert auch erst mal super.
Musterdatei habe ich angehängt, PW ist 1234.
Das Problem ist, daß das Arbeitsblatt geschützt ist und auch bleiben muss. Mittlerweile habe ich auch die Parameter beim Schutz so gesetzt, daß kein Laufzeitfehler mehr kommt.
Das Problem ist jetzt noch Folgendes, was ich mir nicht erklären kann:
Nach Eingabe des Textes z.B. in Zelle C17 mit einem 2-Zeilen langen Text und dann Drücken auf Enter paßt sich zwar die Zeilenhöhe automatisch an, aber die Zelle wird auf geschützt gesetzt und ich kann sie nicht mehr anwählen.
Wenn ich den Blattschutz aufhebe und auf Eigenschaften gehen, dann ist unter Schutz gesperrt angekreuzt, obwohl vorher der Haken nicht da war.
Hat da einer von euch eine Lösung?
Danke schon mal vorab.
Linkl zur Datei: https://www.herber.de/bbs/user/92801.xlsm
![]() ![]() |
Betrifft: Damit man das wirklich testen kann, solltest ...
von: Luc:-?
Geschrieben am: 25.09.2014 12:38:05
…du wenigstens das PW mitteilen, Chris,
wenn du schon eines verwendet hast (statt es leer zu lassen). So kann man deine Feststellung nur bestätigen, denn das Einfügen von CurrCell.Locked = False nutzt so nichts, da der Befehl nicht akzeptiert wird.
Hast du auch wirklich an geeigneter Stelle Me.Protect "passwort", True, True, True, True (für UserInterfaceOnly) angegeben? Ggf muss die VerbundZelle auch zuvor aufgehoben wdn (s. dazu auch dieses!).
Gruß, Luc :-?
Besser informiert mit …
![]() ![]() |
Betrifft: AW: Damit man das wirklich testen kann, solltest ...
von: Chris
Geschrieben am: 25.09.2014 13:02:03
Hallo Luc,
Danke für deine Antwort.
Das PW habe ich im Post angegeben - 1234.
Leider bin ich des VBA nicht so mächtig, deshalb hatte ich versucht es ohne VBA hinzukriegen.
Aber auch mit einer Hilfszelle, die den Inhalt der eigentlichen Zelle hat (wie es im Internet oft als 1. Möglichkeit empfohlen wird) hat nicht funktioniert.
Es klappt auch wirklich hervorragend bis eben auf die Sperrung der Zelle. Kann man das nicht unterbinden?
Gruß, Chris
![]() ![]() |
Betrifft: Hatte ich tatsächlich übersehen, ...
von: Luc:-?
Geschrieben am: 25.09.2014 13:41:20
…Chris,
1234 war wohl nicht auffällig genug… ;-)
So, jetzt klappt auch die Ergänzung → vor Application.ScreenUpdating = True einfach noch .Locked = False einfügen! Wenn du nun zum Ereignis Worksheet_Activate auch die bereits genannte CodeZeile angelegt hast, klappt das auch. Evtl musst du diese Prozedur auch noch vom Workbook_Open-Ereignis aus aufrufen (falls das betreffende Blatt StartBlatt ist) bzw explizit dieses Blatt aktivieren, damit der PW-Schutz mit allen Optionen ausgeführt wird.
Habe allerdings festgestellt, dass die Herber-Prozedur auf VerbundZellen nicht aufkopier-tolerant ist. Sie läuft dabei in einen nicht abgefangenen Fehler!
Luc :-?
![]() ![]() |
Betrifft: AW: Hatte ich tatsächlich übersehen, ...
von: Chris
Geschrieben am: 25.09.2014 14:18:08
Hallo Luc,
Danke für die Antwort.
Kann aber deinen Ausführungen nur teilweise folgen, weil meine VBA-Kenntnisse bescheiden sind.
Ich füge also vor "Application.ScreenUpdating = True" die Zeile ".Locked = False" ein.
Das alleine verursacht einen Laufzeit-Fehler "Die Locked-Eigenschaften des Range-Objektes kann nicht festgelegt werden".
Welche Code-Zeile soll ich im "Worksheet_Activate" anlegen?
Und wo finde ich das "Workbook_Open" Ereignis?
Vielleicht kannst du die Codes hier reinschreiben?
Oder in die Datei?
Wäre super.
Und Danke schon mal für deine Mühe.
![]() ![]() |
Betrifft: AW: Hatte ich tatsächlich übersehen, ...
von: Chris
Geschrieben am: 25.09.2014 14:34:38
Hallo Luc,
Danke für die Antwort.
Kann aber deinen Ausführungen nur teilweise folgen, weil meine VBA-Kenntnisse bescheiden sind.
Ich füge also vor "Application.ScreenUpdating = True" die Zeile ".Locked = False" ein.
Das alleine verursacht einen Laufzeit-Fehler "Die Locked-Eigenschaften des Range-Objektes kann nicht festgelegt werden".
Welche Code-Zeile soll ich im "Worksheet_Activate" anlegen?
Und wo finde ich das "Workbook_Open" Ereignis?
Vielleicht kannst du die Codes hier reinschreiben?
Oder in die Datei?
Wäre super.
Und Danke schon mal für deine Mühe.
![]() ![]() |
Betrifft: Nahm an, dass du bescheid weißt, ...
von: Luc:-?
Geschrieben am: 25.09.2014 15:39:38
…Chris,
denn du hattest ja geschrieben „Mittlerweile habe ich auch die Parameter beim Schutz so gesetzt, daß kein Laufzeitfehler mehr kommt“.
Wenn du den Cursor auf die vorhandene Prozedur setzt, kannst du rechts oben im Kopf Activate auswählen. Das legt den ProzedurRahmen an. In die Leerzeile dazwischen musst du jetzt nur noch die bereits gezeigte Protect-CodeZeile eintragen.
Wenn du der Mappe ein weiteres Blatt hinzufügst und darauf wechselst und anschließend wieder zurück, wird der Eintrag wirksam und der Locked-Befehl wird bei Eintrag akzeptiert.
Mit Open ist's genauso einfach → aufs Klassenmodul der Mappe (DieseArbeitsmappe) wechseln und im Kopf links auf Workbook klicken. Open wird sofort angelegt, weil Standard-Ereignis. Hierin dann Me.Sheets("Change").Activate (bzw …Select) eintragen. Das fktioniert auf jeden Fall dann, wenn Change nicht das 1.Blatt ist. Wenn's bei Mappenstart nicht klappt, hier Call Me.Sheets("Change").Worksheet_Activate eintragen.
Luc :-?
![]() ![]() |
Betrifft: AW: Nahm an, dass du bescheid weißt, ...
von: Chris
Geschrieben am: 25.09.2014 16:32:30
Hallo Luc,
den ersten Teil hab ich verstanden und sieht jetz so aus:
Private Sub Worksheet_Activate() Me.Protect "1234", True, True, True, True End Sub
Private Sub Worksheet_Change(ByVal Target As Range) Dim MergedRangeWidth As Single, MergedCellWidth As Single, NewRowHeight As Single Dim CurrCell As Range, iX As Integer If Target.MergeCells Then If Target.Cells(1) = "" Then Target.EntireRow.AutoFit Else With Target.MergeArea If .Rows.Count = 1 And .WrapText = True Then Application.ScreenUpdating = False MergedCellWidth = .Cells(1).ColumnWidth For Each CurrCell In Target.MergeArea MergedRangeWidth = CurrCell.ColumnWidth + MergedRangeWidth iX = iX + 1 Next MergedRangeWidth = MergedRangeWidth + (iX - 1) * 0.71 .MergeCells = False .Cells(1).ColumnWidth = MergedRangeWidth .EntireRow.AutoFit NewRowHeight = .RowHeight .Cells(1).ColumnWidth = MergedCellWidth .MergeCells = True .RowHeight = NewRowHeight .Locked = False Application.ScreenUpdating = True End If End With End If End If End SubUnd so das Workbook:
Private Sub Workbook_Open() Call Me.Sheets("Change").Worksheet_Activate End SubFunktioniert auch. Wenn ich die Datei speicher, schließe, dann wieder öffne und in der nächsten Zeile was eintrage kommt ein Fehler, daß er die MergeCells Eigenschaften des Range-Objektes nicht festlegen kann. Beim Klick auf Debuggen markiert er den Eintrag .Locked=False gelb.
![]() ![]() |
Betrifft: Es kommt bei 'Protect' auf das 4.'True' an, ...
von: Luc:-?
Geschrieben am: 25.09.2014 17:28:19
…Chris;
solange Xl das nicht verinnerlicht hat, fktioniert Locked nicht, denn solange sind derartige MakroAktionen verboten, anderenfalls erlaubt. Bevor du irgendetwas ins Blatt Change einträgst, solltest du erst mal das Blatt wechseln und wieder zurück gehen, damit die Protect-Zeile wirken kann. Danach muss der Schutz nicht mehr aufgehoben wdn. Falls du das mal machen musst, dann nicht wieder manuell setzen, sondern per Blattwechsel hin-und-zurück. Manuell wird das 4.True nämlich nicht gesetzt!
Ansonsten sollte alles OK sein (bis auf die Sache mit dem Aufkopieren).
Luc :-?
![]() ![]() |
Betrifft: AW: Es kommt bei 'Protect' auf das 4.'True' an, ...
von: Ewald
Geschrieben am: 25.09.2014 21:00:55
Hallo,
wie wärs so.
ins Tabellenblatt
Private Sub Worksheet_Change(ByVal Target As Range) ActiveSheet.Unprotect Passwort Dim MergedRangeWidth As Single, MergedCellWidth As Single, NewRowHeight As Single Dim CurrCell As Range, iX As Integer If Target.MergeCells Then If Target.Cells(1) = "" Then Target.EntireRow.AutoFit Else With Target.MergeArea If .Rows.Count = 1 And .WrapText = True Then Application.ScreenUpdating = False MergedCellWidth = .Cells(1).ColumnWidth For Each CurrCell In Target.MergeArea MergedRangeWidth = CurrCell.ColumnWidth + MergedRangeWidth iX = iX + 1 Next MergedRangeWidth = MergedRangeWidth + (iX - 1) * 0.71 .MergeCells = False .Cells(1).ColumnWidth = MergedRangeWidth .EntireRow.AutoFit NewRowHeight = .RowHeight .Cells(1).ColumnWidth = MergedCellWidth .MergeCells = True .RowHeight = NewRowHeight .Locked = False .FormulaHidden = True Application.ScreenUpdating = True End If End With End If End If ActiveSheet.Protect Passwort End Subin "Diese Arbeitsmappe"
Private Sub Workbook_Open() Setzen End Subin ein allgemeines Modul
Public Passwort As String Function Setzen() Passwort = "1234" End FunctionGruß Ewald
![]() ![]() |
Betrifft: Das 'Entschützen' ist normalerweise bei ...
von: Luc:-?
Geschrieben am: 25.09.2014 22:37:44
…Verwendung von UserInterfaceOnly:=True (4.True) nicht erforderlich, Ewald.
So, wie der Code jetzt bei Chris aussieht, liegt das Nicht-Fktionieren offensichtlich an manuellen Manipulationen ohne dass danach auch das Activate-Ereignis ausgelöst wird, denn bei mir hat's wie beschrieben fktioniert.
Gruß, Luc :-?
PS: Bin dann mal übers WE weg. Dir & Chris ein schönes solches.
![]() ![]() |
Betrifft: AW: Das 'Entschützen' ist normalerweise bei ...
von: Chris
Geschrieben am: 26.09.2014 07:45:58
Im Grunde genommen funktioniert es mit dem Code von Luc.
Ich hatte das nicht verstanden, daß der Schutz automatisch gesetzt wird, wenn ich in ein anderes Blatt wechsel.
Nur wenn ich die Datei neu starte, dann ist ja meistens das zuletzt bearbeitete Blatt offen. In dem Fall Change. Wenn ich jetzt was eintrage, dann kommt der Laufzeitfehler. Ich muß erst in ein anderes Blatt wechseln und wieder zurück dann funktioniert es.
Kann man nicht beim Starten der Datei festlegen, mit welchem Blatt er starten soll?
In meinem Fall wäre das das Blatt "data". Die Datei würde nach dem Öffnen immer mit dem Blatt data starten und dann müßte das Makro funktionieren.
Es ist noch ein weiteres Problem:
In der Arbeitsmappe/Workbook steht jetzt:
Private Sub Workbook_Open() Me.Sheets("Change").Activate End Sub
![]() ![]() |
Betrifft: AW: Das 'Entschützen' ist normalerweise bei ...
von: hary
Geschrieben am: 26.09.2014 07:56:18
Moin
"Ist es möglich die Anzeige des Codes zu unterbinden"
Im VBA Editor/Rechtsklick auf die Arbeitsmappe/Eigenschaft von Projekt/Schutz/Projekt fuer die Anzeige sperren und Passwort vergeben.
gruss hary
![]() ![]() |
Betrifft: AW: Das 'Entschützen' ist normalerweise bei ...
von: Chris
Geschrieben am: 26.09.2014 08:06:20
Manchmal steht man echt daneben.
Danke, da hätte ich auch drauf kommen können.
![]() ![]() |
Betrifft: AW: Das 'Entschützen' ist normalerweise bei ...
von: Chris
Geschrieben am: 26.09.2014 08:29:36
Ich habs jetzt hinbekommen.
Hab im Workbook folgendes stehen:
Private Sub Workbook_Open() ActiveWorkbook.Worksheets("Start").Activate End Sub
![]() ![]() |
Betrifft: AW: Das 'Entschützen' ist normalerweise bei ...
von: Chris
Geschrieben am: 26.09.2014 09:14:42
Jetzt hab ich doch noch ein Problem gefunden:
Und zwar sollte das Einfügen von Zeilen trotz Blattschutz erlaubt sein.
Leider kann ich nichts über die Anweisung me.protect finden, die ich drin habe und auf welche Werte sich die anschließenden True Angaben beziehen.
Private Sub Worksheet_Activate() Me.Protect "1234", True, True, True, True End Sub
![]() ![]() |
Betrifft: Guckst du VBE-Hilfe, Worksheet.Protect-Methode,...
von: Luc:-?
Geschrieben am: 28.09.2014 20:57:58
…Chris:
Ausdruck.Protect Password, DrawingObjects, Contents, Scenarios, UserInterfaceOnly, AllowFormattingCells, AllowFormattingColumns, AllowFormattingRows, AllowInsertingColumns, AllowInsertingRows, AllowInsertingHyperlinks, AllowDeletingColumns, AllowDeletingRows, AllowSorting, AllowFiltering, AllowUsingPivotTables
Du musst auch die, die False (bzw lt ihrem Default-Wert) bleiben sollen, nicht alle mit aufführen, sondern kannst dann ihre Benennung mitverwenden, zB so:
Sheets("Change").Protect UserInterfaceOnly:=True, AllowInsertingRows:=True
Anderenfalls kann False auch einfach weggelassen wdn (nicht aber das zugehörige Komma!).
Gruß, Luc :-?
![]() ![]() |
Betrifft: AW: Guckst du VBE-Hilfe, Worksheet.Protect-Methode,...
von: Chris
Geschrieben am: 29.09.2014 08:00:35
Hi Luc,
Dank für den Hinweis, die Zuordnung ist mir jetzt klar.
So wie ich das aber gelesen habe gilt diese Zuweisung für das Workbook, also die komplette Arbeitsmappe, ich brauche es aber für das Worksheet.
Hab jetzt folgenden Code im Worksheet Activate, der aber den Fehler "Erwartet:Ausdruck" im VBA bringt.
Private Sub Worksheet_Activate() Ausdruck.Protect "1234", True, True, True, True, True,, True,, True,,,True,,, End Sub
![]() ![]() |
Betrifft: AW: Guckst du VBE-Hilfe, Worksheet.Protect-Methode,...
von: Chris
Geschrieben am: 29.09.2014 12:54:30
Habs soweit hinbekommen, aber ich kann trotzdem keine Zeilen einfügen.
Ich habe es jetzt über Schaltflächen gelöst mit Zeile einfügen und Zeile löschen.
Danke nochmals für eure Hilfe und Unterstützung.
Chris
![]() |