Vba 函数仅在调用对话框的宏中给出错误

Vba 函数仅在调用对话框的宏中给出错误,vba,excel,Vba,Excel,我正在编写并重新编写Excel VBA代码,以使我自己和我公司的其他人更容易进行一些工程分析。因此,我们的目标是让其他人更容易使用,而不是将其集成到我们自己的Excel工作之外的其他代码或目的中 问题是:一些宏将向工作表单元格添加自定义函数,打开函数对话框进行输入,但完成后,出现值错误,说明公式中使用的值的数据类型错误。基于此,我认为当我的函数使用变量或范围类型变量时会出现问题。其中一些函数仅通过某些输入类型给出此错误 但是,在每种情况下,在宏中不使用函数对话框都可以正常工作,手动输入公式也是如

我正在编写并重新编写Excel VBA代码,以使我自己和我公司的其他人更容易进行一些工程分析。因此,我们的目标是让其他人更容易使用,而不是将其集成到我们自己的Excel工作之外的其他代码或目的中

问题是:一些宏将向工作表单元格添加自定义函数,打开函数对话框进行输入,但完成后,出现值错误,说明公式中使用的值的数据类型错误。基于此,我认为当我的函数使用变量或范围类型变量时会出现问题。其中一些函数仅通过某些输入类型给出此错误

但是,在每种情况下,在宏中不使用函数对话框都可以正常工作,手动输入公式也是如此。此外,您所要做的就是双击错误单元格进行编辑,不做任何更改,按enter键,一切正常

我的宏本身非常简单:

Sub NewSTC_dialog()
    ActiveCell.FormulaR1C1 = "=sheetname.xlsm!NewSTC()"
    Application.Dialogs(xlDialogFunctionWizard).Show
End Sub  
我的函数有更多的功能,但不同的函数情况不同,函数本身工作良好,因此最好有一个适用于宏而不是函数内部的解决方案。如果必须的话,我可以逐一分析每一种情况,或者提出一个简化的函数,作为例子给出同样的问题

我迄今为止最好的解决方法(如果我找到了此特定解决方案,我无法重新找到该网站):

设置为方便快捷方式,效果非常好。然而,如上所述,我们的目标是让其他人都能轻松地完成这项工作,这意味着不需要任何额外的东西就能让公式发挥作用。不幸的是,从初始宏中调用此函数将不起作用。事实上,对话框调用之后的任何内容都不会运行。我尝试使用了“错误时继续下一步”,但在对话框调用后它仍然不会运行任何东西

搜索并尝试了一些选项:
以及其中的链接-如前所述,对话框调用之后的任何内容都不会运行,因此不会达到这些调整。在对话框调用之前放置也没有帮助。将对话框调用置于false和true语句之间会使false应用,然后永远不会运行true语句。
-Excel未设置为手动
-SUMIF没有参与

这些都是在Excel2010、Windows7 Professional上实现的

编辑: 下面是创建此行为的示例。这与我的两个函数的行为相似,但并非所有函数都如此,因此,我更希望解决方案在宏中,而不是函数中。这只是为了其他人的测试目的

Function LetNum(input1 As Variant, input2 As Variant) As Integer
    If input1 = "A" Or input1 = "a" Then
        input1 = 100
    ElseIf input1 = 10 Then
        input1 = -10
    End If
    If input2 = "B" Or input2 = "b" Then
        input2 = 200
    ElseIf input2 = 10 Then
        input2 = -1000
    End If
    LetNum = input1 + input2
End Function
Sub LetNum_dialog()
    ActiveCell.FormulaR1C1 = "=LetNum()"
    Application.Dialogs(xlDialogFunctionWizard).Show
End Sub
在这种情况下,按该顺序在对话框中键入A和2是可行的,但在第二个对话框中键入2,然后在第一个对话框中键入A则不行。此外,在第二个框中键入B永远不起作用。在所有情况下,单击以编辑,不更改任何内容,然后按enter键,都可以修复该问题。此外,如果在没有宏的情况下打开对话框,则对话框中的任何情况都可以正常工作

此外,我知道如果您使用引号输入,这种情况会更好,但是excel会自动正确地更改它,而且并非所有函数都是字符串问题

编辑2:

蒂姆的回答是朝着正确方向迈出的一大步!然而,如果任何人都能想出一个不涉及忽略所有错误的解决方案,那就更理想了,因为某些期望的错误抛出被忽略了。同时,我将以不同的方式研究如何处理错误。

问题似乎是,在您的UDF中触发的任何错误都会有效地“禁用”函数向导:请注意,在您获得#值的情况下!错误,
Show()
方法从不返回任何值,调用
Show()
后的任何行都不会执行

在我的测试中唯一解决此问题的方法是在函数中添加一行,在函数向导打开时跳过任何错误:

Dim bSettingUp As Boolean

Function LetNum(input1 As Variant, input2 As Variant) As Integer

    If bSettingUp Then On Error Resume Next

    If input1 = "A" Or input1 = "a" Then
        input1 = 100
    ElseIf input1 = 10 Then
        input1 = -10
    End If
    If input2 = "B" Or input2 = "b" Then
        input2 = 200
    ElseIf input2 = 10 Then
        input2 = -1000
    End If
    LetNum = input1 + input2
End Function

Sub LetNum_dialog()
    ActiveCell.Formula = "=LetNum()"
    bSettingUp = True
    Debug.Print Application.Dialogs(xlDialogFunctionWizard).Show()
    bSettingUp = False
End Sub

我知道你不想改变你的函数,但这是我能找到的唯一解决办法。

提供一个函数的简单示例,它将有助于可靠地导致你看到的问题。好的,用示例编辑。好的,我现在看到了-值!错误仅在某些情况下显示,如果编辑单元格但不进行任何更改,则会消失。对我来说是新的。?嘿,这是一个有趣的潜在解决方案。。。不幸的是,在这种情况下似乎不起作用(为了见鬼,我也试着增加到一整秒……它确实等了一秒钟,但没有改善结果的骰子),我同意这种函数更改,因为它可以相当普遍地应用。谢谢,我稍后会试试这个!这适用于我的每一项功能!有一件事使得这不理想,那就是现在故意的错误被忽略了,这可能意味着我需要以不同的方式来研究发送错误。但是是的,非常有用,谢谢!
Dim bSettingUp As Boolean

Function LetNum(input1 As Variant, input2 As Variant) As Integer

    If bSettingUp Then On Error Resume Next

    If input1 = "A" Or input1 = "a" Then
        input1 = 100
    ElseIf input1 = 10 Then
        input1 = -10
    End If
    If input2 = "B" Or input2 = "b" Then
        input2 = 200
    ElseIf input2 = 10 Then
        input2 = -1000
    End If
    LetNum = input1 + input2
End Function

Sub LetNum_dialog()
    ActiveCell.Formula = "=LetNum()"
    bSettingUp = True
    Debug.Print Application.Dialogs(xlDialogFunctionWizard).Show()
    bSettingUp = False
End Sub