vba - 函数只在宏调用对话框中给出错误

标签 vba excel

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

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

但是,在每种情况下,使用函数对话框 Not in the macro 都可以正常工作,就像手动输入公式一样。此外,您所要做的就是双击错误单元格进行编辑,什么都不做,按回车,就可以了!

我的宏本身很简单:

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 专业版上。

编辑:
这是一个创建此行为的示例。这类似于我的两个函数的行为,但不是所有函数,所以我更希望解决方案在宏中,而不是在函数中。这只是为了其他人的测试目的。
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 中触发的任何错误都会有效地“禁用”函数向导:请注意,如果您得到 #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

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

关于vba - 函数只在宏调用对话框中给出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32746055/

相关文章:

excel - 如何在 Excel 宏中获取海报大小

excel - 值在一列中,但不在其他列中

excel - 如何解决 VBA 和 Powershell 之间的这种特殊字符编码问题?

vba - Vlookup 一个 Vlookup 的结果

Excel VBA : How to write column name with commercial at "@" in it

Excel VBA - 循环记录集

vba - 通过编程将MS Word纸张大小设置为PostScript自定义页面大小

excel - Outlook 到 Excel 的超链接问题

java - Apache POI : Difference between row. getLastCellNum 和 row.getNoOfPhysicalCell

vba - 如何从带有参数的按钮调用函数