• ベストアンサー

エクセルマクロでエラーの処理

次のようなマクロを組みました。 1列目の値を2列目の値で割り、その答を3列目に表示するというものです。 Sub Macro1() ' On Error GoTo ErrRtn: R = 1 FLAG1: Do While Cells(R, 1) <> "" Cells(R, 3) = Cells(R, 1) / Cells(R, 2) R = R + 1 Loop End ErrRtn: Cells(R, 3) = "ゼロ割" R = R + 1 GoTo FLAG1 ' End Sub ゼロ割が発生したときのエラー処理として3列目に「ゼロ割」を表示させて次の行について処理を継続するようにしていますが、上記のプログラムだと全データのうち最初のエラーは思い通りになりますが、続けて処理をしていって2番目に発生したエラーではエラーメッセージが出て止まってしまいます。 どう直せばよいのでしょうか? なお、上記だと2列目がゼロであるか否かを先に判定してやればよいのですが、エラー処理の質問をしたいために例として上記のような簡単なプログラムをあげているものです。 よろしくお願いします。

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

ErrRtn: Cells(R, 3) = "ゼロ割" R = R + 1 GoTo FLAG1 の部分を ErrRtn: Cells(R, 3) = "ゼロ割" Resume Next としましょう

tarobei
質問者

お礼

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

その他の回答 (2)

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

取りあえず、これで希望になると思います。 Sub Macro1() On Error GoTo ErrRtn: R = 1  Do While Cells(R, 1) <> ""    Cells(R, 3) = Cells(R, 1) / Cells(R, 2)    R = R + 1  Loop  Exit Sub ErrRtn:  Cells(R, 3) = "ゼロ割"  Resume Next End Sub

tarobei
質問者

お礼

ENDではなくExit Subとするのが普通なのですね。 ありがとうございました。

  • a987654
  • ベストアンサー率26% (112/415)
回答No.1

errコードのリセットが必要ではありませんか? ちなみに表記のプログラムでは、2番目以降のエラーを回避した時点で 無限ループになりませんか?

tarobei
質問者

お礼

ありがとうございます。 エラーコードのリセットというのは自分も思いましたが、その術がわかりませんでした。 なお、ENDがErrRtnの前にあるので無限ループにはならないと思うのですが。 NO.2、NO.3の方の回答で解決しました。 ありがとうございました。

関連するQ&A

  • VBでのエラー処理(On Error)

    VBで以下のようなプログラムを書いています。 sub On Error goto Err 処理1 Err: 処理2 End sub 処理1でエラーが発生した場合、Err:の処理に入ってくるのですが、もしErr:の中の処理2でもエラーが発生した場合、どうすればよいのでしょうか? Err:の中でもエラー処理ができるのでしょうか、それともロジックで回避しなければならないのでしょうか? ご存知の方がいらっしゃいましたら宜しくお願いします。

  • EXCEL VBA のエラー処理

    EXCEL VBA でセルの文字列を読み(基本的に2007/05/08のような日付データが入っている)、 もしそれ以外のデータ("あいう"のような文字列)が入っていた場合はエラールーチンに飛ばして処理をしようと思ったのですが、 エラーが発生して、発生箇所が黄色く反転表示され、止まったままになってしまいます。 エラールーチンに飛ばすためにはどうしたらいいのでしょうか? Sub test() Dim LineNo As Integer Dim WrkDate As Date On Error GoTo Err LineNo = 1 WrkDate = Range("S" & LineNo).Value ←ここが黄色く反転表示される。 WrkDate = WrkDate + 7 Range("X" & LineNo).Value = WrkDate GoTo Owari Err: (処理ルーチン) Owari: End Sub

  • エクセルマクロ配列で変数は使えますか

    エクセル2013です。 初めて配列を使います。 以下のように作成し思ったようにできました。 Sub 計算() '成功 Dim a As Integer Dim c As Integer Dim b(5) As Integer Dim 最終行 Dim 値列  値列 = 17 最終行 = Cells(Rows.Count, 1).End(xlUp).Row For 処理業 = 1 To 最終行 For a = 1 To 5 b(a - 1) = Cells(1, 値列) 値列 = 値列 + 1 Next 値列 = 17 For a = 1 To (22 - 値列) c = c + b(a - 1) Next Cells(処理業, 30) = c a = 0 c = 0 Next 処理業 End Sub ただ計算する列の範囲をインプットボックスで入力した値 にしたい為以下のように改造しました。 Dim b(対象列) As Integerでエラーになります 配列には変数は使用できないのでしょうか? よろしくお願いします。 Sub 計算() '失敗 Dim a As Integer Dim c As Integer Dim b(対象列) As Integer’★ここでERRになる Dim 最終行 Dim 対象列 Dim 値列  対象列 = 22'インプットボックスで入力した値 値列 = 17 最終行 = Cells(Rows.Count, 1).End(xlUp).Row For 処理業 = 1 To 最終行 For a = 1 To (対象列 - 17) b(a - 1) = Cells(1, 値列) 値列 = 値列 + 1 Next 値列 = 17 For a = 1 To (22 - 値列) c = c + b(a - 1) Next Cells(処理業, 30) = c a = 0 c = 0 Next 処理業 End Sub

  • エクセルマクロで複数列のセルを選択した時でも正しく動作するようにしたい

    エクセルマクロで複数列のセルを選択した時でも正しく動作するようにしたい。 今、3列目に入力された値によって15列から17列の値を自動入力するように次の マクロを作りました。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column <> 3 Then Exit Sub For Each r1 In Selection If r1.Cells(1, 1) <> "部品表" Then Cells(r1.Row, 15) = "-" Cells(r1.Row, 16) = "-" Cells(r1.Row, 17) = "-" End If Next End Sub 3列目のみのセルをペーストすると正しく動作しますが、1列目から3列目のセルにペーストすると何も動きません。 正しく動くようにするには、どう修正すればいいでしょうか?

  • Excelマクロのことで教えて下さい

    初歩的なことですみません。 E列の値をF列に値を入れるために下記のマクロを組みました。 Sub test() Worksheets("Sheet1").Select Dim i As Long For i = 2 To Cells(Rows.Count, 4).End(xlUp).Row Range("F2").Value = "=E2/1024/1024" Cells(i, 6).FillDown Range(Cells(2, 6), Cells(i, 6)).Copy Range("F2").PasteSpecial Paste:=xlValues Next i End Sub ところがF列に「値のみを貼り付け」をした時に、途中から同じ値のみがコピーされてしまい困っています。 (画像参照) うまく貼り付けることができるマクロをお教え下さい。 よろしくお願いいたします。

  • Access(VBA)のエラー処理

    いつもお世話になりますm(__)m Access2003(VBA)のエラー処理について教えて下さい。 いつも、エラー処理は、各private sub毎に記述しています。 例えば private sub A() on error goto ErrShori (処理など) exit sub ErrShori: (エラー処理) end sub private sub B() on error goto ErrShori (処理など) exit sub ErrShori: (エラー処理) end sub 上記のようにしていますが、エラー処理は共通で、どうにか1つの記述(?)で全てのプロシージャに対してエラー処理が出来ればと思っています。 いろいろ調べましたが見あたらず、今は一つ一つのプロシージャに「on error...」と書いています。 MDBファイル単位で「エラーがあるとこれを実行」のような共通のエラー処理を実装する事は出来ないのでしょうか? お詳しい方、是非ご教授下さい。可能であればサンプルを記述頂くと助かります。 宜しくお願い致しますm(__)m

  • エクセル マクロ 抽出

    教えてください。 ○と記入されたセルを参照して、一つ上のセル・A列にある同じ行のセル・ 9行目にある同じ列のセルを抽出しようとしています。 下記の通り入力すると 行数=値.Rowでエラーが出たしまいました。 試行錯誤頑張りましたが解決できそうにありませんのでお力を貸して頂けないでしょうか。 Sub 抽出() Dim i, 行数, 列数 As Long Dim 値 As Range i = 0 行数 = 値.Row 列数 = 値.Column For Each 値 In Sheets("sheet1").Range("C12:R171") If 値.Value = "○" Then i = i + 1 With Sheets("sheet2") .Cells(i, 3).Value = Sheets("sheet1").Cells(行数, 1).Value .Cells(i, 4).Value = Sheets("sheet1").Cells(9, 列数).Value .Cells(i, 5).Value = 値.Offset(-1, 0).Value End With End If Next End Sub

  • ExcelVBA エラー処理で2回目の同一エラーは

    こんにちは。 EcxelVBA初心者です。 セルD8~D10の値をCP44~CP100の値と比較し、一致したら8~10行目のそれぞれのセルに記入する際、 CP44~CP100に一致しない場合(エラー91)、エラー処理でメッセージを表示し、次の比較に進みたくてGOTOを使用していますが、 一度目のエラーはできるのに、二度目のエラーでは「実行時エラー91」が表示されてしまいます。 なぜ、一度目と同じようにエラー処理でメッセージ表示、次の比較に勧めないのでしょうか? よろしくお願いします。 Sub test() Dim i As Integer Dim lng As Long i = 8 lng = 10 On Error GoTo D_Error i = 8 Cells(i, "D").Value = StrConv(Cells(i, "D").Value, vbUpperCase) '半角小文字は半角大文字に修正 strType = Cells(i, "D").Value For i = 8 To lng Cells(i, "D").Value = Trim(StrConv(Cells(i, "D").Value, vbUpperCase)) '半角小文字は半角大文字に修正し、余分なスペースも取る strType = Cells(i, "D").Value If Len(Trim(Cells(i, "D").Value)) = 0 Then ' D列のデータがなければ次の行へ GoTo BBB End If intStr = 0 Cells(i, "D").Select strType = Cells(i, "D").Value intStr = InStr(strType, "-") 'ハイフンの位置で調べる If intStr = 0 Then 'ハイフンがなければ、あいまい検索で文字列を探す Set rngTarget = Range("CP44:CP100").Find(What:=strType, lookat:=xlPart) intTarget = rngTarget.Row Cells(i, "AE").Value = Cells(intTarget, "CR").Value Cells(i, "AF").Value = Cells(intTarget, "CS").Value Cells(i, "AG").Value = Cells(intTarget, "CT").Value Else 'ハイフンがあれば、「(」カッコの有無を調べてから、「-」前の文字を完全一致で探す If Mid(strType, intStr - 1, 2) = "(-" Then strType = Left(strType, intStr - 1 - 1) Else strType = Left(strType, intStr - 1) End If Set rngTarget = Range("CP44:CP100").Find(What:=strType, lookat:=xlWhole) intTarget = rngTarget.Row Cells(i, "AE").Value = Cells(intTarget, "CR").Value Cells(i, "AF").Value = Cells(intTarget, "CS").Value Cells(i, "AG").Value = Cells(intTarget, "CT").Value End If BBB: Next i D_Error: If Err.Number = 91 Then If i > lng Then GoTo AAA End If MsgBox "CP列に該当する型式がありません。" & Chr(13) _ & Chr(13) _ & "  型式があるものには「-」を使用してください。" & Chr(13) _ & " それ以外はCP44~CP100にデータを入力してください。" ActiveSheet.Cells(i, "D").Interior.ColorIndex = 3 GoTo BBB Else GoTo AAA End If AAA: 'D8から下にデータがない場合 Set rngTarget = Range("CP44:CP100").Find(What:=strType, lookat:=xlPart) '完全一致の解除 Range("D8").Select End Sub

  • エクセルマクロ インプットボックスの使い方

    エクセル2013です。 マクロの途中で作業者にマウスで列を選択してもらい その取得した列番号を使って、いろいろ処理を行うマクロを作りました。 Sub 実験() Dim マウス選択 As Range Dim 選択列 Dim 選択月表示 Dim 質問 Dim 最終列 Dim 最終行 最終列 = Cells(8, Columns.Count).End(xlToLeft).Column '8行目の最終列を取得 最終行 = Cells(Rows.Count, 1).End(xlUp).Row 'A列の最終行を取得 On Error GoTo myError Set マウス選択 = Application.InputBox("編集したい月の列を選択してください", Type:=8) 選択列 = マウス選択.Column 選択月表示 = Cells(8, 選択列).Value 質問 = MsgBox("選択した月は " & 選択月表示 & " です。いいですか?", vbYesNo) If 質問 = vbYes Then MsgBox "処理を行います" Else MsgBox "プログラムを中断します" Exit Sub End If ---処理内容---- myError: MsgBox "キャンセルが押されました。プログラム終了します。" End Sub 通常列を選択してくれればインプットボックス内には $V:$V などと表示されますが 行を選択されると $35:$35 などと表示され セルの一部を選択されると $D$40 などと表示されます。 行やセルを選択してもエラーなく最後まで進みますが選択した場所によっては とんでもない結果になってしまいます。 基本、列以外を選択したらメッセージボックスでアラームするか プログラムを停止させたいのですがどのような方法が有りますでしょうか? よろしくお願いします。

  • エクセルマクロで、エラー処理時にセルに色をつける方法

    エクセルマクロで、エラー処理時にセルに色をつける方法 エクセルマクロでファイルを移動する処理を行っています。 A1セルには共通のパスがあり、 A2セルには「旧ファイル」というタイトル、B2セルには「新ファイル」というタイトルが入っています。 そして、A3セルから下に向かって移動元のファイルのパス&ファイル名が入力されています。 B3セルから同じく下に向かって移動させたい先のパス&ファイル名が入力されています。 教えていただきたいのは、考えられるエラーが起こったときに 処理を途中で止めずにエラーの出た行(B列の)に色をつけ 次の処理に進む方法です。 考えられるエラーとは 1 旧ファイルが見つからない場合 2 新ファイルが移動先に既にある場合です。 下記のコードでエラー内容を表示させるまではできたのですが 1と2の場合分けをどうしたらいいかわかりません。 1の場合と2の場合の色をわけることができたら最高なのですが… どなたか教えてください。 よろしくお願いします。 Sub test() Dim i As Long On Error GoTo ErrorHandler i = 3 Do Until Cells(i, 1).Value = "" Name Range("A1").Value & Cells(i, 1).Value As Range("A1").Value & Cells(i, 2).Value i = i + 1 Loop Exit Sub ErrorHandler: MsgBox Err.Description End Sub

専門家に質問してみよう