Voorkomen dat auto_open en Workbook_Open events worden uitgevoerd
Inhoud
- Inleiding
- Excel als onderdeel van Microsoft 365
- Excel 2010, 2013, 2016
- Excel 2007 en hoger
- Excel 97, 2000, XP, 2003
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:
#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:
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):
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:
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:
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:
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:
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:
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:
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:
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
Al het commentaar over deze pagina:
Commentaar van: masja klein brinke (8-9-2010 08:53:39) deeplink naar dit commentaar
Ik moet een mail openen maar dan moet ik de macro's op laag zetten via de kolom extra op de knoppenbalk in excel 2007.
Die knop ontbreekt, wat kan ik intoetsen zodat ik hetzelfde effect krijg als het ware??
Misschien heb ik het hierboven over het hoofd gezien?
Vriendelijke Groet,
Masja Klein Brinke
Commentaar van: Jan Karel Pieterse (8-9-2010 23:24:25) deeplink naar dit commentaar
Hallo Masja,
Ik begrijp niet helemaal wat je bedoeling is?
Wat bedoel je precies met de "kolom extra op de knoppenbalk", volgens mij is er in Excel 2007 niet zo'n kolom?
Commentaar van: Peter Cox (26-9-2016 18:42:28) deeplink naar dit commentaar
Hallo,
Geregeld moet ik vanuit een internetpagina een document openen in excel. Als ik dit document heb geopend en daarna een zelfde document met andere gegevens open krijg ik van excel de volgende melding: In Excel kunnen geen twee werkmappen met dezelfde naam tegelijk open zijn. Is er in VBA een stukje macro te programmeren zodat het bestaande document gesloten wordt en het nieuwe document toch geopend kan worden?
Groet Peter
Commentaar van: Jan Karel Pieterse (27-9-2016 11:47:57) deeplink naar dit commentaar
Hoi Peter,
Dat is helaas niet mogelijk, de foutmelding wordt door Excel gegenereerd zonder dat enige VBA code getriggerd wordt.
Commentaar van: Cees Timmerman (25-10-2017 17:10:02) deeplink naar dit commentaar
Hallo JK,
Ik heb een Lege Werkmap sjabloon gemaakt met daarin een macro die er voor zorgt dat bij aanroep van een bestaande werkmap vooraf een kopie wordt opgeslagen waarbij aan de bestandsnaam wordt toegevoegd: (Vorige Versie).
Nu wil ik graag dat de macro in deze Lege Werkmap sjabloon bij de eerste keer openen daarvan niet wordt uitgevoerd maar later pas bij openen van de werkmap die door Opslaan Als is omgezet in een werkmap met de extentie xlsm.
Dat zal wellicht kunnen met testen op de extentie xltm maar ik weet niet hoe dat moet.
Kun je me hiermee op weg helpen?
Commentaar van: Jan Karel Pieterse (25-10-2017 20:14:28) deeplink naar dit commentaar
Hoi Cees,
Een bestand dat als kopie van een sjabloon is geopend is nog niet opgeslagen en heeft dus nog geen Path ingevuld:
'Verse kopie van sjabloon nog nooit opgeslagen
ElseIf LCase(ThisWorkbook.Name) Like "*.xltm" Then
'Sjabloon zelf
Else
'Opgeslagen kopie van sjabloon
End If
Commentaar van: Cees Timmerman (27-10-2017 11:57:00) deeplink naar dit commentaar
Dag Jan Karel,
Heel erg bedankt!
Onderstaand de code van het uiteindelijke resultaat, werkt prima en zoals bedoeld.
Heb je nog suggesties?
Gr.,
Cees
Private Sub Workbook_Open()
Dim Antw As Integer
If Len(ThisWorkbook.Path) = 0 Then
'Verse kopie van sjabloon nog nooit opgeslagen
If MsgBox("Deze werkmap moet eerst worden opgeslagen als een werkmap met macro's !" _
+ vbNewLine + vbNewLine + "Kies daarvoor Opslaan Als en gebruik daarbij de extentie .xlsm", vbOKOnly + vbExclamation, " LET OP !!! ") = vbOK Then
End If
ElseIf LCase(ThisWorkbook.Name) Like "*.xlsm" Then
'Sjabloon zelf
Antw = MsgBox("Wilt u deze werkmap vooraf bewaren?" _
+ vbNewLine + vbNewLine + "Aan de bestandsnaam wordt dan (Vorige versie) toegevoegd!", vbOKCancel + vbQuestion, "Bewaren vorige versie")
If Antw = vbOK Then
Map = Application.ActiveWorkbook.Path
Bestandsnaam = Replace(ActiveWorkbook.Name, ".xlsm", "")
ActiveWorkbook.SaveCopyAs Map & "\" & Bestandsnaam & " (Vorige versie).xlsm"
End If
Else
'Opgeslagen kopie van sjabloon
End If
End Sub
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:
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.