Makros über "DieseArbeitsmappe" aktivieren

Informationen und Beispiele zu den hier genannten Dialog-Elementen:
MsgBox
Bild

Betrifft: Makros über "DieseArbeitsmappe" aktivieren
von: r2d2
Geschrieben am: 22.09.2015 15:30:48

Hallo,
leider bin ich immer noch nicht weiter, meine Datei vor dem Öffnen mit Shift zu schützen.
Beim öffnen mit der Shift-Taste wird der Code, der sich unter "DieseArbeitsmappe" befindet unterdrückt. Der andere Code, der sich in Modulen befindet, kann aber ausgeführt werden.
Nun möchte ich, daß wenn jemand die Datei mit Shift öffnet, gar kein Code mehr geht.
Kann man irdendwie den ganzen Code nur dann "freischalten", wenn über einen "speziellen Code" in "DieseArbeitsmappe" der restliche Code sozusagen "freigeschaltet" wird und wenn man mit der Shift-Taste die Datei öffnet geht gar kein Makro ???
Danke
Gruß
r2d2

Bild

Betrifft: AW: Makros über "DieseArbeitsmappe" aktivieren
von: Daniel
Geschrieben am: 22.09.2015 15:47:33
Hi
wenn jemand die Datei mit SHIFT öffnet oder die Makros deaktiviert, dann sollten generell keine Makros laufen.
wenn du verhindern willst, dass jemand mit der Datei arbeiten kann ohne die Makros zu aktivieren, dann kannst du so vorgehen:
1. im BeforeSave-Event alle Sheets bis auf ein Begrüssungsblatt auf .Visible = xlsheetveryhidden setzten.
merke dir aber das aktive Blatt.
2. im AfterSave-Event machst du alle Blätter wieder sichtbar und aktivierst das gemerkte Blatt. Setze Thisworkbook.Saved = True
3. im WorkbookOpen-Event machst du das gleiche wie im AfterSave-Event, dh alle Blätter einblenden.
dadurch werden beim Speichern mit aktiven Makros die Blätter ausgeblendet.
wenn jetzt der Anwender die Datei öffnet ohne die Makros zu aktivieren, dann bekommt er nur das Begrüssugnsblatt zu sehen, dh er kann ohne aktivierte Makros nichts mit der Datei anfangen.
allerdings schützt auch dieser Code nur vor neugieriegen, aber ansonsten unkundigen, aber niemals vor wissenden mit böser Absicht. Ein solcher Schutz ist in Excel mit Bordmitteln nicht möglich.
Gruß Daniel

Bild

Betrifft: öffnen mit SHIFT ...
von: Rudi Maintaire
Geschrieben am: 22.09.2015 16:01:17
Hallo,
... deaktiviert nur Workbook_open und Auto_open und aktiviert gleichzeitig den Entwurfsmodus.
Deaktiviert man den Entwurfsmodus, läuft wieder alles.
Gruß
Rudi

Bild

Betrifft: AW: Makros über "DieseArbeitsmappe" aktivieren
von: r2d2
Geschrieben am: 23.09.2015 08:15:26
Hallo,
erstmal danke für die Tips.
Daniel, du schreibst: "wenn jemand die Datei mit SHIFT öffnet oder die Makros deaktiviert, dann sollten generell keine Makros laufen."
Also wenn ich hier eine Datei mit Makros mit Shift öffne, dann wird zwar der Code in "DieseArbeitsmappe" nicht ausgeführt, aber alle anderen in Modulen verarbeiteten Makros laufen.
Wie kann das sein???
Gruß
r2d2

Bild

Betrifft: AW: Makros über "DieseArbeitsmappe" aktivieren
von: Rudi Maintaire
Geschrieben am: 22.09.2015 15:53:37
Hallo,
geht bedingt.
in dieseArbeitsmappe

Private Sub Workbook_BeforeClose(Cancel As Boolean)
  CheckNameExists
  With Names("Makro")
    .Value = 0
    .Visible = False
  End With
End Sub
Private Sub Workbook_Open()
  CheckNameExists
  With Names("Makro")
    .Value = 1
    .Visible = False
  End With
End Sub
Sub CheckNameExists()
  Dim n As Name
  On Error Resume Next
  Set n = Names("Makro")
  On Error GoTo 0
  If n Is Nothing Then
    Set n = Me.Names.Add("Makro", 1)
  End If
End Sub

in einem Modul z.B.
Sub makro1()
  If [Makro] = 1 Then
    MsgBox "makro1"
  End If
End Sub
Gruß
Rudi

Bild

Betrifft: AW: Makros über "DieseArbeitsmappe" aktivieren
von: r2d2
Geschrieben am: 23.09.2015 08:24:34
Hallo,
kann ich den nicht irgendwi am Anfang eine "startprozedur" definieren, wo z.B. der Variablen "MAKRO" ein Wert zugewiesen wird (z.B. 1) und dann bei den einzelnen Makros abgefragt wird, ob die Variable war oder falsch ist, also z.B.:
sub TEST()
If MAKRO <>1 Then exit sub
und dann kommt das eigentliche Makro.
Also wenn MAKRO nicht am Anfang auf 1 gesetzt wird, dann wird das Makro nicht ausgeführt.
Danke.
Gruß
r2d2

Bild

Betrifft: genau das ....
von: Rudi Maintaire
Geschrieben am: 23.09.2015 09:44:39
.... mach mein Vorschlag.
Nur dass ich den Wert in einen versteckten Namen schreibe.
Gruß
Rudi

Bild

Betrifft: AW: genau das ....
von: r2d2
Geschrieben am: 23.09.2015 10:40:30
Aber wozu benötige ich dann das beforeclolse und das checknameexixt event?
Geht das nich auch "nur" über ein workbook_open event?
Danke.
Gruß
r2d2

Bild

Betrifft: AW: genau das ....
von: Rudi Maintaire
Geschrieben am: 23.09.2015 10:55:38
BeforeClose: damit der Wert auf 0 gesetzt wird.
CheckNameExists: damit sicher gestellt ist, dass der Name existiert.
Du kannst es aber auch nur mit Workbook_open machen und eine globale Variable setzen.
Dann musst du aber auch in alle Prozeduren eine Fehlerbehandlung einbauen, denn wenn ein Fehler auftritt, verlieren alle globalen Variablen ihren Wert und du musst neu starten.
Gruß
Rudi

Bild

Betrifft: AW: genau das ....
von: r2d2
Geschrieben am: 23.09.2015 11:06:27
Hmm... ich hab's jetzt so gelöst:

Private Sub workbook_open()
    Sheets("start").Range("B14") = 1
End Sub

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Sheets("start").Range("B14") = 2
End Sub

Private Sub Workbook_afterSave(ByVal Success As Boolean)
    Sheets("start").Range("B14") = 1
End Sub
Nun muß ich nur noch in jedem Makro die Abfrage nach dem Zellwert einbauen und wenn der Wert 2 ist wird das Makro sofort abgebrochen. Allerdings muß der User dann nur einmal zwischenspeichern und der Wert währe wieder auf 1 und somit würden dann die Makros wieder gehen - dumm.... hach wie mach ichs nur????
Oder was meinst du?
Danke.
Gruß
r2d2

Bild

Betrifft: warum fragst du,...
von: Rudi Maintaire
Geschrieben am: 23.09.2015 12:33:10
... wenn du doch nicht machst, was man dir sagt.

Bild

Betrifft: AW: warum fragst du,...
von: r2d2
Geschrieben am: 23.09.2015 12:42:45
Ok, ich versuch mal deinen Code einzubauen (obwohl der mir noch nicht so ganz klar ist...)

Bild

Betrifft: AW: warum fragst du,...
von: r2d2
Geschrieben am: 23.09.2015 12:49:12
Was bewirkt das hier:

Sub CheckNameExists()
  Dim n As Name
  On Error Resume Next
  Set n = Names("VARIABLE")
  On Error GoTo 0
  If n Is Nothing Then
    Set n = Me.Names.Add("VARIABLE", 1)
  End If
End Sub


Bild

Betrifft: AW: warum fragst du,...
von: r2d2
Geschrieben am: 23.09.2015 12:56:26
Leider funktioniert dein Code doch nicht:
Wenn man auf das Abbrechen kreutzchen drückt und die Meldung kommt ob man speichern will, dann wird der Wert, wenn man abbricht, auf 0 gesetzt - und somit würden danach die Makros alle nicht mehr laufen, was sie aber in dem fall doch sollen...
???
Danke.
Gruß
r2d2

 Bild

Beiträge aus den Excel-Beispielen zum Thema "Makros über "DieseArbeitsmappe" aktivieren"