投稿者 魔界の仮面弁士  (社会人) 投稿日時 2018/5/16 00:24:43
「ゆうさく」さんと、「コントロールをまとめて操作。」さんは同じ方ですか? あるいは同僚?


> a = Val(TextBox1.Text)

この書き方だとエラーになりえますので、これも先の回答と同じ理由により NG です。
TryParse を使うとか、NumericUpDown に切り替えるなどするのが安全かと思います。

Val を使った変換は、一見うまくいくかのようにも見えますが、たとえば 
 TextBox1.Text = "1.2%"
 a = Val(TextBox1.Text)
などのように、変換できずに InvalidCastException となるパターンがあります。



> emptyのところに空欄のテキストボックスの数が入るようにしたいです

その代入操作を、For Each のループ処理で、繰り返し行っている理由が分からなかったのです。

前回のコード例にて、ループ処理せずに使わずにカウントする方法を提示していますよね。
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim emptyCount As Integer = Controls.OfType(Of TextBox)().Count(Function(t) t.TextLength = 0)
    MsgBox(emptyCount & "個空白です")
End Sub




>> For Each o As Control In Me.Controls
>>  If TypeOf o Is TextBox Then
>>      If o.Text = "" Then
> 先の例のように、OfType で絞り込んだ方が手っ取り早いかと。

これは要するに、For Each をするにしても、わざわざ TypeOf や .GetType() で型判定せずとも、
最初の回答に載せた OfType を用いてやれば良いのではないか、という意味です。
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim emptyCount As Integer = 0
    Dim nonValueCount As Integer = 0
    Dim minusCount As Integer = 0

    Dim d As Double
    For Each txt In Me.Controls.OfType(Of TextBox)()
        If txt.TextLength = 0 Then
            emptyCount += 1
        ElseIf Not Double.TryParse(txt.Text, d) Then
            nonValueCount += 1
        ElseIf d < 0.0 Then
            minusCount += 1
        End If
    Next

    MsgBox("空白=" & emptyCount & "/非数値=" & nonValueCount & "/負数=" & minusCount)
End Sub