• ベストアンサー

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

  • ユーザーフォーム データ消去の時の処理

    環境:Excel2002です ユーザーフォームのテキストボックスの入力チェックをしています Rem**************** Rem TextBox5 Check Rem**************** Private Sub TextBox5_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean) If Len(Me.TextBox5.Text) = 0 Then '未入力Check If IsNumeric(Me.TextBox5.Text) = False Then '数値入力Check MsgBox "数値で入力してください", _ vbExclamation, "納品書作成ツール" Me.TextBox5.SetFocus Exit Sub End If MsgBox "入力してください", _ vbExclamation, "納品書作成ツール" Me.TextBox5.SetFocus Exit Sub End If Me.TextBox5.Text = Format(Me.TextBox5.Text, "#,##0") End Sub 入力したデータを消去して Enterキーを押すか、マウスでクリックした時のいずれでも Len(Me.TextBox5.Text) = 0 と認知されて "数値で入力してください"のメッセージが表示されてしまいます このメッセージが出ないようにするにはどうしたらいいのでしょうか ご教示願います

  • エクセル vba userform について

    現在USERFORMを使用してますが、つまずいています。 たとえば、TEXTBOX1がブランクならばコマンドボタンにフォーカス?をもっていきたいのです。 IF TEXTBOX1="" THEN コマンドボタン1.SETFOCUS ELSE TEXTBOX2.SETFOCUS END IF のような形にしてますが、うまくいきません コマンドボタンを押すとシートにそれぞれ反映されるように作成はできております。 余計なタブ操作をしたくありません。 よろしくお願いします

  • 入力エラー時にメッセージを出す方法

    下記コードなのですが、入力ミスでもフォームが開いてしまいます。 5602、5662以外の場合、メッセージを出して、正しく入力を求めるようにしたいのですが、どのようにしたらいいでしょうか。 Sub 推進区() s = InputBox("納入便を選択して下さい。" & Chr(13) & _ "推進区:5602" & Chr(13) & "推進区:5662", "納入便選,s) If s = "5602" Then UserForm1.OptionButton3.Visible = False UserForm1.TextBox1.Value = 5602 Else UserForm1.OptionButton3.Visible = True UserForm1.TextBox1.Value = "5662" End If UserForm1.Show End Sub

  • ユーザーフォームVBAでCells(n, 7)が

    いつもお世話になります Windows7 excell2010 です ご指導を仰ぎたいのは参照図で言うと、 TextBox1~6 は順調に入力しますがTextBox7にすると「入力」に飛び 参照図のG13に入力されません。 VBAを勉強し始めたはかりですのでどこが悪いかわかりません。 恐れ入りますがご指導願えませんでしょうか。 下記参考にします。 Module のコードには Sub FormSample() Do UserForm1.Show Loop End Sub Sub Test() MsgBox "ボタンによるマクロの実行" End Sub UserForm1 Private Sub CommandButton1_Click() n = 1 Do n = n + 1 Loop While Cells(n, 1) <> "" Cells(n, 1) = UserForm1.TextBox1.Text Cells(n, 2) = UserForm1.TextBox2.Text Cells(n, 3) = UserForm1.TextBox3.Text Cells(n, 4) = UserForm1.TextBox4.Text Cells(n, 5) = UserForm1.TextBox5.Text Cells(n, 6) = UserForm1.TextBox6.Text Cells(n, 7) = UserForm1.TextBox7.Text Unload Me End Sub Private Sub CommandButton2_Click() Unload Me End End Sub

  • アクセスVBA If式

    早速ですが、質問させて頂きます。 ACCESS VBAで、各ボックスに入力された数字に対し、論理式が立てられており、全項目ボックスに入力をし『チェック』ボタンを押すと基準を超えるものに『再チェックが必要な項目があります』というメッセージを出した上に、それを赤で反転させる、というのを作成中です。 簡単な図で表すと []はボックスだと思ってください 高さ[   ]   横[    ]   縦[    ] 体積[   ]      [チェック]←ボタン 高さが20を超えた場合、要再チェック 横が10以下の場合、要再チェック 縦が5未満又は15を超える場合、要再チェック 体積 高さ*横*縦 が3000以下の場合、要再チェック Private Sub コマンド1_Click() ← チェックボタンをクリック '要チェックか調べます 要チェック = Y If 高さ >= 20 Then Y = Y + 1 End If   If 横 <= 10 Then Y = Y + 1 End If   If 縦 < 5 Then Y = Y + 1 End If If 縦 >= 15 Then Y = Y + 1 End If ~中略 If Y >= 1 Then Msg = MsgBox("要再チェック項目があります。 ", vbOKOnly + vbExclamation, "確認してください") End If If Y = 0 Then Msg = MsgBox("再チェックは必要ありません。 ", vbOKOnly + vbInformation, "確認してください") End If 体積に関しては、式マクロを組んでいます。 以上です。赤に反転させる方法は分かりませんでした・・・。 このように1つずつIf式でやるのは、あまり綺麗じゃないと思いますし、たったこれだけの簡単な式でも、うまく機能してくれません(涙) どうかお助けいただけませんでしょうか。よろしくお願いしたします。

  • エクセル VBAのチェックボックスについて

    お読みくださり、ありがとうございます。 エクセル初心者でございます。 エクセルのマクロなのですが、 お詳しい方、是非教えて欲しいです!汗 調子に乗って入力フォームなるものを作りました。 入力フォームの中にて、チェックボックスで「ある」「なし」の項目を入れてみたのですが、チェックしていないのに、値が入る現象が起きています汗 以下、素人が書いたコードを恥を承知で記載させていただきます。 Private Sub CheckBox1_Click() If CheckBox1.Value = True Then OK = "○" End If End Sub Private Sub CheckBox2_Click() If CheckBox2.Value = True Then NO = "×" End If End Sub Private Sub UserForm_Click() End Sub '以下のコードは、登録ボタンがクリックされたときの処理! Private Sub 登録ボタン_Click() If TextBox1.Text = "" Then MsgBox "グッズ名を入力してください。" Exit Sub End If If TextBox2.Text = "" Then MsgBox "アプローチ先を入力してください。" Exit Sub End If With Worksheets("協賛グッズ") With Cells(Rows.Count, 2).End(xlUp) .Offset(1, 0).Value = TextBox1.Text .Offset(1, 1).Value = mori .Offset(1, 2).Value = mori2 .Offset(1, 3).Value = TextBox2.Text .Offset(1, 5).Value = TextBox3.Text .Offset(1, 6).Value = TextBox4.Text .Offset(1, 7).Value = TextBox5.Text .Offset(1, 8).Value = TextBox6.Text End With End With TextBox1.Text = "" TextBox2.Text = "" TextBox3.Text = "" TextBox4.Text = "" TextBox5.Text = "" TextBox6.Text = "" CheckBox1.Value = False CheckBox2.Value = False End Sub 以上です。 おかしなところ満載かと思いますが、 チェックを入れた項目だけ値を入れたいと考えております。 おわかりになるかたおりましたら何卒お助けください汗 よろしくお願いいたします。

  • [VBA]型が一致しません

    EXCELWORKSHEET上で下記の処理をすると「型が一致しません」との エラーがでます。どうにも原因と対応策がわからず悩んでいます。 デバッグの良い方法ありませんでしょうか? <現象> *列2上のセルを選択して、DELETEキーを押す。⇒エラーなし。 *しかし、列2上のセルとその他のセルを同時選択した上で、DELETEキーを押すと「型が一致しません。」のエラー。 頭の「If Target.Column Like 2 And Len(Target.Value) > 0 Then 」が悪さしているのはわかるのですが・・・。 Private Sub WORKSHEET_CHANGE(ByVal Target As Range) If Target.Column Like 2 And Len(Target.Value) > 0 Then Range("c" & Target.Row).Value = Now If Target.Column Like 2 And Len(Target.Value) > 0 Then 'B列の場合だけ確認 Dim rng As Range Set rng = ActiveSheet.Range("B:B").Find(What:=Target, LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=True, MatchByte:=True) If Not rng Is Nothing Then '発見した。 If rng.Address <> Target.Address Then '入力中セル以外で発見 Select Case MsgBox("過去に受け入れたLOTです。再度受入れますか?", vbYesNo) Case vbYes Range("B2").Activate Selection.End(xlDown).Select ActiveCell.Offset(0, 1).Activate ActiveCell.Value = Now ActiveCell.Offset(0, 1).Activate ActiveCell.Value = UserForm2.TextBox2.Value UserForm2.TextBox1.Value = "" UserForm2.TextBox2.Value = "" UserForm2.TextBox1.SetFocus Range("B2").Activate Selection.End(xlDown).Select Selection.Offset(1, 0).Select Case vbNo Range("B2").Activate Selection.End(xlDown).Select ActiveCell.ClearContents ActiveCell.Offset(0, 1).Activate ActiveCell.ClearContents UserForm2.TextBox1.Value = "" UserForm2.TextBox2.Value = "" UserForm2.TextBox1.SetFocus End Select End If End If End If End If End Sub

  • このVBA、もうちょっとシンプルにできないですか?

    自力でVBAを書いてみたのですが、長くなってしまいました。 もうちょっとシンプルにするアイディアがあればお願いします。 やりたいことは、 (1)ユーザーフォームのテキストボックス内が空欄だったら「無視」 (2)テキストボックスの中が空欄でなければ「書き込み」 以上のことをやりたいのですが、テキストボックスが6種類あるので単純に記述すると結構長くなってしまいました。 特に問題がなければ、その旨をお願いします。 If TextBox1 = "" Then If TextBox2 = "" Then If TextBox3 = "" Then If TextBox4 = "" Then If TextBox5 = "" Then If TextBox6 = "" Then MsgBox ("得点が入力されていません。") ElseIf TextBox6 <> "" Then Sheets("総合(得点)").Cells(t + 9, u) = TextBox6.Value End If ElseIf TextBox5 <> "" Then Sheets("総合(得点)").Cells(t + 8, u) = TextBox5.Value ElseIf TextBox6 <> "" Then Sheets("総合(得点)").Cells(t + 9, u) = TextBox6.Value End If End If ElseIf TextBox4 <> "" Then Sheets("総合(得点)").Cells(t + 7, u) = TextBox4.Value If TextBox5 <> "" Then Sheets("総合(得点)").Cells(t + 8, u) = TextBox5.Value If TextBox6 <> "" Then Sheets("総合(得点)").Cells(t + 9, u) = TextBox6.Value End If End If End If ElseIf TextBox3 <> "" Then Sheets("総合(得点)").Cells(t + 6, u) = TextBox3.Value If TextBox4 <> "" Then Sheets("総合(得点)").Cells(t + 7, u) = TextBox4.Value If TextBox5 <> "" Then Sheets("総合(得点)").Cells(t + 8, u) = TextBox5.Value If TextBox6 <> "" Then Sheets("総合(得点)").Cells(t + 9, u) = TextBox6.Value End If End If End If End If ElseIf TextBox2 <> "" Then Sheets("総合(得点)").Cells(t + 5, u) = TextBox2.Value If TextBox3 <> "" Then Sheets("総合(得点)").Cells(t + 6, u) = TextBox3.Value If TextBox4 <> "" Then Sheets("総合(得点)").Cells(t + 7, u) = TextBox4.Value If TextBox5 <> "" Then Sheets("総合(得点)").Cells(t + 8, u) = TextBox5.Value ・ ・ ・ こんな感じで規則的に記述しただけです。(文字数が多いので最後は省略しました) 段差がなくて見づらいですが、宜しくお願いします。

  • EXCEL2003 VBA リストボックス

    お世話になります。 質問の内容についてですが、 現在VBAの勉強をしながらデータベースを組んでいます。 そこで、次のようなものを作っています。 Sheet1に於いて、     A    B     C 1  追番  名称   個数 2   1   りんご   1個 3   2   みかん  2個 4   3   なし    3個 5   4   なす    5個 というような表があるとします。 そして、VBAでフォームをつくり、TextBox1(名称入力用)、TextBox2(個数入力用)、ListBox1(すでに入力されているもの及び追加分のリスト用)、CommandButton1(入力された「名称」と「個数」をSheet1の表の一番下に追加)、CommandButton2(フォームを閉じる)という構成にしています。 また、Sheet1上にコマンドボタンを作っており、そのボタンを押すとフォームを呼出すようにしています。 流れとしては、既存の表に追加する場合、コマンドボタンを押してフォームを呼出し、テキストボックスに入力した内容をSheet1の一番下に追加する。また、フォーム上のリストボックスでも現在の表の内容を見る事ができる、というものです。 フォームでのコードは以下のようにしています。 Private Sub CommandButton1_Click() If TextBox1.Value = "" Then MsgBox "「名称」は必須項目です。" End If If TextBox2.Value = "" Then MsgBox "「個数」は必須項目です。" End If If TextBox2.Value = "0" Then MsgBox "「個数」に0は登録できません。" End If Lrow = Range("B2").CurrentRegion.Rows.Count Range("B" & Lrow + 1).Value = TextBox1.Value Range("C" & Lrow + 1).Value = TextBox2.Value End Sub Private Sub CommandButton2_Click() Unload UserForm1 End Sub Private Sub UserForm_Initialize() Dim b As Long Dim a() As String ReDim a(1 To 100) UserForm1.ListBox1.ColumnCount = 2 UserForm1.ListBox1.List = Worksheets(Sheet1).Range("B2:C").Value For i = 2 To 104 If Range("B" & i) = "" Then ListBox1.AddItem Range("B" & i).Value ListBox1.AddItem Range("c" & i).Value b = b + 1 a(b) = Range("C" & i).Value End If Next i End Sub このコードでSheet1上のコマンドボタンを押して実行しようとするとエラーが出てしまいます。 エラーの原因は何なのでしょうか? (なお、コマンドボタンのコードは「UserForm1.Show」のみです。 コード自体は本などを読みながら似たようなVBAを使った物を参考にしています。

  • Excel VBAでIF~Thenの入れ子がうまくできません。

    いつもお世話になってます。 IF~Then~EndIfにIFを入れていますがうまくいきません。よろしくお願いします。 Private Sub CommandButton10_Click() Dim i As Long Dim 最終行 As String Dim サーチ行 As Long Dim 行 As Long Dim 列 As Long If TextBox33.Value = "" Then MsgBox "使用量を入力してください。" Else If TextBox11 <> "" Then TextBox26 = TextBox33 * TextBox11 / 100 '成分1 End If If TextBox12 <> "" Then TextBox25 = TextBox33 * TextBox12 / 100 '成分2 End If Workbooks.Open Filename:=ThisWorkbook.Path & "\データ物質試薬管理.xls" Sheets("shinki").Activate 最終行 = (Range("B2").End(xlDown).Row) '商品名の行検索 サーチ行 = 0 For i = 2 To 最終行 If ComboBox3.Value = Range("B" & i) Then Workbooks("データ物質試薬管理.xls").Close savechanges:=False '保存しない Workbooks.Open Filename:=ThisWorkbook.Path & "\データ物質試薬管理.xls" Sheets("kongou").Select Range("A65536").End(xlUp).Offset(1).Select 行 = ActiveCell.Row 列 = ActiveCell.Column Cells(行, 列) = UserForm11.TextBox16.Value 'CAS Cells(行, 列 + 1) = UserForm11.TextBox21.Value '使用日 Cells(行, 列 + 2) = UserForm11.TextBox29.Value '使用者 Cells(行, 列 + 4) = UserForm11.TextBox26.Value '成分1使用量 Cells(行 + 2, 列) = UserForm11.TextBox18.Value 'CAS Cells(行 + 2, 列 + 1) = UserForm11.TextBox21.Value '使用日 Cells(行 + 2, 列 + 2) = UserForm11.TextBox29.Value '使用者 Cells(行 + 2, 列 + 4) = UserForm11.TextBox24.Value '成分3使用量 Cells(行 + 2, 列 + 5) = UserForm11.TextBox32.Value '種類 Cells(行 + 2, 列 + 6) = UserForm11.TextBox34.Value '単位 Cells(行 + 2, 列 + 7) = UserForm11.ComboBox3.Value '商品名 Workbooks("データ物質試薬管理.xls").Close savechanges:=True 'showhinに在庫管理する Workbooks.Open Filename:=ThisWorkbook.Path & "\データ物質試薬管理.xls" Sheets("showhin").Select Range("A65536").End(xlUp).Offset(1).Select 行 = ActiveCell.Row 列 = ActiveCell.Column Cells(行, 列) = UserForm11.TextBox2.Value '品名コード Cells(行, 列 + 1) = UserForm11.ComboBox3.Value '商品名 'Cells(行, 列 + 2) = UserForm9.TextBox3.Value '1本の量 'Cells(行, 列 + 3) = UserForm9.TextBox4.Value '本数 Cells(行, 列 + 4) = UserForm11.TextBox34.Value '単位 Cells(行, 列 + 5) = UserForm11.TextBox32.Value '種別 Cells(行, 列 + 6) = UserForm11.TextBox21.Value '使用日 Cells(行, 列 + 7) = UserForm11.TextBox29.Value '使用者名 Cells(行, 列 + 9) = UserForm11.TextBox33.Value '使用量 Workbooks("データ物質試薬管理.xls").Close savechanges:=True MsgBox "登録しました。" End If サーチ行 = i Exit For 'End If Next If サーチ行 = 0 Then MsgBox ComboBox3.Value & "商品は登録されておりません。" & Chr(10) & "「新規商品登録」ボタンから入力してください。" End If End If If TextBox21.Value = "" Then '使用量 MsgBox "使用日を入力してください。" End If ComboBox3.SetFocus End Sub

専門家に質問してみよう