投稿者 魔界の仮面弁士  (社会人) 投稿日時 2018/5/11 18:45:23
とりあえず、こんな感じですかね。
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    MsgBox(Controls.OfType(Of TextBox)().Count(Function(t) t.TextLength = 0) & "個空白です")
End Sub



> For Each o In Me.Controls

対象とするのは、フォーム上に置かれたコントロールだけで構いませんか?

上記の構文の場合、Panel や GruopBox の上に置かれたコントロールは拾われません。
もしも Panel 上のコントロールを列挙する場合は、Me.Controls ではなく Panel1.Controls を使います。


> Dim o As Control
> For Each o In Me.Controls

これは、.NET Framework 1.0 (VB.NET 2002)世代の書き方ですね。
VB.NET 2003 以降では 
For Each o As Control In Me.Controls
にした方が良いですよ。


> If o.GetType Is GetType(TextBox) Then

こういう場合には 
If TypeOf o Is TextBox Then
にした方がスマートでは無いでしょうか。

『o が TextBox クラス』だった場合、どちらの構文も True を返しますが、
『o が TextBox を継承したクラス』が相手の場合、
「o.GetType Is GetType(TextBox)」は False を返し、
「TypeOf o Is TextBox」は True を返す仕様です。


ちなみに、TextBox だけでなく RichTextBox も含めたいような場合には、
If TypeOf o Is TextBoxBase Then
と書けます。(TextBox も RichTextBox も、TextBoxBase を継承しています)