Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 运行时错误49,错误的DLL调用约定_Excel_Vba - Fatal编程技术网

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

Excel 运行时错误49,错误的DLL调用约定,excel,vba,Excel,Vba,Q.每当加载我的加载项时,Excel总是抛出以下错误(运行时错误49,错误的DLL调用约定) 尽管没有外部DLL引用,但对话框每次都会弹出,并且没有错误所在的指示 或 每次我保存一行特定的代码时,Excel都会崩溃 如何修复此问题?此错误可能是由编译器错误引起的。 对此,最简单的解决方案是对代码进行小的更改并重新编译。 我通常做的是 1->将私有枚举类型添加到外接程序中任何模块的顶部 Private Enum Something member = 1 End Enum 2->编译加载

Q.每当加载我的加载项时,Excel总是抛出以下错误(运行时错误49,错误的DLL调用约定)

尽管没有外部DLL引用,但对话框每次都会弹出,并且没有错误所在的指示

每次我保存一行特定的代码时,Excel都会崩溃


如何修复此问题?

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

1->将
私有枚举
类型添加到外接程序中任何模块的顶部

Private Enum Something
    member = 1
End Enum
2->编译加载项

Private Enum Something
    member = 1
End Enum
3->重新启动excel

4->删除所做的代码更改。不再需要了

  • 即使此错误引用外部(DLL)函数调用,它也会 可由以下项的参数或返回值类型不匹配触发: VBA定义的函数或子例程。此外,当 由这些原因触发,调试器有时会显示错误 指向不同的函数调用,通常在 调用堆栈,包括在 问题的情况已经产生。通常情况下,问题会被触发 由于固定类型参数参数或返回值与 变体,反之亦然

    示例:变量值函数返回 在运行时分配给整型变量的长值

    分辨率

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

    分辨率:从修复 语法问题。不幸的是,修复有时应该有效 继续抛出错误,直到重置VBE编辑器。我 还没有推导出解决该问题的最小步骤集,但是 像这样的事情经常奏效:

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

    错误的DLL调用约定

    *传递给动态链接库(DLL)的参数必须完全匹配 那些例行程序所期望的。电话会议涉及电话号码, 参数的类型和顺序。您的程序可能正在调用例程 在传递的DLL中,参数的类型或数量错误

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

    确保传递的参数数与中所示的参数数相同 正在调用的例程的声明

    如果DLL例程要求参数按值,请确保ByVal为 为例程声明中的这些参数指定

    返回参数: 有一件事很容易被忽视 谈论过程参数就是返回参数。确保 它的类型正确,或者没有丢失。Excel/VBA用户 习惯于这样一个事实,即如果您为 函数,系统隐式地将返回类型设置为Variant,并且 它可以处理任何返回的数据。对外宣布的情况并非如此 功能!!必须在DECLARE中声明返回类型 声明*

  • 断开的库引用:检查模块代码的库引用是否有效。在VBA IDE中,选择 Tools=>References查看被引用库的列表并制作 确保所有选中的项目均未标记为“缺少””。如果是,请修复 那些


  • 请注意,我在Excel VBA代码中也遇到了“运行时错误49,错误的DLL调用约定”,该代码一直运行良好


    错误指向一个内部函数调用,我的解决办法是将参数从ByVal更改为ByRef。存在对另一个函数的调用,其中该值已由ref传递,因此这可能是一个因素。

    为了添加另一个可能的原因,我使用Application.OnTime方法调用带有参数的public sub。参数应该是长的(当前行),但我猜它实际上是作为字符串值传递的

    以下是OnTime调用的示例:

    Application.OnTime Now + TimeValue("00:00:01"), "'UpdateEditedPref " & curRow & "'"
    
    我尝试对代码执行任意更新并重新编译,但这并没有解决问题。修复了在被调用的子对象中将参数类型从long更改为string的问题:

    Public Sub UpdateEditedPref(ByVal inRowStr As String)
    
    然后,您只需要将字符串转换为sub中的值。谢天谢地,不再有错误了

    更新:使用Application.OnTime传递参数似乎导致了另一个错误,“无法运行宏”。工作表被锁定时,我遇到此错误。我仍在使用Application.OnTime,但不是passin
        If CompressIntoOneLineON(rg1, rgstart, rgend) or _
           CompressIntoOneLineOS(rg1, rgstart, rgend) or _
           CompressIntoOneLineOGN(rg1, rgstart, rgend) or _
           CompressIntoOneLineOGS(rg1, rgstart, rgend) or _
           CompressIntoOneLineGO(rg1, rgstart, rgend) Then
           <code>
        End If
    
    matched = True
    If CompressIntoOneLineON(rg1, rgstart, rgend) Then
    ElseIf CompressIntoOneLineOS(rg1, rgstart, rgend) Then
    ElseIf CompressIntoOneLineOGN(rg1, rgstart, rgend) Then
    ElseIf CompressIntoOneLineOGS(rg1, rgstart, rgend) Then
    ElseIf CompressIntoOneLineGO(rg1, rgstart, rgend) Then
    Else
      matched = False
    End If
    if matched then
      <code>