我正在编写和重写 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/