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

问:Excel会一直抛出下面的错误,只要我的插件被加载(运行时错误49,错误的DLL调用约定)

错误

尽pipe没有外部DLL引用,但每次都会popup对话框,但不显示错误的位置。

要么

问:每当我保存一行代码时,Excel崩溃。

这怎么解决?

这个错误可能是由于编译器错误而发生的。 最简单的解决scheme是做一个小的代码更改和重新编译。 我通常做的是,

1 – >将一个Private Enumtypes添加到插件中的任何模块的顶部

 Private Enum Something member = 1 End Enum 

2 – > 编译插件

3 – >重新启动excel

4 – >删除所做的代码更改。 这不再是必要的。

  1. 即使此错误引用外部(DLL)函数调用,也可能由VBA定义的函数或子例程的参数或返回值types不匹配触发。 而且,当由于这些原因而触发debugging器时,debugging器有时会将错误点显示为不同的函数调用,通常在调用堆栈中更高,包括在创build问题状态之前一直工作稳定的调用。 通常,这个问题是由一个固定types的参数参数或返回值与一个Variant之间的匹配失败触发的,反之亦然。

    示例:Variant-valued函数在运行时返回Long值,该值被分配给Integervariables。

    分辨率

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

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

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

    错误的DLL调用约定

    *传递给dynamic链接库(DLL)的参数必须与例程所期望的完全一致。 调用约定处理参数的数量,types和顺序。 您的程序可能正在调用正在传递错误types或数量的参数的DLL中的例程。

    纠正此错误确保所有参数types与您正在调用的例程声明中指定的参数types一致。

    确保你正在调用你正在调用的例程的声明中传递相同数量的参数。

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

    返回参数在讨论过程参数时可以容易地忽略的一件事是返回参数。 确保它是正确的types,或者它不会丢失。 Excel / VBA用户习惯于这样一个事实,即如果省去函数的返回types,系统将隐式地将返回types设置为Variant,并且它可以与任何返回的数据一起使用。 与外部声明的function不一样! 返回types必须在DECLARE语句中声明。*

  4. 损坏的库引用:检查您的模块代码的库引用是否有效。 在VBA IDE中,select工具=>引用来查看引用的库的列表,并确保没有选中的项目被标记为“ 丢失 ”。 如果是的话,修复这些。

有关信息,我也遇到了Excel VBA代码中运行良好的“运行时错误49,错误的DLL调用约定”

该错误指向一个内部的函数调用,修复我是从ByVal更改参数ByRef。 有一个调用的另一个函数的值已经通过ByRef,所以这可能是一个因素。

只是为了添加另一个可能的原因,我正在使用Application.OnTime方法来调用带参数的公共子。 该参数意味着是一个长(当前行),但我猜它实际上是作为一个string值传递。

这是一个OnTime调用的例子:

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

我试图执行代码的任意更新并重新编译,但是这并没有解决这个问题。 什么修正了它是改变参数types从长到被调用的子string:

 Public Sub UpdateEditedPref(ByVal inRowStr As String) 

那么你只需要将string转换为子内的值。 谢天谢地,没有更多的错误。

更新:使用Application.OnTime传递参数似乎导致了另一个错误,“无法运行macros”。 工作表被locking时,我得到这个错误。 我仍然使用Application.OnTime ,但不是传递参数,而是将值保存在一个全局variables中,并在被调用的子项中使用该值。 这现在似乎工作正常。

OnTime调用现在看起来像这样:

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

OOOOOOOR ,有史以来最好的select:

– 重写例程的名字。

– 然后重新编译!

你现在很好走!

费尔南多的解决scheme运作良好…

在我的情况下,我有一个主要子调用另一个子和代码失败,只是当stream量返回到主子。 我刚更名为Another Sub,重新编译了项目,发现原来的Sub名称时出错。 然后我将它命名为原始,并重新编译而没有问题。

之后,macros没有抛出运行时错误49 …

谢谢

Sysss