![标准 Excel 错误可以被捕获在自定义 VBA 函数的输入中吗?](https://linux22.com/image/1539765/%E6%A0%87%E5%87%86%20Excel%20%E9%94%99%E8%AF%AF%E5%8F%AF%E4%BB%A5%E8%A2%AB%E6%8D%95%E8%8E%B7%E5%9C%A8%E8%87%AA%E5%AE%9A%E4%B9%89%20VBA%20%E5%87%BD%E6%95%B0%E7%9A%84%E8%BE%93%E5%85%A5%E4%B8%AD%E5%90%97%EF%BC%9F.png)
我想知道 Excel VBA 自定义函数中是否有任何方法可以识别输入数据是标准 Excel 错误之一,例如 #DIV/0!
假设我有一个非常简单的 Excel VBA 自定义函数作为 Myadd
Function Myadd(a, b)
Myadd = a + b
End Function
在 Excel 工作表单元格 A3 中,我输入:=Myadd(A1,A2)
只要 A1 和 A2 是数字,这显然可以正常工作。但如果我在 A1 中创建标准 Excel 错误,例如,=1/0
则会导致 A1 中出现 #DIV/0!,并且 A1 是 Myadd 函数的输入。由于没有数字输入,Myadd 会生成 #VALUE!。
我可以在 VBA 中使用 Isnumeric 函数,但它只适用于本示例。但是,一般来说,我有没有办法知道自定义函数的输入实际上是一个包含错误代码(如 #DIV/0! 或 #VALUE! 等)的单元格?
谢谢。
答案1
对于错误使用IsError()
(#N/A, #VALUE!, #REF!, #DIV/0!, #NUM!, #NAME?, #NULL!
)
要检查参数是否包含单个单元格TypeName(a) = "Range"
,请使用CountLarge > 1
Option Explicit
Public Function MyAdd(ByVal a As Variant, ByVal b As Variant) As Long
If TypeName(a) = "Range" Then If a.Cells.CountLarge > 1 Then Set a = a.Cells(1)
If TypeName(b) = "Range" Then If b.Cells.CountLarge > 1 Then Set b = b.Cells(1)
If IsError(a) Then
a = 0
Else
a = IIf(Not IsNumeric(Val(a)), 0, Val(a))
End If
If IsError(b) Then
b = 0
Else
b = IIf(Not IsNumeric(Val(b)), 0, Val(b))
End If
MyAdd = a + b
End Function