Erreur d'exécution 49, convention d'appel DLL incorrecte

Q. Excel continue de lancer l'erreur suivante, chaque fois que mon addin est chargé (Runtime Error 49, Bad DLL calling convention)

Erreur

La boîte de dialog commence à apparaître chaque fois sans indiquer l'origine de l'erreur, même s'il n'y a absolument aucune reference DLL externe.

OU

Q. Excel s'écrase chaque fois que je sauvegarde une ligne de code particulière.

Comment cela peut-il être corrigé?

Cette erreur se produit probablement à cause d'un bug de compilation. La solution la plus simple à cela serait de faire un petit changement de code et de recomstackr. Ce que je fais habituellement, c'est,

1 -> Ajouter un type d'énumération Private Enum en haut de n'importe quel module dans l'ajout

 Private Enum Something member = 1 End Enum Private Enum quelque chose Private Enum Something member = 1 End Enum membre = 1 Private Enum Something member = 1 End Enum 

2 -> Comstack l'ajout

3 -> Redémarrer excel

4 -> Supprimez le changement de code effectué. Ce n'est plus nécessaire.

  1. Bien que cette erreur se réfère à un appel de fonction externe (DLL), il peut être déclenché par un défaut de type de paramètre ou de valeur de return pour une fonction ou sous-programme défini par VBA. En outre, lorsqu'il est déclenché par ces causes, le débogueur affiche parfois le point d'erreur comme un appel de fonction différent, souvent plus élevé dans la stack d'appels, y compris les appels qui ont fonctionné et stable jusqu'à ce que la situation du problème ait été créée. Souvent, le problème est déclenché par une correspondance entre un paramètre de type fixe-argument ou une valeur de return et un Variant ou vice versa.

    Exemple: Une fonction Valeur variable renvoie une valeur Long au moment de l'exécution qui est affecté à une variable Integer.

    Résolution :

    • Vérifiez soigneusement tous les types de parameters et de valeurs de return et les instructions d'affectation, en particulier pour les routines sur lesquelles vous travaillez récemment. Si les fonctions sont de type Variant, elles sont explicitement transmises par type au type correct pour l'affectation.
    • Si la situation ci-dessus est inévitable en raison de l'utilisation de la méthode Application.Run pour appeler une routine dans un classur différent (pour lequel vous n'avez aucun contrôle sur les définitions de parameters), à la suite de la méthode Application.Run passant tous les arguments ByVal, puis , si la routine contenant un sous-set est un Sub, essayez de le convertir en une fonction sans type de return spécifié. Cela semble forcer un nettoyage de la stack et supprime que la condition d'erreur soit lancée à un niveau plus élevé dans la stack d'appels.
  2. Une méthode d'object (par exemple, AutoFit) appliquée à une variation d'object erronée pour laquelle cette méthode n'est pas disponible (comme AutoFit étant appliqué à une plage qui n'est ni une ligne entière ni toute la gamme de colonnes). De même que le scénario ci-dessus, l'erreur peut être lancée au sharepoint return de la routine dans laquelle l'énoncé du problème existe, et non pas sur la déclaration elle-même.

    Résolution : commencez par résoudre le problème de syntaxe. Malheureusement, les corrections qui devraient fonctionner continuent parfois à lancer l'erreur jusqu'à ce que l'éditeur VBE soit réinitialisé. Je n'ai pas déduit l'set minimal d'étapes qui résolvent ce problème, mais quelque chose comme ça fonctionne souvent:

    • Explicit recomstack le projet.
    • Enregistrez le file et fermez-le.
    • Ré-ouvrir le file et relancer le code.
  3. Si un appel vers une fonction de bibliothèque externe est identifié comme le coupable, reportez-vous à la documentation de Microsoft sur l'erreur:

    Méthode d'appel DLL DLN

    * Les arguments passés à une bibliothèque de liens dynamics (DLL) doivent correspondre exactement à ceux attendus par la routine. Les conventions d'appel traitent du nombre, du type et de l'ordre des arguments. Votre programme peut appeler une routine dans une DLL qui est transmise au mauvais type ou au nombre d'arguments.

    Pour corriger cette erreur Assurez-vous que tous les types d'arguments concordent avec ceux spécifiés dans la déclaration de la routine que vous appelez.

    Assurez-vous que vous passez le même nombre d'arguments indiqués dans la déclaration de la routine que vous appelez.

    Si la routine DLL attend des arguments par valeur, assurez-vous que ByVal est spécifié pour ces arguments dans la déclaration pour la routine.

    Argument de return Une chose qui peut être facilement négligée lorsque l'on parle d'arguments de procédure est l'argument de return. Assurez-vous que c'est du type correct, ou qu'il ne manque pas. Les users Excel / VBA sont habitués au fait que si vous excluez un type de return pour une fonction, le système met implicitement le type de return en tant que Variant et fonctionne avec datatables renvoyées. Pas tellement avec des fonctions déclarées de l'extérieur !! Le type de return doit être déclaré dans l'instruction DECLARE. *

  4. Références de la bibliothèque brisée: vérifiez si les references de la bibliothèque pour votre code de module sont valides. Dans l'IDE VBA, select devises => Références pour voir la list des bibliothèques référencées et assurez-vous que aucun des éléments cochés ne sont marqués « Manquant ». Si c'est le cas, corrigez-les.

Pour plus d'informations, j'ai également vécu "Runtime Error 49, Bad DLL calling convention" dans le code VBA Excel qui fonctionnait bien.

L'erreur indiquait un appel de fonction interne et la correction pour moi était de changer un argument de ByVal en ByRef. Il existait un appel à une autre fonction où cette valeur était déjà passée ByRef, donc cela peut avoir été un facteur.

Juste pour append une autre cause possible, j'utilise la méthode Application.OnTime pour appeler un sous public avec un paramètre. Le paramètre doit être long (la ligne actuelle), mais je suppose que c'est réellement passé comme valeur de string.

Voici un exemple de l'appel OnTime:

 Application.OnTime Now + TimeValue("00:00:01"), "'UpdateEditedPref " & curRow & "'" 

J'ai essayé d'effectuer une mise à jour arbitraire du code et de la recomstackr, mais cela n'a pas résolu le problème. Ce qui était réglé, il changeait le type de paramètre de long à ssortingng dans le sous-appelé:

 Public Sub UpdateEditedPref(ByVal inRowStr As Ssortingng) 

Ensuite, il vous suffit de convertir la string en une valeur dans le sous. Heureusement, plus aucune erreur.

Mise à jour: Passer un paramètre à l'aide d' Application.OnTime semble avoir causé une autre erreur, "Impossible d'exécuter la macro". J'avais cette erreur lorsque la feuille de calcul était verrouillée. J'utilise encore Application.OnTime , mais au lieu de passer un paramètre, je sauvegarde la valeur dans une variable globale et j'utilise cette valeur dans le sous-appelé. Cela semble fonctionner correctement.

L'appel OnTime ressemble maintenant à ceci:

 ' Set global variable gCurRow = curRow Application.OnTime Now + TimeValue("00:00:01"), "UpdateEditedPref" 'Définir une variable globale ' Set global variable gCurRow = curRow Application.OnTime Now + TimeValue("00:00:01"), "UpdateEditedPref" gCurRow = curRow ' Set global variable gCurRow = curRow Application.OnTime Now + TimeValue("00:00:01"), "UpdateEditedPref" 

OOOOOOOR , la meilleure option possible:

– Réécris le nom de la routine.

– Ensuite, recomstackz!

Vous êtes bien d'aller maintenant!

La solution de Fernando a bien fonctionné …

Dans mon scénario, j'avais une appel secondaire secondaire, un autre sous et le code échoué juste lorsque le stream est returnné à Main Sub. Je viens de renommer Another Sub, un projet recompilé et j'ai trouvé une erreur en trouvant le sous-nom original. Ensuite, je l'ai renvoyé à l'original et recommencé sans problème.

Après que la macro n'a pas lancé Runtime Error 49 …

Merci

Sysss