运行时错误49,错误的DLL调用约定

Ani*_*han 9 excel vba

问:无论何时加载我的插件,Excel都会抛出以下错误(运行时错误49,错误的DLL调用约定)

错误

尽管绝对没有外部DLL引用,但每次都会弹出对话框,但没有指出错误的位置.

要么

问:每次保存特定代​​码行时Excel都会崩溃.

怎么解决这个问题?

Ani*_*han 14

由于编译器错误,可能会发生此错误.对此最简单的解决方案是进行小的代码更改并重新编译.我通常做的是,

1 - >将Private Enum类型添加到插件中任何模块的顶部

Private Enum Something
    member = 1
End Enum
Run Code Online (Sandbox Code Playgroud)

2 - > 编译插件

3 - >重启excel

4 - >删除所做的代码更改.它不再是必要的.

  • 我使用以下快捷键:`Ctrl + A` - `Ctrl + X` - `Ctrl + V` - `Ald + D` - `L` (4认同)

pst*_*ton 7

  1. 即使此错误引用外部(DLL)函数调用,也可以通过VBA定义的函数或子例程的参数或返回值类型不匹配来触发.此外,当由这些原因触发时,调试器有时会将错误点显示为不同的函数调用,通常在调用堆栈中更高,包括在创建问题情况之前一直工作且稳定的调用.通常,问题是由固定类型参数参数或返回值与Variant之间的未匹配触发,反之亦然.

    示例:Variant-valued函数在运行时返回一个Long值,该值分配给Integer变量.

    决议:

    • 仔细检查所有参数参数和返回值类型和赋值语句,尤其是对于您最近使用的例程.如果有任何变量值函数,则明确地为转换类型转换为正确的类型.
    • 如果由于使用Application.Run方法调用不同工作簿中的例程(对此无法控制参数定义)而导致上述情况不可避免,则由于Application.Run方法传递所有参数ByVal,则,如果包含例程是Sub,请尝试将其转换为没有指定返回类型的Function.这似乎强制清理堆栈并抑制在调用堆栈中抛出更高级别的错误情况.
  2. 应用于该方法不可用的错误对象变体的对象方法(如AutoFit)(例如,AutoFit应用于既不是整行也不是整个列范围的范围).与上述场景类似,错误可能在问题语句存在的例程的返回点处抛出,而不是在语句本身处抛出.

    解决方案:从修复语法问题开始.不幸的是,有效的修复程序有时会继续抛出错误,直到重置VBE编辑器.我没有推断出解决该问题的最小步骤,但这样的事情通常有效:

    • 显式重新编译项目.
    • 保存文件并关闭它.
    • 重新打开文件并重新运行代码.
  3. 如果对外部库函数的调用被识别为罪魁祸首,请参阅Microsoft关于错误的文档:

    错误的DLL调用约定

    *传递给动态链接库(DLL)的参数必须与例程所期望的完全匹配.调用约定处理参数的数量,类型和顺序.您的程序可能正在调用DLL中的例程,该例程正在传递错误类型或数量的参数.

    要更正此错误,请确保所有参数类型与您正在调用的例程声明中指定的参数类型一致.

    确保传递的是您正在调用的例程声明中指示的相同数量的参数.

    如果DLL例程需要按值进行参数,请确保在例程的声明中为这些参数指定了ByVal.

    返回参数:在讨论过程参数时可以轻易忽略的一点是返回参数.确保它的类型正确,或者不丢失.Excel/VBA用户习惯于如果省略函数的返回类型,系统会隐式地将返回类型设置为Variant,并且它可以处理任何返回的数据.外部声明的功能不是这样!! 返回类型必须在DECLARE语句中声明.*

  4. 已损坏的库引用:检查模块代码的库引用是否有效.在VBA IDE中,选择 Tools => References以查看引用库的列表,并确保没有任何选中的项标记为" Missing ".如果是这样,请修复它们.


Fer*_*des 7

或者,有史以来最好的选择:

- 重写例程的名称。

- 然后重新编译!

你现在可以走了!

  • 在测试之前给出 -1 的答案实际上是我强烈反对的。 (2认同)