2017-04-10 147 views
1

我想通过窗体上的控件循环并读取值。但“值”和“已选”属性不可用。我的问题是,当我通过它们循环时,如何读取控件的值(在本例中为复选框)?VBA - 通过窗体上的控件循环并读取值

Dim Ctrl as Control 

For Each Ctrl In frmMaintenance.Controls 

    If Left(Ctrl.Name, 7) = "chkType" And **Ctrl.Value = True** Then    

    End if 

Next Ctrl 

回答

2

通过控制循环并检查TypeName。

Dim c As Control 


For Each c In Me.Controls 
    If TypeName(c) = "CheckBox" Then 
     MsgBox c.Value 
    End If 
Next 
+0

谢谢!我发现我无法将控件类型和值的验证放在同一行上。 – SQLiz

+0

@SQLiz这是因为VBA逻辑运算符'And','Or'等不会短路,所以整个布尔表达式都需要进行评估。 –

2

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库正在OptionButtonCheckBox实现相同界面(实际上并不是所有这些令人惊讶的),所以对于这两种类型的控件,上述条件将是True;你可以与其他类型的检查筛选出OptionButton

If TypeOf ctrl Is MSForms.CheckBox And Not TypeOf ctrl Is MSForms.OptionButton Then 

可以说,使用TypeName是简单的,至少在这种情况下MSForms是烦人。但是当您开始需要在VBA中进行类型检查时,您的已知了解TypeOf ... Is