Voorkomen dat auto_open en Workbook_Open events worden uitgevoerd

Inhoud

Inleiding

Omdat ik software ontwikkelaar ben, komt het regelmatig voor dat ik een Excel bestand wil openen met de macro's ingeschakeld. Tegelijkertijd wil ik daarbij soms voorkomen dat het Workbook_Open event of de Auto_Open macro wordt uitgevoerd. In dit artikel laat ik zien hoe dit in de verschillende Excel versies kan worden gedaan.

Waarom zou ik dit moeten willen, vraagt je je af? Ik doe dit bijvoorbeeld met mijn eigen bestanden die ik nog aan het ontwikkelen ben. Het Open event kan code bevatten die enige tijd nodig heeft om uitgevoerd te worden, of bevat routines die het project configureren op een manier die ik (tijdelijk) wil omzeilen wanneer ik aan het bestand ga werken.

Indien een bestand dat je opent op de hieronder beschreven manieren nog meer event code bevat, dan zal deze event code pas reageren op de events nadat je zelf een macro hebt gestart in het bestand (bijvoorbeeld door op een knop te drukken of een menu keuze te maken) of nadat een User Defined Functie is uitgevoerd.

Ik raad af om deze methode toe te passen op bestanden waarvan je de herkomst niet kent. De VBA code kan events bevatten die toch worden uitgevoerd na openen van het bestand en eventueel ongewenste opdrachten uitvoeren.

Excel als onderdeel van Microsoft 365

Recentelijk is het gedrag van Excel op dit gebied gewijzigd en kan je niet langer met de Shift toets voorkomen dat het Open event wordt uitgevoerd, Zoals hieronder al beschreven is. Gelukkig heb ik wat alternatieven bedacht:

Workaround 1, events uitschakelen

Open de VBA editor, druk op control+g

Plak deze regel code in het venstertje dat opent en druk op Enter:

Application.EnableEvents = False

Open nu het bestand in kewstie.

Merk op dat geen van de applicatie of werkmap events meer worden uitgevoerd, dus als je die weer werkend wil hebben zal je in bovenstaand regeltje False op True moeten zetten en weer op enter moeten drukken.

Workaround 2: Detecteer dat de shift toets is ingedrukt

Als het bestand van jou zelf is en je gewoon een maier nodig hebt om te voorkomen dat het Open event wordt uitgevoerd (of gelijk welk ander event) terwijl jij de shift toets ingedrukt hebt, dan kan je code gebruiken zoals deze:

Option Explicit

#If VBA7 Then
    Declare PtrSafe Function GetKeyState Lib "USER32" (ByVal vKey As Long) As Integer
#Else
    Declare Function GetKeyState Lib "USER32" (ByVal vKey As Long) As Integer
#End If

Const SHIFT_KEY As Long = &H10

Function
ShiftPressed() As Boolean
'Returns True if shift key is pressed
    ShiftPressed = GetKeyState(SHIFT_KEY) < 0
End Function

Private Sub Workbook_Open()
    If ShiftPressed Then Exit Sub
    MsgBox "You did not hold down the shift key while the file was opened"
End Sub

Workaround 3: Detecteer de aanwezigheid van een specifiek bestand in dezelfde map als waar het Excel bestand is opgeslagen

Sommige collega's van mij gebruiken deze techniek: Simpelweg een leeg txt bestandje plaatsen in dezelfde map als waar het bestand met de macro staat en dan in de macro testen op aanwezigheid van dat bestand. Je kan vervolgens met de Dir opdracht eenvoudig detecteren of de code moet stoppen:

If Len(Dir(ThisWorkbook.Path & "SomeMadeUPFileName.txt") > 0 Then
'Doe iets

Excel 2010, 2013, 2016

Macro beveiligingsniveau op "Alle macro's inschakelen", of een "vertrouwd" document

Als je het macro beveiligingsniveau hebt ingesteld op "Alle macro's inschakelen", of als het document al eerder hebt geopend en macro's hebt ingeschakeld (waardoor het document als een "vertrouwd" document is ingesteld), of als je het document in een vertrouwde map staat, kies dan Bestand, Openen en selecteer je bestand. Houdt de shift toets ingedrukt terwijl je op de Openen knop klikt:

Een bestand selecteren uit het Bestand, Openen dialoogvenster (Excel 2010)

Fig. 1: Een bestand selecteren uit het Bestand, Openen dialoogvenster (Excel 2010, 2013, 2016)

Uiteraard kan het bestand in de lijst Onlangs geopende documenten staan. In dat geval houd je de shift knop ingedrukt terwijl je op het bestand klikt in de lijst (ten tijde van het schrijven van dit artikel was de Nederlandse versie van Excel 2010 nog niet beschikbaar):

Klik op een bestand in de lijst Onlangs geopende documenten (Excel 2010)

Fig. 2: Klik op een bestand in de lijst Onlangs geopende documenten (Excel 2010)

Door dit te doen voorkom je uitvoering van zowel het Workbook_Open als de Auto_Open macro.

Macro beveiliging ingesteld op "Alle macro's uitschakelen, met melding"

Volg eerst de aanwijzingen hierboven.

Normaal gesproken, als je een dergelijk bestand opent toont Excel de balk met de beveiligingswaarschuwing. Als je echter de shift toets had ingedrukt, dan verschijnt dit venster:

Macro's inschakelen dialoogvenster (Excel 2010)

fig 3: Macro's inschakelen dialoogvenster (Excel 2010)

Omdat je de shift toets ingedrukt hield toen je het bestand aanklikte in de lijst met onlangs geopende documenten, of toen je op de "Openen" knop klikte, zullen er geen Automacros worden uitgevoerd.

Excel 2007 en hoger

Macro beveiligingsniveau op "Alle macro's inschakelen", of een "vertrouwd" document

Indien de vertrouwde map zich op het network bevindt, dan voorkomt het indrukken van de shift toets het starten van de macro helaas niet!

Als je het macro beveiligingsniveau hebt ingesteld op "Alle macro's inschakelen", of als je het document in een "vertrouwde" map hebt opgeslagen, of als het bestand macro's bevat van een vertrouwde uitgever, kies dan Bestand, Openen en selecteer je bestand. Houdt de shift toets ingedrukt terwijl je op de Openen knop klikt:

Een bestand selecteren uit het Bestand, Openen dialoogvenster (Excel 2007)

Fig. 4: Een bestand selecteren uit het Bestand, Openen dialoogvenster (Excel 2007 en hoger)

Uiteraard kan je bestand in de lijst "Onlangs geopende documenten" staan. In dat geval houd je de shift knop ingedrukt terwijl je op het bestand klikt in de lijst:

Het bestand kiezen uit de lijst Onlangs geopende documenten (Excel 2007)

Fig. 5: Het bestand kiezen uit de lijst Onlangs geopende documenten (Excel 2007 en hoger)

Hierdoor voorkom je het uitvoeren van het Workbook_Open event en een Auto_Open macro.

Macro beveiliging ingesteld op "Macro's uitschakelen, met melding"

Volg eerst de aanwijzingen die hierboven staan.

Normaal gesproken, als je een bestand met macro's opent, dan toont Excel de beveiligingswaarschuwing. Als je echter de shift toets had ingedrukt, dan verschijnt dit venster:

Macro's inschakelen dialoogvenster (Excel 2007)

fig 6: Macro's inschakelen dialoogvenster (Excel 2007 en hoger)

Omdat je de shift toets ingedrukt hield toen je het bestand aanklikte in de lijst met onlangs geopende documenten, of toen je op de "Openen" knop klikte, zullen er geen Automacros worden uitgevoerd.

Excel 97, 2000, XP, 2003

Macro beveiliging op laag of een vertrouwde uitgever

In het geval dat je macro beveiliging op laag staat, of wanneer je bestand gesigneerde code bevat waarvan je de uitgever als betrouwbaar hebt aangeduid, moet je de shift knop al indrukken op het moment dat je op Openen klikt in het Bestand, Openen dialoogvenster:

Het bestand openen vanuit het Bestand, Openen venster (Excel 97-2003)

Fig. 7: Het bestand openen vanuit het Bestand, Openen venster (Excel 97-2003)

Uiteraard kan het zijn dat het bestand in je lijst met recent geopende documenten staat. In dat geval moet je de shift toets ingedrukt houden terwijl je op het bestand klikt:

Klik op een bestand in de lijst Onlangs geopende documenten (Excel 97-2003)

Fig. 8: Klik op een bestand in de lijst Onlangs geopende documenten (Excel 97-2003)

Op deze manier voorkom je dat het Workbook_Open event wordt uitgevoerd en dat een Auto_Open macro start.

Macro beveiliging op gemiddeld of hoger

Als je macro beveiligingsniveau tenminste op "Gemiddeld" staat en je de uitgever van de macro nog nooit als betrouwbaar hebt aangevinkt, dan hoef je geen shift in te drukken als je op Openen klikt of als je het bestand aanwijst in de lijst met onlangs geopende documenten. In plaats daarvan moet je de shift toets indrukken als je macro's gaat inschakelen:

Houdt shift ingedrukt terwijl je op Macro's inschakelen klikt.

Fig.9: Houdt shift ingedrukt terwijl je op Macro's inschakelen klikt.

Op deze manier voorkom je dat het Workbook_Open event wordt uitgevoerd en dat een Auto_Open macro start.

 


Vragen, suggesties en opmerkingen

Laatste 8 commentaren van in totaal 15 (Toon ze allemaal):

 


Commentaar van: Adr (28-10-2019 12:26:00) deeplink naar dit commentaar

Goedemiddag,

Als ik in een macro een werkmap wil openen dat krijg ik steeds de boodschap:"In Excel kunnen geen twee werkmappen met dezelfde naam tegelijk worden geopend".

De werkmap is echter niet reeds geopend.

Zelfs bij het sluiten van een werkmap met een (andere) macro krijg ik dezelfde boodschap.

Kun t u mij zeggen wat de oorzaak hiervan is?

Met vriendelijke groet

Adrie Kooijman 0620 570076


Commentaar van: Jan Karel Pieterse (28-10-2019 13:33:00) deeplink naar dit commentaar

Hoi Adrie,

Het is zeer waarschijnlijk dat het betreffende bestand toch in Excel open staat, of een bestand met dezelfde naam (maar niet noodzakelijkerwijs op dezelfde lokatie).


Commentaar van: Filip (24-5-2020 11:20:00) deeplink naar dit commentaar

Goedemorgen iedereen.
Is er iemand die me info kan geven hoe ik een messagebox kan krijgen op maandag en donderdag wanneer ik een excell bestand open.Deze messagebox zou er ook opnieuw moeten komen als ik het bestand afsluit.
Alvast bedankt
Filip


Commentaar van: Jan Karel Pieterse (25-5-2020 10:34:00) deeplink naar dit commentaar

Hoi Filip,

Plaats dit in ThisWorkbook:

Private Sub Workbook_Open()
    Select Case Weekday(Date)
    Case 2, 5
        MsgBox "Ping!"
    Case Else
    'niks doen
    End Select
End Sub


Commentaar van: Rudi de jong (8-10-2020 11:23:00) deeplink naar dit commentaar

Hoe kan ik een automatische macro uit laten voeren terwijl de macro's uitgeschakeld zijn in het vertrouwenscentrum?
Het wordt een bestand waar veel collega's gebruik van gaan maken en we willen niet dat iedereen de macro's inschakelt.


Commentaar van: Jan Karel Pieterse (8-10-2020 17:29:00) deeplink naar dit commentaar

Hoi Rudi,

Ik begrijp je vraag niet helemaal; aan de ene kant zeg je een macro te willen uitvoeren terwijl macro's uitgeschakeld zijn (vanwege de veiligheid is dit gelukkig onmogelijk!) en aan de andere kant wil je niet dat iedereen de macro uitvoert. Wat is de bedoeling?


Commentaar van: Rudi (9-10-2020 06:39:00) deeplink naar dit commentaar

Ik heb een macro gemaakt die automatisch uitgevoerd wordt bij het openen van het bestand. Op deze manier kunnen we bijhouden wie het bestand geopend heeft. Dit heeft met eisen van de iso certificering te maken. Verder worden er geen macros gebruikt. Wanneer een gebruiker zijn/haar macros zou uitschakelen wordt deze logging niet.meer bijgehouden.


Commentaar van: Jan Karel Pieterse (12-10-2020 14:10:00) deeplink naar dit commentaar

Hoi Rudi,

Wat ik zou doen is code toevoegen die:

- Bij opslaan alle werkbladen verbergt op één na
- Bij openen het omgekeerde doet

Op dat ene tabblad zet je met grote letters dat men om het bestand te kunnen bewerken macro's moet inschakelen.


Heeft u vragen, suggesties of opmerkingen? Gebruik dan dit formulier.

Mocht uw vraag niet direct relevant zijn voor deze pagina, maar een algemene Excel vraag betreffen, dan adviseer ik om deze hier te stellen: excelexperts.nl/forum/index.php.




Als u VBA code in uw commentaar plaatst, gebruik dan [VB] tags: [VB]Uw code[/VB].