Macro activatie "afdwingen"

( Voor het laatst geupdate 11 januari 2012 17:17 )
Volgens Microsoft is het niet mogelijk om vanuit een Excel bestand de activering van macro's af te dwingen. Toch wil ik voorkomen dat mijn bestand gebruikt wordt terwijl de macro's uitgeschakeld zijn. Is er een andere manier om dit effect te bereiken?

De instelling om macro's niet te activeren is inderdaad niet te beïnvloeden vanuit een Excel bestand. Dat is maar goed ook, want deze instelling is in Excel gebouwd om het risico van macro-virussen te beperken.

Er is wel een manier om de gebruiker ertoe te bewegen de macro's te activeren. Dat kan bijvoorbeeld door ervoor te zorgen dat hij niets aan het Excel bestand heeft als hij het zonder geactiveerde macro's opent.

Om het bestand nutteloos te laten zijn als de macro's niet geactiveerd zijn, gaan we alle werkbladen verbergen en in plaats daarvan één werkblad tonen, waarop u uit kunt leggen dat het bestand alleen bruikbaar is met geactiveerde macro's. Hoe vreemd het ook mag klinken, maar we gaan het probleem van niet-geactiveerde macro's met macro's oplossen. Drie macro's om precies te zijn.

Om ervoor te zorgen dat de gebruiker die de macro's niet activeert de waarschuwingstekst te zien krijgt, gaan we bij het opslaan van het bestand dat werkblad al tonen en de rest verbergen. Op het moment van openen kan dat immers niet meer, omdat de macro's dan niet geactiveerd zijn.

De tweede macro zorgt ervoor dat een gebruiker die de macro's wel activeert vrijwel niets merkt van deze beveiliging: Alle normale werkbladen worden bij het openen van het bestand zichtbaar gemaakt en het werkblad met de waarschuwing wordt verborgen.

De derde macro lost tot slot een schoonheidsfoutje op bij het sluiten van het bestand. Zonder deze derde macro blijft Excel bij het sluiten van het bestand steeds weer vragen of het bestand opgeslagen moet worden, net zo lang als de gebruiker het volhoudt om steeds weer voor 'Ja' te kiezen.

Zo kunt u deze beveiliging bouwen: Voeg een werkblad toe aan je bestand en geef het de naam 'FOUT'. Op dit werkblad geef je aan dat het bestand alleen te gebruiken is als het geopend wordt met geactiveerde macro's.

De eerste macro: Plaats deze macro komt in het object 'ThisWorkbook'.

Private Sub Workbook_Open()

' Deze code is afkomstig uit de Excel tips van Comfi.
' www.comfi.nl

Application.ScreenUpdating = False
Application.EnableEvents = False
Application.DisplayAlerts = False

Dim m As Date
Dim ws As Worksheet

' Hieronder vul je tussen de haakjes de gewenste
' laatste gebruiksdag in als jjjj, mm, dd.
' Dus: jaartal, maand, dag.
m = DateSerial(2003, 12, 31)

If Date > m Then
ThisWorkbook.Close
Else
For Each ws In ActiveWorkbook.Worksheets
If ws.Name <> "FOUT" Then
ws.Visible = True
End If
Next
Sheets("FOUT").Visible = xlVeryHidden
End If

Application.ScreenUpdating = True
Application.EnableEvents = True
Application.DisplayAlerts = True

End Sub

De tweede macro: Plaats deze macro ook in het object 'ThisWorkbook'.

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, _Cancel As Boolean)

' Deze code is afkomstig uit de Excel tips van Comfi.
' www.comfi.nl

Application.ScreenUpdating = False
Application.EnableEvents = False
Application.DisplayAlerts = False

Dim m As Date
Dim ws As Worksheet

Sheets("FOUT").Visible = True

For Each ws In ActiveWorkbook.Worksheets
If ws.Name <> "FOUT" Then
ws.Visible = xlVeryHidden
End If
Next

ThisWorkbook.Save

For Each ws In ActiveWorkbook.Worksheets
If ws.Name <> "FOUT" Then
ws.Visible = True
End If
Next

Sheets("FOUT").Visible = xlVeryHidden

Application.ScreenUpdating = True
Application.EnableEvents = True
Application.DisplayAlerts = True
ThisWorkbook.Saved = True
Cancel = True

End Sub

De derde macro: Plaats ook deze macro in het object 'ThisWorkbook'.

Private Sub Workbook_BeforeClose(Cancel As Boolean)

' Deze code is afkomstig uit de Excel tips van Comfi.
' www.comfi.nl

Dim Msg As String
Dim Ans As Variant

If Not ThisWorkbook.Saved = True Then
Msg = "Do you want to save the changes you made to '"
Msg = Msg &ThisWorkbook.Name &"'?"
Ans = MsgBox(Msg, vbQuestion + vbYesNoCancel)

Select Case Ans
Case vbYes
ThisWorkbook.Save
ThisWorkbook.Saved = True
Case vbNo
ThisWorkbook.Saved = True
Case vbCancel
Cancel = True
Exit Sub
End Select
End If

End Sub
Deel dit artikel met anderen
reageren op dit artikel ? Reageren ?

NB ! Deze niet invullen !!( is alleen tegen spam bedoeld ). Vul uw email adres in bij 'Emailadres'
Naam:
Email (optioneel):
Tekst:
Resterend aantal tekens:
Tel op vier plus twee =



Verstuur dit artikel naar een kennis  Artikel uitprinten?  PDF versie?

Klik hier om alle Tips te zien !