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

下の2つのエクセルVBAコードについて質問です。これはChatGPTにきいた結果のコードで、どちらも動作しました。

質問したい部分は下のコードのExit Subです。Exit Subは2回出てきますが、1回目の
Exit SubはFor Each sht In Worksheets・・・のひと塊の部分に呼応するもので理解できていますが、2回目のはどうしてあるのか、どこに呼応しているのかわかりません。
というのも、1つ目のコードには出てこないからです。

どなたか教えていただけないでしょうか?


Sub 予約表作成ChatGPT()
branch = Worksheets("予約").Range("C2").Value
Worksheets("予約表ひな形").Copy _
After:=Worksheets("予約表ひな形")
Worksheets(3).Name = branch
Worksheets(branch).Range("F3").Value = branch

rw = 5
LastRow = Worksheets("予約").Cells(Rows.Count, 3).End(xlUp).Row

For i = 5 To LastRow
If Worksheets("予約").Cells(2, 3).Value = _
Worksheets("予約").Cells(i, 3).Value Then
Worksheets(branch).Cells(rw + 1, 2).Value = _
Worksheets("予約").Cells(i, 1).Value
Worksheets(branch).Cells(rw, 2).Value = _
Worksheets("予約").Cells(i, 2).Value
Worksheets(branch).Cells(rw, 4).Value = _
Worksheets("予約").Cells(i, 4).Value
Worksheets(branch).Cells(rw + 1, 4).Value = _
Worksheets("予約").Cells(i, 5).Value
Worksheets(branch).Cells(rw + 2, 4).Value = _
Worksheets("予約").Cells(i, 6).Value

rw = rw + 3
End If
Next
End Sub
---------------------------------------------------------------------------------
Sub 予約表作成ChatGPT同名エラー()
On Error GoTo SheetExistsError

Dim branch As String
branch = Worksheets("予約").Range("C2").Value

' Check if sheet name already exists
For Each sht In Worksheets
If sht.Name = branch Then
MsgBox "同名のシートが既に存在します。処理を中止します。", vbExclamation, "エラー"
Exit Sub
End If
Next

Worksheets("予約表ひな形").Copy After:=Worksheets("予約表ひな形")
Worksheets(3).Name = branch
Worksheets(branch).Range("F3").Value = branch

Dim rw As Long, LastRow As Long
rw = 5
LastRow = Worksheets("予約").Cells(Rows.Count, 3).End(xlUp).Row

For i = 5 To LastRow
If Worksheets("予約").Cells(2, 3).Value = Worksheets("予約").Cells(i, 3).Value Then
Worksheets(branch).Cells(rw + 1, 2).Value = Worksheets("予約").Cells(i, 1).Value
Worksheets(branch).Cells(rw, 2).Value = Worksheets("予約").Cells(i, 2).Value
Worksheets(branch).Cells(rw, 4).Value = Worksheets("予約").Cells(i, 4).Value
Worksheets(branch).Cells(rw + 1, 4).Value = Worksheets("予約").Cells(i, 5).Value
Worksheets(branch).Cells(rw + 2, 4).Value = Worksheets("予約").Cells(i, 6).Value

rw = rw + 3
End If
Next

Exit Sub

SheetExistsError:
MsgBox "エラー:" & Err.Description, vbCritical, "エラー"
End Sub

A 回答 (4件)

> On Error GoTo SheetExistsErrorの記述がなければ二つ目のExit Subは不要ですか?



こうしたとき。

■エラーが出た時
ラベル「SheetExistsError:」に飛ばなくなるので、
エラーで処理が中止しますよね。


■エラーがないとき

Sub 予約表作成ChatGPT同名エラー()
  【処理】
  ’Exit Sub これが無いので、以降の処理も続く。
'↓これはあくまで GoTo で飛んでくる目印となるラベル。
SheetExistsError:
  MsgBox "エラー:" & Err.Description, vbCritical, "エラー"
End Sub

となります。
【処理】が終わったあとExit Sub で終了しないので、
その後に書かれている、最後のエラー時に用意されていたMsgBoxまで表示されます。
実際はエラーは無いのに、ね。
    • good
    • 1
この回答へのお礼

あーっ、わかりました。そういうことですね!ありがとうございました。

お礼日時:2023/02/19 13:40

エラーハンドラー(SheetExistsError)以降の処理を通過してしまったら


正常に寄りした後に通過したのか?
エラー発生で遷移させられたのか判別するの面倒くさいからでしょ?
    • good
    • 1

Sub 予約表作成ChatGPT同名エラー()


  '実行中にエラーがでたら、ラベル「SheetExistsError」に飛んでね
  On Error GoTo SheetExistsError
  
  【処理】
  '一連の処理が終わったときに、終了するEnd Sub
  Exit Sub
  
'処理途中でエラが出たらここから続ける
SheetExistsError:
  MsgBox "エラー:" & Err.Description, vbCritical, "エラー"
'エラーで飛んできたときにたどり着くEnd Sub
End Sub

って感じでわかるかな??

1つ目に無いのは、エラーの発生を想定していない、もしくはエラー処理まで考慮していないから。
    • good
    • 1
この回答へのお礼

ありがとうございます。
今パソコンのないところで使えませんが、もし

On Error GoTo SheetExistsErrorの記述がなければ二つ目のExit Subは不要ですか?

お礼日時:2023/02/19 13:14

2回目のexit sub は、処理がうまく行った時、正常にそのプロシージャ(予約表作成ChatGPT同名エラー)を抜けるためののものです。


このexit subがないと、次の
MsgBox "エラー:" & Err.Description, vbCritical, "エラー"
が表示され、おかしなメッセージが表示されてしまいます。
    • good
    • 0
この回答へのお礼

ありがとうございます。一つ目のコードにないのはなぜでしょうか?

お礼日時:2023/02/19 12:51

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