gpt4 book ai didi

excel - 如果 VBA.CVErr() 不能支持 vbObjectError 的 Long vartype..,应该如何使用它?

转载 作者:行者123 更新时间:2023-12-04 20:30:31 24 4
gpt4 key购买 nike

我在 Access 2007 VBA 中,尝试从函数返回 #ERROR 值,如下面的代码所示。但我刚刚发现 VBA.CVErr(expression) 将接受的最大数字是 2^15-1,也就是 Integer vartype;不是龙。

这似乎难以理解,因为 VBA 常量 vbObjectError 是 Long。其他错误函数适用于 long;例如:VBA.Error(vbObjectError)工作正常。

鉴于此问题,有什么建议可以正确使用 vbObjectError 将用户定义的错误作为来自用户定义函数的错误对象返回..?

Public Sub TesUDE()
Dim v As Variant
v = UDE()
Debug.Print TypeName(v), VBA.CStr(v)
End Sub

Public Function UDE() As Variant
On Error GoTo ErrorHandler
err.Raise 2 ^ 15 - 1 , , "This is a user-defined error." 'Works.
err.Raise 2 ^ 15 , , "This is a user-defined error." 'Overflow.
err.Raise vbObjectError, , "This is a user-defined error." 'It laughed at me.
ErrorHandler:
UDE = VBA.CVErr(err.Number)
End Function

最佳答案

vbObjectError常量有助于确保您的自定义错误编号永远不会与“内置”错误编号发生冲突,这使得错误处理在某种程度上更加稳健:它确保错误,例如例如,#91 始终表示“未设置对象引用”。

这意味着自定义错误被抛出/引发和处理,尽管 - 不返回。

不要误会我的意思:返回 Error -type 值确实有合法用途;就像您编写用户定义的工作表函数并需要 Excel 来区分例如“提供了无效的引用”(#REF!),“未找到指定值的匹配项”(#N/A),或“我不知道你在说什么”(#NAME?);在 Excel 类型库中,这些错误中的每一个都有相应的 XlErrXxxxx定义的全局常量,其基础值在 2000 年的低位。

完全有可能在 Access 中存在类似的用例(我对 Access 不是很熟悉),这意味着接收错误的调用者是 Access 查询引擎,就像 Excel 中 UDF 的调用者是 Excel 的计算引擎一样。

否则(即如果调用者是其他 VBA 代码),返回错误相当于使用 Error流控制类型,并使事物返回 Variant意思是“这个函数可能会返回某种类型的有意义的值,或者一些错误,也许”......通常会使代码更难阅读/遵循。

因此,在调用者不是您自己的 VBA 代码的用例中,对于错误代码,您的意思是返回为 Error -type 值(这是 更干净,而不是返回一些具有相同含义的魔法非零 Long 数字),您将需要跳过 vbObjectError部分。

想想vbObjectError错误为您的 VBA 代码处理的“内部错误”,以及 Error/CVErr错误作为您的 VBA 代码返回的“面向用户的错误”。作为一种自我造成的约定=)

如果您要公开的错误是您在 VBA 项目的其他地方处理的实际自定义 VBA 错误代码,您需要将其“映射”到“面向用户”错误代码的有限集 - 可能通过定义常量,或他们的枚举:

Private Const ERR_CUSTOM_ERROR_1 = vbObjectError + 42

Public Enum UserFacingError
ErrFooWasNotBarred = &H7E1
ErrSomething
ErrSomethingElse
End Enum

'...

Public Function DoSomething(ByVal foo As Long) As Variant
On Error GoTo ErrHandler
'..."happy path"...
Exit Function
ErrHandler:
Select Case Err.Number
Case 5 'Invalid procedure call/argument
DoSomething = CVErr(ErrFooWasNotBarred)
Case ERR_CUSTOM_ERROR_1
DoSomething = CVErr(ErrSomething)
Case Else
DoSomething = CVErr(ErrSomethingElse)
End Select
End Function

关于excel - 如果 VBA.CVErr() 不能支持 vbObjectError 的 Long vartype..,应该如何使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51790000/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com