2017-04-10 3 views
1

フォームのコントロールをループして値を読み取る必要があります。ただし、ValueプロパティとCheckedプロパティは使用できません。私の質問は、どのように私はそれらをループするときにコントロール(この場合はチェックボックス)の値を読み取ることができますですか?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になります。 TypeNameを使用して、少なくともMSFormsが迷惑され、この場合には、単純である、間違いなく

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

:あなたは別の型チェックとOptionButtonをフィルタリングすることができます。しかし、にはがあり、VBAでタイプチェックを開始するときにはTypeOf ... Isを知ることができます。

関連する問題