投稿者 魔界の仮面弁士  (社会人) 投稿日時 2018/5/15 20:26:04
> 社会人
業務開発でしょうか。
常に『データ型』を意識してコーディングする癖をつけましょう。


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


> empty = (Controls.OfType(Of TextBox)().Count(Function(t) t.TextLength = 0))
Controls を For Each している最中に、その
Controls を再列挙しているようですね。
わざわざ二重に列挙しているのは何故ですか?


> ElseIf o.Text <= 0 Then
Text プロパティは String 型で、
0 というリテラルは Integer 型ですよね。

「<=」の左右で、データ型が違っていますので、これだと
Double 型の比較式として処理されてしまいます。
(なので、Text の内容が Double として解釈できない時にエラーになるわけで)


数値入力に特化させたいのなら、TextBox1.Text ではなく、
NumericUpDown1.Value の利用をお奨めします。(Value は Decimal 型です)

NumericUpDown なら、小数部の桁数や最大値、最小値などを、
デザイン時に決めておくことができますし、数値以外の入力も防げます。

どうしても TextBox が必要なら、数値として変換できることを保証するために、
TryParse メソッドを併用すべきです。


> Dim empty As Integer
> If empty Then
ここは 『If empty > 0 Then』 なのでは?


> テキストボックスの変数はDoubleで宣言しています
「テキストボックスの変数」というのは、どういう意味でしょうか。

たとえば、
 Dim t As TextBox = TextBox1
 Dim s As String = TextBox1.Text
とは書けても、
 Dim d As Double = TextBox1
とは書けないですよね。

もしかして、
 Dim d As Double = TextBox1.Text
ということでしょうか?
だとしたらそれは間違いです。(代入式の左辺が Double 型で、右辺が String 型なので)

こういう場合には、TryParse メソッドを使いましょう。
Dim d As Double = 0.0
If Double.TryParse(TextBox1.Text, d) Then