- ベストアンサー
エクセルマクロ エラー処理の改善方法
- エクセルのマクロで新しいシートを作成する際に、入力された名前が不正な場合にエラー処理を行う方法がうまくいかない問題が発生しています。エラーが出ても新しいシートが作成されてしまい、その後にメッセージボックスが表示されてしまいます。正しいエラー処理の方法を教えていただきたいです。
- エクセルのマクロで新しいシートを作成する際、不正な名前(空白、記号、すでに存在するシート名)が入力された場合にエラー処理を行いたいと思っています。しかし、現在のエラー処理ではエラーが発生しても新しいシートが作成されてしまいます。エラー処理の改善方法を教えてください。
- エクセルのマクロで新しいシートを作成する際、不正な名前が入力された場合にエラー処理を行いたいのですが、現在のエラー処理ではうまくいきません。エラーが発生しても新しいシートが作成されるため、改善方法を教えていただきたいです。
- みんなの回答 (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
その他の回答 (2)
- Wendy02
- ベストアンサー率57% (3570/6232)
あえて、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)
Sheets("Summary").Copy After:=Sheets("Summary") ここでコピーしたが、エラーではない。新しいシートはコピーされる。 ActiveSheet.Name = NewSheetName ここでエラーになる。だからコピーされたシートはそのまま残る。 ではどうするかと言えば、例えば、エラーに成ったときコピーされたシートを削除する。ついでにシートの削除で文句を言われないおまじないもいれておく。 Err1: MsgBox "Invalid name" Application.DisplayAlerts = False ActiveSheet.Delete Application.DisplayAlerts = True Exit Sub
お礼
'NewSheetName = TextBox1.Value NewSheetName = "12/15" NewSheetName = "12-15" の部分は NewSheetName = TextBox1.Value に置き換えて試してみました。 元のページの名前を変えて、新しいページから元ページを作り直す・・・逆転の発想ですね。コードもシンプルな上に処理速度も速く、驚いています。 どうもありがとうございました。