Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
24.04.2024 17:19:09
Anzeige
Archiv - Navigation
1492to1496
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

Makro

Makro
30.05.2016 12:05:29
Katja
Hallo zusammen,
ich habe ein Problem mit einen Makro, welches ein ehemaliger Kollege vor Jahren schrieb und welches jetzt irgendwie nicht mehr klappt.
Deshalb benötige ich dringend eure Hilfe.
Ich habe euch mal einen Beispieldatei hochgeladen, damit ihr mich besser versteht.
https://www.herber.de/bbs/user/105861.xls
Beginnen soll das Makro seine Arbeit in Zelle B5.
Hier soll geprüft werden ob die Zelle gefüllt ist. Wenn Ja dann Zelle schützen und weiter gehen zur Zelle C5 prüfen wenn Ja dann schützen weiter zu D5, wenn nein nicht schützen und auch weiter zu D5 usw. Dieses soll bis G5 gemacht werden. Dann soll die Prüfung in der nächsten Zeile weitergehen und wieder bis zur Spalte G usw.
Geprüft soll eine Zeile aber nur dann werden wenn die erste Zelle einer Zeile gefüllt wurde. Es sollen nur die beschrieben Zelle geschützt werden, nicht aber die leeren.
Die Tabelle wird von diversen Kollegen bearbeitet. Der Schutz soll nur dann aufgehoben werden, wenn Eintragungen geändert werden müssen und nicht bei jeder neuen Eintragung. Die Zellen dürfen nicht gesperrt werden, da in diversen Zellen Hyperlinks aktiviert werden müssen.
Z.Z. Schützt dieses Makro aber alles und ich muss den Blattschutz immer Aufheben. Lästig.
Gibt es eigentlich eine Möglichkeit das Makro mittels VBA automatisch zu aktivieren, wenn ich die Datei öffne und eine Nachricht zu erhalten?
Sub Schutzmakro()
' Schutzmakro Makro
' Makro am 01.11.99 von N aufgezeichnet
' Tastenkombination: Strg+m
' Blattschutz entfernen
ActiveSheet.Unprotect
' Spalte der FF-Riss-Nr. ist die einzige durchlaufend besetzte Spalte,
' daher wird diese als Maß für das Auffüllen der Tabelle benutzt
' Der Cursor wird auf die erste mögliche Position in dieser Spalte gesetzt
Range("B5").Select
' Wir beginnen mit Zähler 1, da wir die erste Zelle mit möglichem Eintrag überprüfen wollen.
Counter = 0
' Schleife soll laufen, bis eine Zelle ohne Eintrag erreicht ist
' Überprüfung auf "NUL" genügt, da dann zumindest alle notwendigen Zellen geschützt sind.
Do
' Jetzt werden alle Zellen pro Zeile hintereinander weg geschützt.
Selection.Offset(Counter, 0).Locked = True
Selection.Offset(Counter, 1).Locked = True
Selection.Offset(Counter, 2).Locked = True
Selection.Offset(Counter, 3).Locked = True
Selection.Offset(Counter, 4).Locked = True
Selection.Offset(Counter, 5).Locked = True
' Zähler wird um 1 erhöht, die nächste Zeile ist dran.
Counter = Counter + 1
' Schleife beginnt erneut.
Loop Until Selection.Offset(Counter, 0).Value = ""
' kompletter Blattschutz für die gesamte Tabelle wir wieder eingerichtet
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
' Aktuelle Tabelle wird gesichert.
ActiveWorkbook.Save
End Sub
Bitte helft mir.
Danke
LG Katja

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Nachfrage...
30.05.2016 12:55:27
UweD
Hi
die Schleife wird ja durchlaufen, bis in Spalte B eine leere Zelle gefunden wird.
Gibt es danach noch weitere Werte in der Spalte, oder ist die Leerzelle immer die Unterste?

AW: Nachfrage...
30.05.2016 13:27:11
UweD
Hallo
stand ja in der Datei....
- Das Makro kannst du ohne Schleife nutzen.
- auf Select kann in den meisten Fällen verzichtet werden
- durch "SpecialCells(xlCellTypeConstants, 23)" werden nur die belegten Zellen des gewählten Bereichs betrachtet
- Den Blattschutz musst du nicht aufheben, wenn du ihn einmal richtig einstellst.
"UserInterfaceOnly" erlaubt die Bearbeitung durch VBA aber nicht durch Benutzer.
Also das Blattschutzmakro einmal starten.
'In ein "normales Modul:"

Sub Blattschutz_erstemal()
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, _
Scenarios:=True, UserInterfaceOnly:=True
End Sub
Sub Schutzmakro()
Dim LR&
With ActiveSheet
LR = .Cells(Rows.Count, "B").End(xlUp).Row 'letzte Zeile der Spalte
.Range("B5:G" & LR).SpecialCells(xlCellTypeConstants, 23).Locked = True
.Save
End With
End Sub

In "DieseArbeitsmappe":

Private Sub Workbook_Open()
MsgBox "Makro wird gestartet"
Schutzmakro
End Sub
Gruß UweD

Anzeige
AW: Nachfrage...
30.05.2016 14:33:48
Katja
Hallo,
die Leerzelle ist immer die unterste.

AW: Makro
30.05.2016 13:01:33
Fennek
Hallo,
ungeprüft:

sub Test()
ActiveSheet.Unprotect
lr = cells(rows.count, "B").end(xlup).row 'letzte belegte Zelle in Spalte B
Range("B5:B" & lr).locked = true
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
' Aktuelle Tabelle wird gesichert.
ActiveWorkbook.Save
End Sub
mfg

AW: Makro
30.05.2016 16:39:34
Katja
Hi,
Makro klappt nicht. Es werden auch leere Zellen geschützt.
Müssen die Zellen irgent welche Eigenschaften besitzen?

AW: Makro
30.05.2016 17:03:11
UweD
Hi
hast du dir meine Lösung mal angesehen?

Anzeige
AW: Makro
30.05.2016 17:20:51
Katja
Hallo Uwe,
Habe Sub Blattschutz_erstemal() und Sub Schutzmakro() in ein Modul hinein kopiert.
Zuerst habe ich Sub Blattschutz_erstemal()gestartet. Schutz wird nur tlw. dafür aber im gesamten Tabellenblatt ausgeführt.
Danach Sub Schutzmakro()gestartet. Jetzt kommt die Fehlermeldung Laufzeitfehler '438'.
Was nun mache ich etwas falsch? Habe keine Ahnung von diesen Befehlen. Gibt es ein Nachschlage/Übersetzungswerk online? Oder kannst du mir die einzelnen Befehle mal übersetzen? Ich verstehe nur Bahnhof!
LR = .Cells(Rows.Count, "B").End(xlUp).Row 'letzte Zeile der Spalte
.Range("B5:G" & LR).SpecialCells(xlCellTypeConstants, 23).Locked = True
Danke für deine Geduld.

Anzeige
AW: Makro
31.05.2016 08:17:27
UweD
Hallo
welche Zeile im Makro ist denn markiert, wenn der Fehler auftaucht? (evtl. mit Einzelschritt testen)


LR = .Cells(Rows.Count, "B").End(xlUp).Row 'letzte Zeile der Spalte
Steht doch schon dahinter. Die letzte gefüllte Zeile in Spalte B wird gesucht und der Variablen LR zugewiesen. ==&gt also so wie gewünscht.


.Range("B5:G" & LR).SpecialCells(xlCellTypeConstants, 23).Locked = True
Aus dem Bereich B5:G'bis letzte Zeile' werden alle Zellen, die einen Wert enthalten (also ohne diejenigen, die leer sind) "ermittelt" und mit Zellschutz versehen.

Anzeige
AW: Makro
31.05.2016 08:57:14
Katja
Hallo
wenn ich auf Debuggen klicke, wird .Save gelb makiert. Meinst du das?
Danke für die ausführliche Übersetzung jetzt weiß ich wenigstens welche Zeile für was steht.
Übrigens habe ich gestern noch herausgefunden warum einige Zellen nicht geschützt wurden. In der Zellformatierung fehlte der Haken für gesperrt. Habe ich geändert, jetzt werden aber alle Zellen geschützt auch die ohne Inhalt. Warum?

AW: Makro
31.05.2016 10:03:54
UweD
Hallo nochmal
- OK. das mit dem .save war ein Fehler von mir. da hatte ich das "ThisWorkbook" versehentlich weggelassen


- Du musst erstmal eine Grundeinstellung des Zellschutzes vornehmen.
= Ich mache das immer so:
= - Blattschutz raus
= - Alle Zellen markieren,
= - dann Zellschutz anhaken
= - alle Zellen, die beschrieben werden sollen auswählen
= - Zellschutz Haken raus
Ich hab mal das Makro angepasst und bearbeite die Leerzellen in einem zweiten Schritt separat.
(dadurch wird ein eventueller mal falsch gesetzter Zellschutz berichtigt)

Sub Blattschutz_erstemal()
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, _
Scenarios:=True, UserInterfaceOnly:=True
End Sub
Sub Schutzmakro()
Dim LR&
With ActiveSheet
LR = .Cells(Rows.Count, "B").End(xlUp).Row 'letzte Zeile der Spalte
.Range("B5:G" & LR).SpecialCells(xlCellTypeConstants, 23).Locked = True
.Range("B5:G" & LR).SpecialCells(xlCellTypeBlanks).Locked = False
ThisWorkbook.Save
End With
End Sub

Gruß UweD

Anzeige
AW: Makro
31.05.2016 15:25:38
Katja
Hallo Uwe,
wie wirkt sich dieser Zellschutz eigentlich aus?
Ich habe jetzt Spalte B-G markiert und das Häkchen bei Zellschutz-Gesperrt entfernt.
Selection.SpecialCells(xlCellTypeConstants, 23).Select
kann man diesen Befehl auf geschützte Zellen ändern. Oder Geschützte Zellen mittels leichter Hintergrundfarbe kennzeichnen.
Ansonsten funktioniert dein Code super. Habe ihn wie folgt leicht verändert:

Sub Schutzmakro_neu()
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, _
Scenarios:=True, UserInterfaceOnly:=True
Range("B5").Select
Dim LR&
With ActiveSheet
LR = .Cells(Rows.Count, "B").End(xlUp).Row 'letzte Zeile der Spalte
.Range("B5:G" & LR).SpecialCells(xlCellTypeConstants, 23).Locked = True
.Range("B5:G" & LR).SpecialCells(xlCellTypeBlanks).Locked = False
ThisWorkbook.Save
MsgBox "Geschützt und Gespeichert!"
End With
End Sub
ich habe noch eine Frage: Wenn ich mehrere solcher Listen geöffnet habe und mit Strg+m mein Makro starten möchte, klappt das nicht. Warum? Ich kann es manuell ausführen und dann sagen "in dieser Arbeitsmappe ausführen" dann klappt's, aber es ist so umständlich und manche Kollegen erkennen einfach nicht (oder wollen es nicht sehen), ob das Makro gelaufen ist. Kann man es auch automatisch vor dem schließen laufen lassen, dann natürlich ohne MsgBox?

Anzeige
AW: Makro
31.05.2016 16:09:23
UweD
Hallo
zu 1)
Der Zellschutz (Schutz- Haken der Zelle ist gesetzt) wirkt sich nur aus, wenn danach auch das Blatt geschützt wird.
Dann ist keien HAND-Eingabe mehr möglich
zu 2)
SpecialCells(sdsdsdw).select für geschützte Zellen kenn ich nicht
aber hiermit wäre das Färben möglich

Sub geschützt()
Dim Z
For Each Z In ActiveSheet.UsedRange
If Z.Locked Then
Z.Interior.ThemeColor = xlThemeColorDark1
Z.Interior.TintAndShade = -0.249977111117893
End If
Next
End Sub

zu 3)
?
zu 4)
in "DieseArbeitsmappe" der geöffneten Datei:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Msg=True
Call Schutzmakro_neu
End Sub
Die globale Variable Msg muss dann vor der Messagebox noch abgefragt werden
in ein normales Modul:

Global Msg
Sub Schutzmakro_neu()
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, _
Scenarios:=True, UserInterfaceOnly:=True
Range("B5").Select
Dim LR&
With ActiveSheet
LR = .Cells(Rows.Count, "B").End(xlUp).Row 'letzte Zeile der Spalte
.Range("B5:G" & LR).SpecialCells(xlCellTypeConstants, 23).Locked = True
.Range("B5:G" & LR).SpecialCells(xlCellTypeBlanks).Locked = False
ThisWorkbook.Save
If Not Msg Then MsgBox "Geschützt und Gespeichert!"
End With
End Sub
Gruß UweD

Anzeige
AW: Makro
30.05.2016 17:44:04
Katja
Ach übrigens Uwe,
bei diesem Hier hast du mich wohl falsch verstanden.
Private Sub Workbook_Open()
Es ging mir darum:
Wenn ich eine Datei öffne, ist die Sicherheitsstufe auf: Makros mit Benachrichtigung deaktivieren gestellt. Deshalb muss jeder erst mal auf Inhalt aktivieren tippen, sonst gehen Makros gar nicht.
Es gibt aber einige Schlafmützen, die das nicht verstehen. Deshalb hätte ich gerne die Makros automatisch aktiviert, nicht gestartet. Was im übrigen auch nicht klappt, da der Schreibschutz aktiv ist.
Vielleicht hast du ja noch ne Idee?

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige