TypeName
会工作,但在一天结束时它是一个字符串比较。
在VBA强类型的类型检查的实际语法是这样的:
TypeOf [object] Is [Type]
所以:
Dim ctrl As Control
For Each ctrl In Me.Controls
If TypeOf ctrl Is MSForms.CheckBox Then
Debug.Print TypeName(ctrl), ctrl.Name, ctrl.Value
End If
Next
现在,有点笨拙的MSForms库正在OptionButton
和CheckBox
实现相同界面(实际上并不是所有这些令人惊讶的),所以对于这两种类型的控件,上述条件将是True
;你可以与其他类型的检查筛选出OptionButton
:
If TypeOf ctrl Is MSForms.CheckBox And Not TypeOf ctrl Is MSForms.OptionButton Then
可以说,使用TypeName
是简单的,至少在这种情况下MSForms
是烦人。但是当您开始需要在VBA中进行类型检查时,您的已知了解TypeOf ... Is
。
谢谢!我发现我无法将控件类型和值的验证放在同一行上。 – SQLiz
@SQLiz这是因为VBA逻辑运算符'And','Or'等不会短路,所以整个布尔表达式都需要进行评估。 –