質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

2回答

2694閲覧

if文  コードを短くしたい

yuusaku0325

総合スコア8

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2018/05/23 13:56

a,b,cのテキストボックスが3つあります。
入力する値の大きさは下記が条件です
a>b>c

テキストボックスに入力時に3つの関係が不適切ならメッセージを出すようにしたいです。
例えばb>aなら下記みたいなイメージです

If Val(TextBox2.Text) > Val(TextBox1.Text) Then

  MsgBox("bはaより小さいです")

これをc>b>aで、まとめて比較し、できるようにしたいです

あとコードが長いので短くもしたいです。

現状はこのようになっています。

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
For Each q In Me.Controls.OfType(Of TextBox)()
AddHandler q.Leave, AddressOf TextBoxes_Leave
Next
End Sub
Private Sub TextBoxes_Leave(sender As TextBox, e As EventArgs)
Dim d As Double

If Double.TryParse(sender.Text, d) AndAlso d > 0 Then sender.ResetBackColor() If TextBox2.TextLength <> 0 AndAlso TextBox1.TextLength <> 0 Then If Val(TextBox2.Text) > Val(TextBox1.Text) Then MsgBox("bはaより小さいです") sender.BackColor = Color.Red sender.Focus() End If ElseIf TextBox3.TextLength <> 0 AndAlso TextBox2.TextLength <> 0 Then If Val(TextBox3.Text) > Val(TextBox2.Text) Then MsgBox("cはbより小さいです") sender.BackColor = Color.Red sender.Focus() ElseIf TextBox3.TextLength <> 0 AndAlso TextBox1.TextLength <> 0 Then If Val(TextBox3.Text) > Val(TextBox1.Text) Then MsgBox("cはaより小さいです") sender.BackColor = Color.Red sender.Focus() End If End If End If End If End Sub

補足情報(FW/ツールのバージョンなど)

visualsudaio2017

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ttyp03

2018/05/24 00:11 編集

未入力の場合はどうするのでしょう?(追記)3つのテキストボックス共通のイベントだからそれを考慮する必要があるのか。この質問はスルーでお願いします。
guest

回答2

0

VB

1Public Class NumericTextBox 2 Inherits TextBox 3 4 Private _val As Double 5 6 Public Property Val As Double 7 Get 8 If Double.TryParse(Me.Text, _val) Then 9 Return _val 10 Else 11 Return Double.NaN 12 End If 13 End Get 14 Set(value As Double) 15 Me.Text = Value.ToString() 16 _val = Value 17 End Set 18 End Property 19 20End Class

というクラス(TextBoxを継承)を作っておいて、TextBox をこれに置き換えると

VB

1 Private Sub TextBoxes_Leave(sender As NumericTextBox, e As EventArgs) 2 If sender.Val > 0 Then 3 sender.ResetBackColor() 4 5 If TextBox2.Val > TextBox1.Val Then 6 MsgBox("aはbより小さいです") 7 sender.BackColor = Color.Red 8 sender.Focus() 9 10 ElseIf TextBox3.Val > TextBox2.Val Then 11 MsgBox("bはcより小さいです") 12 sender.BackColor = Color.Red 13 sender.Focus() 14 15 End If 16 End If 17 18 End Sub

となり、幾分すっきりします。

投稿2018/05/26 19:36

編集2018/05/27 10:33
Nyaf

総合スコア108

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

コードが見にくいため、コードの前後に```を追加してください(コードを選択して<code>でもOKです)。


VBはあまり触ったことは無いのでちょっと汚いですが、以下のような処理はいかがでしょうか?

  • 一つの塊に入れることでまとめて処理できるようにする
  • 共通の条件(.TextLength <> 0など)はLINQのAllメソッドでまとめて判定
  • a<b<cの条件は、並び替えをして期待する順番との差異で判定

vb

1'''TextBoxes_Leave 2 3'テキストボックスとa,b,cの対応表 4'インスタンス変数にした方が良さそう 5Dim dic = 6 New Dictionary(Of TextBox, String) From { 7 {TextBox1, "a"}, 8 {TextBox2, "b"}, 9 {TextBox3, "c"}} 10 11'全て0文字以上かつ数値っぽいかどうか 12If Not dic.Keys.All(Function(t) t.TextLength <> 0 AndAlso IsNumeric(t.Text)) Then 13 '1個でもダメなら抜ける 14 Return 15End If 16 17'テキストを数値化してソートして配列化(添え字アクセスのため) 18Dim sorted = dic.OrderBy(Function(kv) Val(kv.Key.Text)).ToArray() 19'念のため a, b, c でソートしてから配列化(添え字アクセスのため) 20Dim kvs = dic.OrderBy(Function(kv) kv.Value).ToArray() 21 22' 順番通りなら`sorted`と`kvs`は同じ順番なはず(もっと良い方法がありそうですが) 23For i = 0 To kvs.Length - 1 24 If kvs(i).Key Is sorted(i).Key Then Continue For 25 26 MsgBox(String.Format("{0}は{1}より小さいです。", sorted(i).Value, kvs(i).Value)) 27 tbx.BackColor = Color.Red 28 tbx.Focus() 29 Return 30 31Next

投稿2018/05/23 16:28

imihito

総合スコア2166

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問