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

时间:2015-09-23 17:40:11

标签: excel vba excel-vba

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

问题:一些宏会向工作表单元格添加一个自定义函数,打开输入的函数对话框,但是当完成时,会出现一个Value错误,说明在公式是错误的数据类型。基于此,我相信当我的函数使用Variant或Range类型变量时会出现问题。其中一些函数仅通过某些输入类型提供此错误。

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

我的宏本身就像:

Sub NewSTC_dialog()
    ActiveCell.FormulaR1C1 = "=sheetname.xlsm!NewSTC()"
    Application.Dialogs(xlDialogFunctionWizard).Show
End Sub  

我的函数对它们有更多功能,但不同函数的情况不同,函数本身工作正常,因此最好有一个适用于宏而不是函数内的解决方案。如果必须的话,我可以单独介绍每种情况,或者提出一个简单的函数,它具有相同的问题作为示例。

到目前为止我的最佳解决方法(我无法重新找到该网站,我找到了这个特殊的解决方案):

Sub Recalculate()
    ActiveCell.Replace What:="=", Replacement:="="
End Sub  

设置为方便的快捷方式,效果很好。但是,如上所述,目标是让其他人都能轻松实现这一目标,这意味着不需要任何其他方法来使公式发挥作用。不幸的是,从初始宏中调用它将不起作用。实际上,对话框调用之后的任何内容都不会运行。我尝试使用On Error Resume Next,但在对话调用后仍然无法运行任何内容。

搜索并尝试了一些选项:
How to refresh cells in Excel 2010 using VBA?及其中的链接 - 如上所述,对话调用之后的任何内容都无法运行,因此无法实现这些调整。在对话调用之前放置也没有帮助。将对话框调用放在false和true语句之间会使false应用,然后永远不会运行true语句 http://www.excelforum.com/excel-general/471632-formula-do-not-work-until-edited.html - Excel未设置为手动
http://blog.contextures.com/archives/2012/02/16/excel-formulas-not-calculating/ - 没有参与SUMIF

这完全适用于Excel 2010,Windows 7 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:
蒂姆的回答是迈向正确方向的重要一步!但是,如果任何人都能提出一个并不涉及忽略所有错误的解决方案,那么由于忽略了某些所需的错误抛出,这将更加理想。在此期间,我将以不同的方式研究处理错误。

1 个答案:

答案 0 :(得分:1)

问题似乎是UDF中触发的任何错误都会“禁用”函数向导:请注意,如果你得到#VALUE!错误,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

我知道你宁愿不改变你的功能,但这是我能找到的唯一解决办法。