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

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

ただいまの
回答率

90.48%

  • VB.NET

    940questions

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

if文  コードを短くしたい

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 242

yuusaku0325

score 2

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 

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • ttyp03

    2018/05/24 09:07 編集

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

    キャンセル

回答 2

+2

Public Class NumericTextBox
    Inherits TextBox

    Private _val As Double

    Public Property Val As Double
        Get
            If Double.TryParse(Me.Text, _val) Then
                Return _val
            Else
                Return Double.NaN
            End If
        End Get
        Set(value As Double)
            Me.Text = Value.ToString()
            _val = Value
        End Set
    End Property

End Class


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

    Private Sub TextBoxes_Leave(sender As NumericTextBox, e As EventArgs)
        If sender.Val > 0 Then
            sender.ResetBackColor()

            If TextBox2.Val > TextBox1.Val Then
                MsgBox("aはbより小さいです")
                sender.BackColor = Color.Red
                sender.Focus()

            ElseIf TextBox3.Val > TextBox2.Val Then
                MsgBox("bはcより小さいです")
                sender.BackColor = Color.Red
                sender.Focus()

            End If
        End If

    End Sub


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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

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


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

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

'テキストボックスとa,b,cの対応表
'インスタンス変数にした方が良さそう
Dim dic =
    New Dictionary(Of TextBox, String) From {
        {TextBox1, "a"},
        {TextBox2, "b"},
        {TextBox3, "c"}}

'全て0文字以上かつ数値っぽいかどうか
If Not dic.Keys.All(Function(t) t.TextLength <> 0 AndAlso IsNumeric(t.Text)) Then
    '1個でもダメなら抜ける
    Return
End If

'テキストを数値化してソートして配列化(添え字アクセスのため)
Dim sorted = dic.OrderBy(Function(kv) Val(kv.Key.Text)).ToArray()
'念のため a, b, c でソートしてから配列化(添え字アクセスのため)
Dim kvs = dic.OrderBy(Function(kv) kv.Value).ToArray()

' 順番通りなら`sorted`と`kvs`は同じ順番なはず(もっと良い方法がありそうですが)
For i = 0 To kvs.Length - 1
    If kvs(i).Key Is sorted(i).Key Then Continue For

    MsgBox(String.Format("{0}は{1}より小さいです。", sorted(i).Value, kvs(i).Value))
    tbx.BackColor = Color.Red
    tbx.Focus()
    Return

Next

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    データグリッドビューのチェックボックスについて

    はじめて利用させていただきます。 VB.NETで開発を行っている初心者です。 今回VisualStudioでDataGridViewを題材として開発の勉強を行っているのですが手

  • 解決済

    vb.net フォームからusercontrolのlistviewのハンドリング

    vb.netです。 フォームとusercontrolが別になっている状態です。 フォームにボタンがありまして、そのボタンをクリックするとusercontrolを表示します。 ここ

  • 解決済

    VB テキストボックスの中身

    こんばんは。 電卓のものです。 現在機能変更に基づいて、コードを書き換えています。 一つの機能はすぐ変更が終わりましたが、 もう一つがよくわからないです。 計算経過を表示する

  • 解決済

    VB リッチテキストボックス 色指定

    リッチテキストボックスの文字をランダムに指定することはできますか? 例えばあか,あお,みどりのうちどれかをクリック毎にランダムに表示させたいです. アドバイスをお願いします.

  • 解決済

    プログラムを簡潔で分かりやすく組むにはどのようにすればよろしいでしょうか?

    いつも大変お世話になっております。 現在、ツールボックスのコントロールと稲妻マークのイベント を主に利用しプログラムを組んでいたのですが、だんだんわかりずらいプログラムにな

  • 解決済

    グリッドのチェックボックス制御

    VisualStdlo2015でシステムを開発しています。 画面のグリッドにデータを表示させ、一番左の列にチェックボックスを配置しました。(数量の列も配置) 起動後、チェックボック

  • 解決済

    VB.netで別フォームにテキストを移す方法について

    VB.netを使用して、Form1から、Form2のTextBoxにテキストを入れる方法を教えて下さい。 なお、ネットで調べて、テスト的に以下を入力してやってみると、Form2に予

  • 受付中

    入力時点で入力チェック

    テキストボックスに文字が入力されたときに負の値が入ったときにメッセージが出るようにするには 下記のようにするといいと思うんですけれども、 Private Sub TextBox

同じタグがついた質問を見る

  • VB.NET

    940questions

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