Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Makro-Sicherheitseinstellung per VBA feststellen

45 views
Skip to first unread message

Dana Hartmann

unread,
Mar 27, 2008, 3:25:32 PM3/27/08
to
Hallo an alle,

ich hoffe ihr könnt mir mit folgendem Problem helfen:

Ich würde gerne beim Öffnen einer bestimmten Datei irgendwie feststellen
können, welche Sicherheitseinstellungen gewählt wurden. D.h. wenn Makros
nicht zugelassen sind, wird dem Benutzer auf dem Tabellenblatt eine Meldung
(z.B. "Damit die Funktionalität der Tabelle gewährleistet ist, müssen Sie
Makros zulassen") eingeblendet. Wenn Makros erlaubt sind, wird der normale
Inhalt angezeigt.

Der Hintergrund ist, dass ich eine Landkarte habe, deren Teile je nach dem
ausgewählten Zeitraum die entsprechenden Farben gemäß der Legende einnehmen.
Wenn allerdings Makros nicht zugelassen sind, kann man zwar in der Combobox
den gewünschten Monat auswählen, die Farben auf der Landkarte verändern sich
aber nicht. Und hinterher kann man es nicht erkennen, dass die auf der
Landkarte angezeigten Farben nicht den Werten des ausgewählten Zeitraums
passen.

Es würde mich freuen, wenn sich dafür eine Lösung finden würde. Vielen Dank
im Voraus.

Viele Grüße
Dana Hartmann


Thomas Ramel

unread,
Mar 27, 2008, 4:06:10 PM3/27/08
to
Grüezi Dana

Dana Hartmann schrieb am 27.03.2008

> Ich würde gerne beim Öffnen einer bestimmten Datei irgendwie feststellen
> können, welche Sicherheitseinstellungen gewählt wurden. D.h. wenn Makros
> nicht zugelassen sind, wird dem Benutzer auf dem Tabellenblatt eine Meldung
> (z.B. "Damit die Funktionalität der Tabelle gewährleistet ist, müssen Sie
> Makros zulassen") eingeblendet. Wenn Makros erlaubt sind, wird der normale
> Inhalt angezeigt.
>

> Es würde mich freuen, wenn sich dafür eine Lösung finden würde. Vielen Dank
> im Voraus.

Mit VBA lässt sich hier direkt nichts machen, da bei deaktivierten Makros
eben nichts läuft.

Aber Du könntest ein Dummy-Tabellenblatt mit dem gewünschten Hinweis in die
Mappe packen und beim Schliessen der Mappe nur dieses Blatt anzeigen
lassen.

Wird die Mappe ohne aktivierte Makros geöffnet erscheint der Hinweis - bei
aktivierten Makros wird das Blatt als erstes ausgeblendet und gibt den Weg
zum eigentlichen Inhalt frei.


Mit freundlichen Grüssen
Thomas Ramel

--
- MVP für Microsoft-Excel -
[Win XP Pro SP-2 / xl2003 SP-2]
Microsoft Excel - Die ExpertenTipps

Peter Schleif

unread,
Mar 28, 2008, 6:49:25 AM3/28/08
to
Thomas Ramel schrieb am 27.03.2008 21:06:
>
> Aber Du könntest ein Dummy-Tabellenblatt mit dem gewünschten Hinweis in die
> Mappe packen und beim Schliessen der Mappe nur dieses Blatt anzeigen
> lassen.
> Wird die Mappe ohne aktivierte Makros geöffnet erscheint der Hinweis - bei
> aktivierten Makros wird das Blatt als erstes ausgeblendet und gibt den Weg
> zum eigentlichen Inhalt frei.

Genial!

Ich hab' bei der Weitergabe von Mappen mit VBA-Anteil auch schon
öfters nach so einer Lösung gesucht. Aber auf so eine einfache und
elegante Idee bin ich leider nicht gekommen. Vielen Dank für den Tipp.

Peter

Dana Hartmann

unread,
Mar 28, 2008, 1:17:17 PM3/28/08
to
Hallo Thomas,

vielen Dank für den Tipp. Es ist in der Tat eine einfache und elegante
Lösung.

Viele Grüße
Dana Hartmann


"Thomas Ramel" <t.r...@MVPs.org> schrieb im Newsbeitrag
news:xxxcwreyejde$.1fpggup9hhg25$.dlg@40tude.net...

Thomas Ramel

unread,
Mar 28, 2008, 2:35:12 PM3/28/08
to
Grüezi Dana und Peter

Dana Hartmann schrieb am 28.03.2008

> vielen Dank für den Tipp. Es ist in der Tat eine einfache und elegante
> Lösung.

Aber gerne doch :-)

Eine weitere Spielart wäre vor dem Schliessen die Eigenschaft .IsAddIn=True
zu setzen und beim öffnen als erstes wieder aufzuheben.
Der User bekommt dann aber gar nichts zu sehen und kann die Mappe so ohne
weiteres auch nicht wieder schliessen.

Die Variante mit der Info-Tabelle ist daher Benutzer-freundlicher.

Peter Schleif

unread,
Mar 29, 2008, 1:50:55 AM3/29/08
to
Thomas Ramel schrieb am 27.03.2008 21:06:
>
> Aber Du könntest ein Dummy-Tabellenblatt mit dem gewünschten Hinweis in die
> Mappe packen und beim Schliessen der Mappe nur dieses Blatt anzeigen
> lassen.
> Wird die Mappe ohne aktivierte Makros geöffnet erscheint der Hinweis - bei
> aktivierten Makros wird das Blatt als erstes ausgeblendet und gibt den Weg
> zum eigentlichen Inhalt frei.

Ich habe es gestern noch ausprobiert; fürs erste mit untenstehendem
Code. Da treffe ich dann aber gleich auf das erste Problem. Wenn der
User seit dem letzten Speichern Änderungen vorgenommen hat, wird ihm
ja vor dem Beenden das Speichern angeboten. Bricht er daraufhin das
Beenden ab, steht er ohne seine Blätter da. Denn zu diesem Zeitpunkt
hat untenstehender Code ja schon alle Blätter ausgeblendet (bis auf
das Makro-Info-Blatt).

Man müsste also den eingebauten Beenden-Speichern-Dialog durch eine
eigene Lösung ersetzen. Wurde hier ja vor nicht allzu langer Zeit mal
gemacht. Ich frage mich aber, ob das schon alle Fallen sind? - mal
abgesehen von solchen, bei denen man sowieso nichts machen kann
(Taskkill, etc)

@Thomas: Hast Du eine robuste, fertige Lösung da?


Vielleicht sollte aber man auch gar nicht alle anderen Blätter
ausblenden. Gerade bei VBA-Code der lediglich "nice-to-have" ist,
sollte man dem User zumindest die Möglichkeit lassen, die Blätter auch
ohne Makros zu bearbeiten.


Peter


Private Sub Workbook_Open()
Dim sh As Variant

For Each sh In Sheets
sh.Visible = True
Next

Sheets("Makro-Info").Visible = False
End Sub


Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim sh As Variant

Sheets("Makro-Info").Visible = True
Sheets("Makro-Info").Activate
ActiveWindow.ScrollIntoView 0, 0, 1, 1

For Each sh In Sheets
If sh.Name <> "Makro-Info" Then
sh.Visible = False
End If
Next
End Sub

Thomas Ramel

unread,
Mar 29, 2008, 3:40:35 AM3/29/08
to
Grüezi Peter

Peter Schleif schrieb am 29.03.2008

> Thomas Ramel schrieb am 27.03.2008 21:06:
>>
>> Aber Du könntest ein Dummy-Tabellenblatt mit dem gewünschten Hinweis in die
>> Mappe packen und beim Schliessen der Mappe nur dieses Blatt anzeigen
>> lassen.
>> Wird die Mappe ohne aktivierte Makros geöffnet erscheint der Hinweis - bei
>> aktivierten Makros wird das Blatt als erstes ausgeblendet und gibt den Weg
>> zum eigentlichen Inhalt frei.
>
> Ich habe es gestern noch ausprobiert; fürs erste mit untenstehendem
> Code. Da treffe ich dann aber gleich auf das erste Problem. Wenn der
> User seit dem letzten Speichern Änderungen vorgenommen hat, wird ihm
> ja vor dem Beenden das Speichern angeboten. Bricht er daraufhin das
> Beenden ab, steht er ohne seine Blätter da. Denn zu diesem Zeitpunkt
> hat untenstehender Code ja schon alle Blätter ausgeblendet (bis auf
> das Makro-Info-Blatt).

Ja, das ist korrekt - man müsste daher im BeforeClose() die Mappe nach dem
sichtbar machen der Dummy-Tabelle auf alle Fälle speichern und den
Nachfrage-Dialog unterdrücken.

Wenn der User aber seine letzten Anpassungen nicht gespeichert haben will
geschieht dies dann trotzdem.

> Man müsste also den eingebauten Beenden-Speichern-Dialog durch eine
> eigene Lösung ersetzen. Wurde hier ja vor nicht allzu langer Zeit mal
> gemacht. Ich frage mich aber, ob das schon alle Fallen sind? - mal
> abgesehen von solchen, bei denen man sowieso nichts machen kann
> (Taskkill, etc)
>
> @Thomas: Hast Du eine robuste, fertige Lösung da?

Robust und fertig gibst bei Excel im absoluten Sinne nicht - wer an die
Daten will der kommt eh ran.

> Vielleicht sollte aber man auch gar nicht alle anderen Blätter
> ausblenden. Gerade bei VBA-Code der lediglich "nice-to-have" ist,
> sollte man dem User zumindest die Möglichkeit lassen, die Blätter auch
> ohne Makros zu bearbeiten.

Ja, das ist ebenfalls zu bedenken - allenfalls wäre die Methode mit
.IsAddIn=True/False noch in Erwägung zu ziehen, dann bekommt der User bei
deaktivierten Makros überhaupt nichts zu sehen.
Auch dies erfordert allerdings das Speichern der Mappe vor dem Schliessen,
was jegliche (ev. ungewollten) Änderungen ebenfalls mit speichert.

So gesehen - für robust und fertig - kommt dann eigentlich nur noch ein
AddIn in Frage, das den Code enthält und 'dumme' Mappen (im Sinne von: ohne
VBA-Code) erzeugt und bearbeitet.
Das wäre dann sowas ähnliches wie das Frontend/Backend-Prinzip von
Datenbanken wie Access. Am Frontend kann gearbeitet und verbessert werden
ohne die Daten zu gefährden und zum Zeitpunkt 'X' wird das neue Frntend
verteilt.

Thomas Unruh

unread,
Apr 5, 2008, 9:21:04 AM4/5/08
to
Hallo Leute,

ich hab da mal was gebastelt.

Thomas Ramel schrieb:


> Grüezi Peter
>
> Peter Schleif schrieb am 29.03.2008
>
>> Thomas Ramel schrieb am 27.03.2008 21:06:
>>> Aber Du könntest ein Dummy-Tabellenblatt mit dem gewünschten Hinweis in die
>>> Mappe packen und beim Schliessen der Mappe nur dieses Blatt anzeigen

[...]

>> @Thomas: Hast Du eine robuste, fertige Lösung da?
>
> Robust und fertig gibst bei Excel im absoluten Sinne nicht - wer an die
> Daten will der kommt eh ran.
>

hier mal das was bei mir zumindest reicht:

Public dummyClose As Boolean

Private Sub Workbook_Open()
Dim sh As Variant

For Each sh In Sheets
sh.Visible = True
Next
Sheets("Makro-Info").Visible = False

dummyClose = False
ThisWorkbook.Saved = True
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim sh As Variant

'EVENTS AUS
On Error GoTo Fehlerbehandlung
Application.EnableEvents = False

If dummyClose = True Then GoTo wech 'wenn schon nein gesagt wurde
trotzdem nochmal nein
'wegen den Events - hiermit wir
die Abfrage unterbunden

If ThisWorkbook.Saved = False Then
dummyAntwort = MsgBox("Änderungen speichern?", vbYesNo, "Diese
Mappe wurde geändert!")
Else
nochmalSpeichern = True 'Wenn sich nix geändert hat muß trotzdem
gespeichert werden
'da ja das Makro das Blatt nun nochmal ändert
End If

'Info Blatt sichtbar


Sheets("Makro-Info").Visible = True
Sheets("Makro-Info").Activate
ActiveWindow.ScrollIntoView 0, 0, 1, 1

'Hier nun Blätter verstecken


For Each sh In Sheets
If sh.Name <> "Makro-Info" Then
sh.Visible = False
End If
Next

'speichern
If dummyAntwort = vbYes Or nochmalSpeichern = True Then
ThisWorkbook.Save
End If

'oder nicht speichern
If dummyAntwort = vbNo Then
Application.EnableEvents = True
dummyClose = True
ThisWorkbook.Close (False)
End If

wech:
Fehlerbehandlung:
Application.EnableEvents = True

End Sub

Gruß
Thomas

0 new messages