- ベストアンサー
VBAでエラー時の処理について
入力画面には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
- みんなの回答 (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 とかはしてませんが。
その他の回答 (3)
s_husky です。チクッとバグを訂正! lngSum = Val(TextBox2.Value) + Val(TextBox3.Value)
直接の回答ではありません。 気になる点がありましたので、同様のコードを書いてみました。 ・一つは、全体構造のスパゲッティーな感じを整理してみました。 ・二つは、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
お礼
とても詳しく回答していただき、ありがとうございます。 とても勉強になりました。 是非、参考にさせていただきたいと思います。 どうもありがとうございました。
- papayuka
- ベストアンサー率45% (1388/3066)
Exit Sub を入れれば良いと思います。 ちなみに、このままではTextBox3は使われておらず、合計は絶対に合わないと思います。 あとは IsNumeric 等で数値評価を加えた方が良いかも。
お礼
回答ありがとうございます。 とても勉強になりました。
お礼
とても詳しく回答していただき、ありがとうございます。 とても勉強になりました。 是非、参考にさせていただきたいと思います。 ありがとうございました。