【问题标题】:ignore "User Defined Type Not Defined" error忽略“未定义用户定义类型”错误
【发布时间】:2015-08-10 07:28:02
【问题描述】:

我遇到了“未定义用户定义类型”的问题,但我不想解决它,我想忽略它。

情况:在word文档(.docm)中我使用外部dll(C#,由我创建,我可以控制它)。此 dll 用于改进对文档的控制(导入模型部件/搜索取决于参数/...)。该dll定义了特定的用户类型

当用户单击按钮时调用自定义 dll。它检查 dll 是否已加载。如果没有,它会显示类似“Actions disabled”这样的消息

调用示例:

' This call is from "ThisDocument"
Private Sub planAction_Click()
    ' If the dll is not load, display warning message
    If Not MqDllInstalled Then
        Call MsgBox("Actions disabled", vbInformation, "Action unavailable")
        Exit Sub
    End If

    ' This function is in a module
    Call FuncPlanAction
End Sub

它调用

Public Sub FuncPlanAction()
    ...
    If exist Then
        ' WordElementType_PlanAction is a "User-Type Defined"
        Call GotoTable(WordElementType_PlanAction, Now)
    End If
    ...
End Sub

以及GotoTable的定义

Private Sub GotoTable(ByVal name As WordElementType, ByVal dt As Date)

所以,如果我点击“planAction”按钮,而不是只显示“Actions disabled”消息,它会引发“User Defined Type Not Defined”,因为它会尝试解析 FuncPlanAction。

我想要的:不会引发错误。

为什么不解决:文档必须共享,如果参考不可用我只是禁用高级功能。

我所知道的:

  • 问题出在哪里:引用未解决,因此找不到用户定义的类型
  • VBA 编译器的工作原理:一旦在其中完成调用,它就会尝试加载模块(如果该模块调用另一个模块,也会发生同样的情况)。因此,在我使用自定义用户类型调用模块之前,不会引发任何“用户类型”。

我尝试过的:

  • 我有一个单独的模块“LoadDll”,没有定义用户类型来尝试加载自定义 dll。如果他找不到要加载的 dll/tlb,则加载时不会出现错误。
  • On error goto/On error resume next包围来电者(在planAction_ClickFuncPlanAction中)
  • 将函数放在不同的模块中

有谁知道如何捕捉这个错误?不提高吗?还有其他建议吗?

提前致谢

【问题讨论】:

    标签: vba


    【解决方案1】:

    尝试替换此行

    Call FuncPlanAction
    

    有了这个

    Call Application.Run("FuncPlanAction")
    

    【讨论】:

    • 这个答案可以使用一些评论来解释它为什么起作用。
    • 当你知道 VBA 编译器是如何工作的时候,这是合乎逻辑的 ;) 就像我在我的问题中解释的那样,vba 在找到对函数/子的引用之前不会加载模块。在我的问题中,Call FuncPlanAction 是在编译时解决的,因为它是一个“静态调用”,而 Application.Run("FuncPlanAction") 在运行时而不是在编译时解决宏。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多