プロが教えるわが家の防犯対策術!

入力画面には3つのTextBoxあり、すべてを入力したら「記入」ボタンをクリックします。
その時、TextBox2とTextBox3の合計がTextBox1の値と一致するか判定します。
一致した場合は、その値を選択したセルに表示し、一致しなかった場合は、メッセージを表示させ、メッセージの「OK」ボタンをクリックすると「記入」ボタンがクリックされる前の状態(UserForm1の入力項目にデータが入力されている状態)に戻したいのですが、どのようにしたらよいのでしょうか。
現在は、下記のようなかんじになっています。

Private Sub CommandButton1_Click() 
 Sum = 0
 For N = 1 To 2
 If Controls("TextBox" & N).Text = "" Then
  RepMsg = MsgBox("値を入力して下さい。", vbOKOnly + vbExclamation, "入力確認")
  『? 「記入」ボタンがクリックされる前の画面(UserForm1)に戻る』
 Else
  Sum = Val(Controls("TextBox" & N).Text) + Sum
 End If
 Next N
 If Val(TextBox1.Text) <> Sum Then
  RepMsg = MsgBox("合計が一致しません。", vbOKOnly + vbExclamation, "合計確認")
  If RepMsg = vbOK Then
   『? 「記入」ボタンがクリックされる前の画面(UserForm1)に戻る』
  End If
 End If
( 表示 )
End Sub

A 回答 (4件)

こんにちは。

KenKen_SP です。

オリジナルを生かし、数値の入力チェックまで行えば次のような感じ。
数値チェックに IsNumeric を使う場合は注意して下さい。詳しくは
ソースのコメントを読んで下さい。

Private Sub CommandButton1_Click()

  ' 変数 Sum について
  ' ・宣言するなら少数が扱われる場合 Double または Variant 型
  ' ・ワークシート関数 Sum と同一名なので他の名前の方が良い

  For N = 1 To 3
    If IsNum(Controls("TextBox" & N).Text) = False Then
      RepMsg = MsgBox("数値を入力して下さい。", _
           vbOKOnly + vbExclamation, "入力確認")
      With Controls("TextBox" & N)
        .SetFocus
        .SelStart = 0
        .SelLength = Len(.Text)
      End With
      Exit Sub
    End If
  Next
  
  Sum = 0
  For N = 1 To 2
    Sum = Val(Controls("TextBox" & N).Text) + Sum
  Next N
  If Val(TextBox3.Text) <> Sum Then
    RepMsg = MsgBox("合計が一致しません。", _
         vbOKOnly + vbExclamation, "合計確認")
    If RepMsg = vbOK Then
      Exit Sub
    End If
  End If
  '( 表示 )
  MsgBox "OK"
  
End Sub

' 数値なら True を返す IsNumeric 強化関数
Private Function IsNum(strVal As String) As Boolean

  ' IsNumeric は IsNumeric("3D2") とか IsNumeric("1,,2,,3") で
  ' True を返す。数値以外の入力を不可にしていない場合は、厳密
  ' にやるなら数値チェック関数としてそのまま使ってはいけない

  Dim i As Long
  If Len(strVal) > 0 Then
    For i = 1 To Len(strVal)
      If Not Mid$(strVal, i, 1) Like "[0-9.]" Then Exit Function
    Next i
    If IsNumeric(strVal) Then IsNum = True
  End If

End Function

少し冗長ですね。Textbox が空あるいは文字列なら Cdbl 関数でエラーが発生
するので、それを On Error ~でトラップする方法もあります。
数値チェック関数を書くのが面倒ならこれでも良いかもしてません。

Private Sub CommandButton2_Click()

  Dim blnResult As Boolean

  On Error Resume Next
  blnResult = ((CDbl(TextBox1.Text) + CDbl(TextBox2.Text)) = CDbl(TextBox3.Text))
  If Err Then
    MsgBox "数値が入力されてない/数値ではない", vbExclamation
    Exit Sub
  ElseIf Not blnResult Then
    MsgBox "合計が一致しない", vbCritical
    Exit Sub
  End If
  On Error GoTo 0

  MsgBox "OK"

End Sub

こんな感じになります。SetFocus とかはしてませんが。
    • good
    • 0
この回答へのお礼

とても詳しく回答していただき、ありがとうございます。

とても勉強になりました。
是非、参考にさせていただきたいと思います。

ありがとうございました。

お礼日時:2006/10/05 20:31

s_husky です。

チクッとバグを訂正!

lngSum = Val(TextBox2.Value) + Val(TextBox3.Value)
    • good
    • 0

直接の回答ではありません。


気になる点がありましたので、同様のコードを書いてみました。

・一つは、全体構造のスパゲッティーな感じを整理してみました。
・二つは、MsgBox の使い方です。次に示す Message() でなく Verify() に近い使い方は疑問です。

なお、入力チェックは、Len() の利用で統一しています。

Private Sub 記入ボタン_Click()
  Dim isCompleted As Boolean
  Dim lngSum   As Long
  
  isCompleted = Len(TextBox2.Text & "") And Len(TextBox3.Text & "")
  If Not isCompleted Then
    Message "テキストボックスの入力が完了していません。"
    If Not Len(TextBox2.Text & "") Then
      TextBox2.SetFocus
    Else
      TextBox3.SetFocus
    End If
  Else
    lngSum = TextBox2.Value + TextBox3.Value
    If lngSum <> TextBox1.Value Then
      Message "合計が一致しません。"
      TextBox2.SetFocus
    Else
      '
    End If
  End If
End Sub

**********************************************************************************************

Answer = Verify("テキストボックスを訂正しますか?")
If Answer = vbYes Then
  ・・・・・
End If

Message "テキストボックスの入力が完了していません。"

Verify() に近い使い方をしていますが、 Message() の使い方で事足りると思います。

Public Function Verify(ByVal Msg As String, _
            Optional ByVal DefaultButton As Integer = vbDefaultButton1) As Integer
  Verify = MsgBox(Msg, vbYesNo + vbQuestion + DefaultButton, " 確認")
End Function

Public Sub Message(ByVal Msg As String)
  MsgBox Msg, vbInformation, " お知らせ"
End Sub
    • good
    • 0
この回答へのお礼

とても詳しく回答していただき、ありがとうございます。

とても勉強になりました。
是非、参考にさせていただきたいと思います。

どうもありがとうございました。

お礼日時:2006/10/05 20:33

Exit Sub を入れれば良いと思います。


ちなみに、このままではTextBox3は使われておらず、合計は絶対に合わないと思います。
あとは IsNumeric 等で数値評価を加えた方が良いかも。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

とても勉強になりました。

お礼日時:2006/10/05 20:35

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!