如果传递的参数不在可接受的值范围内,我需要对象的“Let”属性来引发用户定义的运行时错误(由我定义的编号和描述)。
我提出了错误,但我无法让错误包含我定义的编号和描述。
' Class Module: myPerson
Private m_Age As Integer
Property Let Age(yearsOld As Integer)
If yearsOld >= 0 Then
m_Age = yearsOld
Else
Err.Clear 'Make sure we start from a clean slate
Err.Raise Number:=vbObjectError + 513, Source:="Book1.myPerson.LetAge", Description:="Positive integer required"
End If
End Property
Property Get Age() As Integer
Age = m_Age
End Property
'Normal Module 1
Sub use_myPersonClass()
Dim aPerson As myPerson
Set aPerson = New myPerson
aPerson.Age = -1 'Raises a runtime error but not my user-defined runtime error
End Sub
我不明白为什么表达式“vbObjectError + 513”,将513添加到-2147221504,会方便地有助于我个人错误号的定义,但我不在乎。我只是按照文档进行操作。
我的主要问题是我没有得到我个人对错误的描述。
使用 Excel for Mac 16.78.3 我明白了
在正常的模块代码中应用此解决方法。
'Normal Module 1
Sub use_myPersonClass()
Dim aPerson As myPerson
Set aPerson = New myPerson
On Error Resume Next
aPerson.Age = -1 'Raises a runtime error but not my user-defined runtime error
If Err <> 0 Then
MsgBox "Error: " & Err.Number - vbObjectError & Chr(10) & Err.Description, , Err.Source
End If
On Error GoTo 0
End Sub
有关 Err.Raise 的更多详细信息
此方法仅在标准模块中才能完全发挥作用。
这是 Err.Raise 方法在标准模块中时的结果。
在所有其他模块(类、表)中,错误。对象参数填充了分配的值,但错误生成的消息不反映它们。
但是,分配的值存储在 Err 对象中,并且代码片段显示所有分配的值都在 Class 模块的命令中声明,并且可以通过 Err 对象属性来实现。
Description
参数未反映在错误消息中,仅供参考,可以通过 Err.Description 获取。
如果将相同的命令放置在标准模块之外的另一个模块中,则错误消息仅反映错误的正确编号(用户定义)和一些其他描述(内置)。这就是你所经历的。 确实这不太好。
建议使用 vbObjectError 常量作为用户定义错误的基础,以避免引用内置错误代码。
由于使用对象的例程不应该负责检测该对象不喜欢它的使用方式,因此我建议在上面黑猫的贡献的基础上,解决我在以下方式:
' Class Module: myPerson
Private m_Age As Integer
Property Let Age(yearsOld As Integer)
If yearsOld >= 0 Then
m_Age = yearsOld
Else
MsgBox ("Object myPerson Property Let Age : invalid parameter, positive integer required")
'This message to compensate for the VBA limitation documented below
Err.Raise Number:=vbObjectError + 513, Source:="Book1.myPerson.LetAge", Description:="Positive integer required" 'Fatal runtime error raised
'Limitation of VBA (on macOS ?) : none of the properties of the Err object specified above is displayed correctly
End If
End Property
Property Get Age() As Integer
Age = m_Age
End Property
'Normal Module 1
Sub use_myPersonClass()
Dim aPerson As myPerson
Set aPerson = New myPerson
aPerson.Age = -1 'Raises a runtime error
End Sub
干杯,
努诺夫