2017-04-10 112 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