by Philipp Stiefel, originally published August 15th, 2019, last updated September 2nd, 2019
Bevor wir beginnen, lassen Sie uns die Dinge relativieren: „Invalid procedure call or argument“ ist ein ziemlich häufiger Fehler. Wenn dieser Fehler beim Schreiben von neuem Code auftritt, handelt es sich höchstwahrscheinlich um einen tatsächlichen Fehler in Ihrem Code und nicht um das Thema dieses Textes.
Wenn der Code Ihrer Anwendung fehlerfrei lief, aber jetzt plötzlich mit einem Laufzeitfehler „5“ – „Ungültiger Prozeduraufruf oder Argument“ fehlschlägt, ist dies wahrscheinlich ein Problem, das durch die Windows-Updates vom 13. August 2019 für alle aktuellen Windows-Versionen verursacht wurde.
Dies betrifft alle aktuellen Versionen von Office/VBA unter Windows 10, Windows 8.1 und Windows 7 sowie alle Windows Server-Betriebssysteme von Windows Server 2008 bis Windows Server 2019.
Microsoft selbst hat diese Warnung bereits zur Liste „Bekannte Probleme in diesem Update“ hinzugefügt.
„Nach der Installation dieses Updates reagieren Anwendungen, die mit Visual Basic 6 (VB6) erstellt wurden, Makros, die Visual Basic für Anwendungen (VBA) verwenden, und Skripte oder Apps, die Visual Basic Scripting Edition (VBScript) verwenden, möglicherweise nicht mehr und es wird der Fehler „Ungültiger Prozeduraufruf“ angezeigt.“
Microsoft untersucht derzeit dieses Problem und wird ein Update bereitstellen, sobald es verfügbar ist.“
(Quelle: Einer der unten aufgeführten KB-Artikel)
Hier ist eine Liste der Updates, die das Problem verursachen (ohne Anspruch auf Vollständigkeit):
- Fenster 10, Version 1903-August 13, 2019—KB4512508 (OS Bauen 18362,295)
- Fenster 10, Version 1809-August 13, 2019—KB4511553 (OS Bauen 17763,678)
- Fenster 10, Version 1803-August 13, 2019— KB4512501 (OS Bauen 17134,950)
- Windows 10, Version 1709-August 13, 2019—KB4512516 (OS Bauen 16299,1331)
- Windows 10, Version 1703-August 13, 2019—KB4512507 (OS Bauen 15063,1988)
- Windows 8.1 – 13.August 2019—KB4512489 (Nur Sicherheitsupdate)
- Windows 8.1 – 13. August 2019-KB4512488 (Monatliches Rollup)
- Einige reproduzierbare Fehlerszenarien, die durch das Windows Update verursacht wurden
- Verschachtelte Prozeduren mit ParamArray-Argumenten
- Übergeben eines leeren Arrays ByVal
- Verwenden der Array-Funktion zum Löschen eines Kombinationsfelds mit mehreren Werten
- Weitere Überlegungen – „… reagiert möglicherweise nicht mehr…“
- Allgemeine Problemumgehung / temporäre Lösung
- Update 2019-08-18: Ein Fix scheint im Gange zu sein …
- Update 02.09.2019 – Patches für alle Betriebssysteme verfügbar
Einige reproduzierbare Fehlerszenarien, die durch das Windows Update verursacht wurden
Ich bin auf zwei verschiedene, wenn auch verwandte Szenarien gestoßen, in denen der Fehler „Ungültiger Prozeduraufruf oder Argument“ aufgrund des installierten Updates auftritt. Beide beziehen sich auf leere Arrays.
Verschachtelte Prozeduren mit ParamArray-Argumenten
Wenn Ihr Code mehrere Prozeduren enthält, bei denen variable ParamArray-Argumente von einer Prozedur an die andere übergeben werden, führt dies zu dem Fehler, wenn das Parameterarray der obersten Ebene leer war.
Hier ist ein kleines VBA-Codebeispiel, das den Fehler reproduziert.
Ich habe noch keine Problemumgehung für dieses spezielle Fehlerszenario gefunden.
Übergeben eines leeren Arrays ByVal
Wenn Sie ein leeres Array an eine Prozedur übergeben, die ein Variant-Argument ByVal erwartet, schlägt der Prozeduraufruf mit der Fehlermeldung fehl. Dies wird wahrscheinlich durch die gleiche interne Mechanik wie die vorherige Fehlersituation verursacht.
Hier ist ein kleines Beispiel, das den Fehler reproduziert.
In diesem Fall kann verhindert werden, dass der Fehler auftritt, indem das leere Array ByRef an die Prozedur übergeben wird.
Dies sollte in den meisten Szenarien eine praktikable Problemumgehung sein.
Verwenden der Array-Funktion zum Löschen eines Kombinationsfelds mit mehreren Werten
Wenn Sie die Array-Funktion ohne Argumente verwenden, um einer Variablen ein leeres Array zuzuweisen, wird erneut der Fehler „Ungültiger Prozeduraufruf“ angezeigt. Wenn Sie jedoch die Array-Funktion ohne Argumente verwenden, um ein Kombinationsfeld mit mehreren Werten aus dem VBA-Code zu löschen, wird der Laufzeitfehler 2004 „Es ist nicht genügend Speicher vorhanden, um diesen Vorgang auszuführen. Schließen Sie nicht benötigte Programme und versuchen Sie den Vorgang erneut.“
Ich habe diese Variation des Problems selbst nicht gefunden, aber es wurde in einem Thread im Access MDSN Forum berichtet.
Weitere Überlegungen – „… reagiert möglicherweise nicht mehr…“
Die oben genannten Szenarien sind ziemlich einfach zu diagnostizieren, sobald Sie die Ursache des Fehlers kennen. Ich mache mir jedoch mehr Sorgen um den Teil „reagiert möglicherweise nicht mehr“ aus der Beschreibung des bekannten Problems. Dies ist viel schwieriger aufzuspüren und zu diagnostizieren. Jetzt, da wir über diesen Fehler Bescheid wissen, können wir wahrscheinlich auch eine solche Situation diagnostizieren, aber ohne dieses Wissen wäre es fast unmöglich gewesen, die Ursache zu finden.
Allgemeine Problemumgehung / temporäre Lösung
Solange Microsoft kein weiteres Update zur Behebung dieses Problems veröffentlicht hat, besteht die einzige wirkliche „Lösung“ darin, die Windows-Updates vom 13. August 2019 zu deinstallieren. Sobald Sie das Update deinstalliert haben, wird Ihr Code wie zuvor ausgeführt. Keine weiteren Maßnahmen erforderlich.
Offensichtlich ist die Deinstallation und Verschiebung eines Sicherheitsupdates für Windows nicht ideal. Sie sollten abwägen, ob die Auswirkungen dieses Updates auf Ihre VBA-Anwendungen stark genug sind, um dies zu rechtfertigen.
Meines Wissens gibt es noch keinen bekannten Exploit für die mit diesem Update behobenen Sicherheitsprobleme. (Haftungsausschluss: Ich bin kein Sicherheitsexperte!) In Anbetracht mehrerer Anwendungen, die von den oben beschriebenen Problemen stark betroffen sind, empfahl ich meinen Kunden, das Update bis auf weiteres zu verschieben.
Update 2019-08-18: Ein Fix scheint im Gange zu sein …
In den späten Stunden des 16.August veröffentlichte Microsoft das Update August 16, 2019—KB4512494 (OS Build 16299.1365) auf Windows 10, Version 1709 (nur!).
Die Liste „Verbesserungen und Korrekturen“ für dieses Update enthält folgendes Element:
- Behebt ein Problem, das dazu führen kann, dass Folgendes nicht mehr reagiert:
- Anwendungen, die mit Visual Basic 6 (VB6) erstellt wurden.
- Makros, die Visual Basic für Anwendungen (VBA) verwenden.
- Skripte oder Apps, die Visual Basic Scripting Edition (VBScript) verwenden.
Möglicherweise wird auch der Fehler „Ungültiger Prozeduraufruf“ angezeigt.
Microsoft scheint also wirklich bemüht zu sein, dieses Durcheinander schnell zu beheben. Bisher gibt es nur den Fix für die jeweilige Version 1709 von Windows 10. Es gibt noch keinen Fix für neuere Versionen von Windows 10, geschweige denn für Windows 7 oder 8. Nichtsdestotrotz ist dies ein Silberstreif am Horizont, und es scheint wahrscheinlich, dass in der nächsten Woche weitere Updates zur Behebung des Problems in anderen Versionen von Widows folgen werden.
Update: Es gibt auch einen Fix für Windows 8.1 / Windows Server 2012 R2. Dieses Update ist nicht auf der Seite Updateverlauf für Windows 8.1 auf der Microsoft-Website aufgeführt und nicht über Windows Update verfügbar. Sie können es über den Microsoft Update-Katalog installieren. – Ich habe es gerade auf meinem Hauptentwicklungscomputer installiert und es scheint alle reproduzierbaren Variationen dieses oben genannten Fehlers zu beheben.
Update 02.09.2019 – Patches für alle Betriebssysteme verfügbar
In der Woche nach dem ursprünglichen, problematischen Windows Update hat Microsoft einige Patches veröffentlicht, um die VBA-Probleme zu beheben. Leider fehlt seit einiger Zeit der Patch für die aktuellste Version von Windows 10 is. Schließlich veröffentlichte Microsoft am 30. August auch den Pfad für Windows 10, V1903.
Es ist etwas ärgerlich, dass Microsoft Windows 10-Benutzer dazu ermutigt, ständig auf die neueste Version zu aktualisieren, dann aber den wichtigen Patch zur Behebung dieses schwerwiegenden VBA-Problems Wochen später veröffentlicht als die entsprechenden Patches für alle anderen Betriebssysteme.
Hier ist eine Liste aller Patches, die das VBA-Problem beheben:
- Windows 10, Version 1903 – August 30, 2019-KB4512941 (OS Build 18362.329)
- Windows 10, Version 1809 + Windows Server 2019 – August 17, 2019—KB4512534 (OS Build 17763.720)
- Fenster 10, version 1803–August 19, 2019—KB4512509 (OS Bauen 17134,984)
- Fenster 10, version 1709-August 16, 2019—KB4512494 (OS Bauen 16299,1365)
- Windows 10, version 1703-August 17, 2019— KB4512474 (OS Bauen 15063,2021)
- Windows 10, version 1607 + Windows Server 2016-August 17, 2019—KB4512495 (OS Bauen 14393,3181)
- Windows 8,1 Windows Server 2012 R2–Update KB4517298 August 16, 2019
- Windows 7 SP1 und Windows Server 2008 R2 SP1: Update KB4517297 16. August 2019
(Falscher Download-Link. Hier ist der korrekte Download-Link zum Microsoft Update-Katalog)