函数仅在macros调用对话框中发生错误

我正在写和重写Excel VBA代码,以使我和公司的其他人更容易进行一些工程分析。 所以我们的目标是让别人容易,而不是被集成到我们自己的Excel工作以外的其他代码或目的。

问题是:一些macros将自定义函数添加到工作表单元格,调出input的函数对话框,但是当完成后,出现一个值错误,指出公式中使用的值是错误的数据types。 基于此,我相信当我的函数使用Variant或Rangetypes的variables时会出现这个问题。 其中一些function只能通过某些inputtypes给出这个错误。

但是,在任何情况下,使用macros中的函数对话框不工作,就像手动input公式一样。 另外,你所要做的只是双击错误单元格进行编辑,不做任何修改,按回车键就可以了!

我的macros本身就像下面这样简单:

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

我的函数对他们来说更多,但是对于不同的函数,情况是不一样的,而且函数本身工作的很好,所以最好有一个适用于macros而不是函数的解决scheme。 如果必须的话,我可以单独查看每个情况,或者拿出一个同样问题的简化函数作为例子。

到目前为止,我的最佳解决方法(我不能重新find网站,我发现这个特定的解决scheme):

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

设置一个方便的捷径,而且效果很好。 但是,如上所述,目标是让所有人都容易,这意味着不需要额外的东西来使公式工作。 不幸的是,从最初的macros中调用它是行不通的。 事实上,在对话框调用之后没有任何东西会运行。 我尝试使用On Error Resume Next ,在对话框调用之后它仍然不会运行任何东西。

一些选项search和尝试:
如何使用VBA在Excel 2010中刷新单元格? 并在其中的链接 – 如上所述,没有任何位于对话框调用之后将运行,因此将不会达到这些调整。 放在对话框调用之前也没有帮助。 将对话调用放在虚假和真实的语句之间会使错误适用,然后从不运行真正的语句。
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上。

编辑:这是创build此行为的示例。 这与我的两个函数的行为类似,但不是所有这些函数的行为,所以我更喜欢解决scheme在macros中,而不是函数。 这只是为了其他人的testing目的。

 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 

在这种情况下,按顺序在对话框中inputA和2,但是2到第二个,然后A到第一个不能。 此外,在第二个框中键入B从不起作用。 在所有情况下,单击编辑,不做任何更改,然后按回车键修复它。 另外,如果在没有macros的情况下调用对话框,任何情况都可以正常工作。

此外,我知道这种情况下工作更好,如果你input引号,但Excel会自动改变它正确的,并不是我所有的函数是string问题。

编辑2:
蒂姆的回答是朝正确方向迈出的一大步 但是,如果有人能够提出一个不涉及忽略所有错误的解决scheme,那么由于忽略了一些期望的错误抛出,这将是更理想的。 在此期间,我将着眼于处理错误。

这个问题似乎是,在您的UDF触发的任何错误有效“禁用”function向导:请注意,如果您获得#VALUE! 错误, Show()方法永远不会返回任何值,并且调用Show()之后的任何行都不会执行。

在我的testing中解决这个问题的唯一方法是在函数向导打开时跳过所有错误的函数中添加一行:

 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 

我知道你不想改变你的function,但是这是我能find的唯一工作。