Erreur soudaine « Appel ou argument de procédure invalide » dans VBA

par Philipp Stiefel, initialement publié le 15 août 2019, dernière mise à jour le 2 septembre 2019

Avant de commencer, mettons les choses en perspective: « Appel de procédure invalide ou argument » est une erreur assez courante. Si vous rencontrez cette erreur lors de l’écriture d’un nouveau code, il s’agit probablement d’une erreur réelle dans votre code et non liée au sujet de ce texte.

Si le code de votre application fonctionnait parfaitement mais échoue soudainement avec une erreur d’exécution ‘5’ – « Appel ou argument de procédure invalide », il s’agit probablement d’un problème causé par les mises à jour Windows du 13 août 2019 pour toutes les versions actuelles de Windows.

Cela affecte toutes les versions actuelles d’Office/VBA sur Windows 10, Windows 8.1 et Windows 7 ainsi que tous les systèmes d’exploitation Windows Server de Windows Server 2008 à Windows Server 2019.

Microsoft lui-même a déjà ajouté cet avertissement à la liste « Problèmes connus dans cette mise à jour ».

 » Après l’installation de cette mise à jour, les applications créées à l’aide de Visual Basic 6 (VB6), les macros utilisant Visual Basic for Applications (VBA) et les scripts ou applications utilisant Visual Basic Scripting Edition (VBScript) peuvent cesser de répondre et vous pouvez recevoir une  » erreur d’appel de procédure non valide. »

Microsoft étudie actuellement ce problème et fournira une mise à jour lorsqu’elle sera disponible. »

(Source : L’un des articles de la base de connaissances énumérés ci-dessous)

Voici une liste des mises à jour à l’origine du problème (sans prétention d’exhaustivité):

  • Windows 10, Version 1903 – 13 août 2019 — KB4512508 (Version OS 18362.295)
  • Windows 10, Version 1809 – 13 août 2019 — KB4511553 (Version OS 17763.678)
  • Windows 10, Version 1803 – 13 août 2019 — KB4512501 (Version OS 17134.950)
  • Windows 10, Version 1709 – 13 août 2019 — KB4512516 (Version OS 16299.1331)
  • Windows 10, Version 1703 – 13 août 2019 — KB4512507 (Version OS 15063.1988)
  • Windows 8.1 – 13 août 2019 — KB4512489 (Mise à jour de sécurité uniquement)
  • Windows 8.1 – 13 août 2019 – KB4512488 (Cumul mensuel)

Certains scénarios d’erreur reproductibles causés par la mise à jour Windows

J’ai rencontré deux scénarios différents, bien que liés, l’erreur « Appel ou argument de procédure invalide » se produit en raison de la mise à jour installée. Les deux sont liés à des tableaux vides.

Procédures imbriquées avec des arguments ParamArray

Si votre code contient plusieurs procédures où des arguments ParamArray variables sont passés d’une procédure à l’autre, cela provoquera l’erreur si le tableau de paramètres de niveau supérieur était vide.

Voici un petit exemple de code VBA reproduisant l’erreur.

Public Sub StartParamArrayTest() TestArray1End SubPrivate Sub TestArray1(ParamArray params() En Tant que Variante) TestArray2 paramsEnd SubPrivate Sub TestArray2(ParamArray params() En Tant que Variante) La ligne précédente des params TestArray3 déclenchera l’erreur 5 – « Appel ou argument de procédure invalide » End SubPrivate Sub TestArray3(ParamArray params() En tant que Variante) ‘StubOnly, appelant ceci va augmenter l’erreur alreadyEnd Sub

Je n’ai pas encore trouvé de solution de contournement pour ce scénario d’erreur particulier.

Passage d’un tableau vide ByVal

Si vous passez un tableau vide à une procédure qui attend un argument de type Variant ByVal, l’appel de procédure échouera avec le message d’erreur. Ceci est probablement dû à la même mécanique interne que la situation d’erreur précédente.

Voici un petit exemple reproduisant l’erreur.

Sous Public StartVarArrayTest() Dim testArray() En tant qu’objet TestArrayProc testArray ‘La ligne précédente déclenchera l’erreur 5 – « Appel ou argument de procédure invalide » End SubPrivate Sub TestArrayProc(ByVal varArray En tant que Variante) ‘ Obstinément, l’appel de ceci provoquera l’erreur alreadyEnd Sub

Dans ce cas, l’erreur peut être empêchée d’apparaître en passant le tableau vide ByRef à la procédure.

Sous-TestArrayProc privé (ByRef varArray En tant que Variante) ‘Obstinément, l’appel de cela ne déclenchera PAS le Sous-test errorEnd

Cela devrait être une solution de contournement réalisable dans la plupart des scénarios.

Utilisation de la fonction Tableau pour effacer une zone de liste déroulante à plusieurs valeurs

Si vous utilisez la fonction Tableau sans arguments pour affecter un tableau vide à une variable, vous verrez à nouveau l’erreur « Appel de procédure invalide ». Mais si vous utilisez la fonction Tableau sans arguments pour effacer une liste déroulante à plusieurs valeurs du code VBA, vous verrez une erreur d’exécution 2004 « Il n’y a pas assez de mémoire pour effectuer cette opération. Fermez les programmes inutiles et réessayez l’opération. »

Sous-commande privée Command3_Click() Moi.C’est une erreur.Value=Array()End Sub

Je n’ai pas rencontré cette variante du problème moi-même mais elle a été signalée dans un thread sur le forum Access MDSN.

Autres considérations –  » may peut cesser de répondre… »

Les scénarios mentionnés ci-dessus sont assez faciles à diagnostiquer, une fois que vous connaissez la cause de l’erreur. Cependant, je suis plus inquiet de la partie « peut cesser de répondre » de la description du problème de savoir. C’est quelque chose qui est beaucoup plus difficile à repérer et à diagnostiquer. Maintenant que nous connaissons cette erreur, nous pouvons probablement également diagnostiquer une telle situation, mais sans cette connaissance, trouver la cause aurait été presque impossible.

Solution générale de contournement / Solution temporaire

Tant que Microsoft n’a pas publié une autre mise à jour pour résoudre et résoudre ce problème, la seule véritable « solution » consiste à désinstaller les mises à jour Windows du 13 août 2019. Une fois que vous avez désinstallé la mise à jour, votre code s’exécutera comme avant. Aucune autre mesure n’est nécessaire.

De toute évidence, la désinstallation et le report d’une mise à jour de sécurité pour Windows ne sont pas idéaux. Vous devez déterminer si l’effet de cette mise à jour sur vos applications VBA est suffisamment grave pour le justifier.

À ma connaissance, il n’y a pas encore d’exploit connu pour les problèmes de sécurité résolus avec cette mise à jour. (Avertissement: Je ne suis pas un expert en sécurité!) Donc, compte tenu de plusieurs applications gravement touchées par les problèmes décrits ci-dessus, j’ai recommandé à mes clients de reporter la mise à jour jusqu’à nouvel ordre.

Mise à jour 2019-08-18:Un correctif semble être en cours

Aux dernières heures du 16 août, Microsoft a publié la mise à jour le 16 août 2019 — KB4512494 (Version OS 16299.1365) vers Windows 10, Version 1709 (seulement!).

La liste  » Améliorations et corrections  » de cette mise à jour comprend cet élément :

  • Résout un problème qui peut entraîner l’arrêt des réponses suivantes :
    • Applications créées à l’aide de Visual Basic 6 (VB6).
    • Macros qui utilisent Visual Basic pour les applications (VBA).
    • Scripts ou applications utilisant Visual Basic Scripting Edition (VBScript).

    Vous pouvez également recevoir une erreur « Appel de procédure non valide ».

Ainsi, Microsoft semble vraiment faire un effort pour réparer rapidement ce gâchis. Jusqu’à présent, il n’y a que le correctif pour la version particulière 1709 de Windows 10. Il n’y a pas encore de correctif disponible pour les versions plus récentes de Windows 10, sans parler de Windows 7 ou 8. Néanmoins, c’est une lueur d’espoir à l’horizon, et il semble probable que d’autres mises à jour corrigeant le problème sur d’autres versions de Widows suivront dans la semaine prochaine.

Mise à jour: Un correctif est également disponible pour Windows 8.1 / Windows Server 2012 R2. Cette mise à jour n’est pas répertoriée dans la page Historique des mises à jour de la fenêtre 8.1 sur le site Web de Microsoft et n’est pas disponible via Windows Update. Vous pouvez l’installer via le catalogue Microsoft Update. – Je viens de l’installer sur mon ordinateur de développement principal et il semble corriger toutes les variations reproductibles de cette erreur mentionnée ci-dessus.

Mise à jour 2019-09-02 – Correctifs disponibles pour tous les systèmes d’exploitation

La semaine suivant la mise à jour Windows d’origine, problématique, Microsoft a publié quelques correctifs pour résoudre les problèmes de VBA. Malheureusement, le correctif de la version la plus récente de Windows 10 était manquant depuis un certain temps. Enfin, le 30 août, Microsoft a également publié le path pour Windows 10, V1903.

Il est légèrement ennuyeux que Microsoft encourage les utilisateurs de Windows 10 à mettre à jour la version la plus récente tout le temps, mais publie ensuite le correctif important pour résoudre ce grave problème de VBA des semaines plus tard que les correctifs correspondants pour tous les autres systèmes d’exploitation.

Voici une liste de tous les correctifs corrigeant le problème VBA :

  • Windows 10, version 1903 – 30 août 2019 – KB4512941 (Version OS 18362.329)
  • Windows 10, version 1809 + Windows Server 2019 – 17 août 2019 — KB4512534 (version OS 17763.720)
  • Windows 10, version 1803 – 19 août 2019 — KB4512509 (Version OS 17134.984)
  • Windows 10, version 1709 – 16 août 2019 — KB4512494 (Version OS 16299.1365)
  • Windows 10, version 1703 – 17 août 2019 — KB4512474 (Version OS 15063.2021)
  • Windows 10, version 1607 + Windows Server 2016 – 17 août 2019 — KB4512495 (Version OS 14393.3181)
  • Windows 8.1 Windows Server 2012 R2 – Mise à jour KB4517298 16 août 2019
  • Windows 7 SP1 et Windows Server 2008 R2 SP1: Mise à jour KB4517297 16 août 2019
    (Lien de téléchargement incorrect. Voici le lien de téléchargement correct vers le catalogue Microsoft Update)

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.