• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エクセル/マクロ エラー処理がうまくいきません)

エクセルマクロ エラー処理の改善方法

このQ&Aのポイント
  • エクセルのマクロで新しいシートを作成する際に、入力された名前が不正な場合にエラー処理を行う方法がうまくいかない問題が発生しています。エラーが出ても新しいシートが作成されてしまい、その後にメッセージボックスが表示されてしまいます。正しいエラー処理の方法を教えていただきたいです。
  • エクセルのマクロで新しいシートを作成する際、不正な名前(空白、記号、すでに存在するシート名)が入力された場合にエラー処理を行いたいと思っています。しかし、現在のエラー処理ではエラーが発生しても新しいシートが作成されてしまいます。エラー処理の改善方法を教えてください。
  • エクセルのマクロで新しいシートを作成する際、不正な名前が入力された場合にエラー処理を行いたいのですが、現在のエラー処理ではうまくいきません。エラーが発生しても新しいシートが作成されるため、改善方法を教えていただきたいです。

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

  • ベストアンサー
  • ki-aaa
  • ベストアンサー率49% (105/213)
回答No.3

最初にシート名のチェックをするようにしました。 試してみて Sub test() Dim NewSheetName As String 'NewSheetName = TextBox1.Value NewSheetName = "12/15" NewSheetName = "12-15" On Error Resume Next Sheets("Summary").Name = NewSheetName If Err.Number = 0 Then Sheets(NewSheetName).Copy before:=Sheets(NewSheetName) ActiveSheet.Name = "Summary" Else MsgBox "Invalid name" End If On Error GoTo 0 End Sub

ocypodidae
質問者

お礼

'NewSheetName = TextBox1.Value NewSheetName = "12/15" NewSheetName = "12-15" の部分は NewSheetName = TextBox1.Value に置き換えて試してみました。 元のページの名前を変えて、新しいページから元ページを作り直す・・・逆転の発想ですね。コードもシンプルな上に処理速度も速く、驚いています。 どうもありがとうございました。

その他の回答 (2)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

あえて、Err1:があるので、それを残す方法としては、以下のようなコードはどうでしょう。昔、私が考えたコードです。あえて、On Error GoTo Err1 を生かしたコードですから、必ずしも、エラートラップが必要なわけではありません。 Private Sub CommandButton1_Click()  Dim NewSheetName As String  Const vbMyError As Integer = 513  On Error GoTo Err1  Worksheets("Summary").Select  NewSheetName = TextBox1.Value  If IsSheetName(NewSheetName) = False Then    Err.Raise vbMyError  End If  Worksheets("Summary").Copy After:=Worksheets("Summary")  ActiveSheet.Name = NewSheetName  Exit Sub Err1:  If Err.Number = vbMyError Then   MsgBox "Invalid name"   TextBox1.Text = ""  End If End Sub Private Function IsSheetName(ShName As String) As Boolean 'シート名のエラーチェック   Dim v As Variant   Dim i As Integer   Dim sh As Object   '文字列の長さの制限   If Len(ShName) > 31 Or Len(Trim(ShName)) < 1 Then IsSheetName = False: Exit Function   '使用出来ない文字の検出   For Each v In Array(":", "\", "/", "?", "*", "(", ")")     i = InStr(1, ShName, v, vbBinaryCompare)     If i > 0 Then IsSheetName = False: Exit Function   Next v   For Each sh In ActiveWorkbook.Sheets     If StrComp(sh.Name, ShName, vbTextCompare) = 0 Then IsSheetName = False: Exit Function    Next sh   IsSheetName = True End Function

  • f272
  • ベストアンサー率46% (8529/18254)
回答No.1

Sheets("Summary").Copy After:=Sheets("Summary") ここでコピーしたが、エラーではない。新しいシートはコピーされる。 ActiveSheet.Name = NewSheetName ここでエラーになる。だからコピーされたシートはそのまま残る。 ではどうするかと言えば、例えば、エラーに成ったときコピーされたシートを削除する。ついでにシートの削除で文句を言われないおまじないもいれておく。 Err1: MsgBox "Invalid name" Application.DisplayAlerts = False ActiveSheet.Delete Application.DisplayAlerts = True Exit Sub

関連するQ&A

専門家に質問してみよう