• ベストアンサー

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

質問者が選んだベストアンサー

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.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 とかはしてませんが。

piopao
質問者

お礼

とても詳しく回答していただき、ありがとうございます。 とても勉強になりました。 是非、参考にさせていただきたいと思います。 ありがとうございました。

その他の回答 (3)

noname#22222
noname#22222
回答No.3

s_husky です。チクッとバグを訂正! lngSum = Val(TextBox2.Value) + Val(TextBox3.Value)

noname#22222
noname#22222
回答No.2

直接の回答ではありません。 気になる点がありましたので、同様のコードを書いてみました。 ・一つは、全体構造のスパゲッティーな感じを整理してみました。 ・二つは、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

piopao
質問者

お礼

とても詳しく回答していただき、ありがとうございます。 とても勉強になりました。 是非、参考にさせていただきたいと思います。 どうもありがとうございました。

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.1

Exit Sub を入れれば良いと思います。 ちなみに、このままではTextBox3は使われておらず、合計は絶対に合わないと思います。 あとは IsNumeric 等で数値評価を加えた方が良いかも。

piopao
質問者

お礼

回答ありがとうございます。 とても勉強になりました。

関連するQ&A