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

エクセルマクロの質問です。エクセルのヴァージョンは2000です。
あるシートをコピーして新シートに任意の名前を付けるマクロを作っています。ユーザーフォームの中に一つのテキストボックス(新シートの名前入力用)と二つのコマンドボタンを設置し一つは実行ボタン、もう一つはキャンセルボタンとしました。
QNo.6367227でエラー処理に関する質問をさせていただきましたが、こちらは見事に解決していただきました。

今回の質問はExit Subに関する質問です。
If構文で、条件文1が真であればシートをコピーして名前を変更、フォームを閉じるという処理を目指しています。
If 条件 Then ~ 処理 Exit Sub
という形を作って試してみたのですが、処理後にExit Subが実行されません。Exit Subの前にメッセージボックスを挿むとメッセージは表示されましたが、やはりExit Subにはたどり着けませんでした。

すごく初歩的な事で恥ずかしいのですが、Exit Subが実行されない理由と解決法をご教示いただけると助かります。よろしくお願いします。

Private Sub CommandButton1_Click()

Dim NewSheetName As String
NewSheetName = TextBox1.Value

On Error Resume Next
Sheets("Summary").Name = NewSheetName
If Err.Number = 0 Then
Sheets(NewSheetName).Copy before:=Sheets(NewSheetName)
ActiveSheet.Name = "Summary"

MsgBox ("Task Completed!")
ExitSub

Else
MsgBox "Invalid name!"
End If
On Error GoTo 0

End Sub

A 回答 (5件)

こんな感じでどうでしょう。



Private Sub CommandButton1_Click()
Dim Ws As Worksheet

Set Ws = Worksheets("Summary")
On Error GoTo ErrorMessage
Ws.Name = TextBox1.Value
On Error GoTo 0
Ws.Name = "Summary"
Ws.Copy After:=Ws
ActiveSheet.Name = TextBox1.Value
MsgBox "Task Completed!"
Exit Sub

ErrorMessage:
MsgBox "Invalid name!"
End Sub

Private Sub CommandButton2_Click()
Unload Me
End Sub

CommandButton2はキャンセルボタンというより終了ボタンになります。
「Unload Me」でユーザーフォームを終了します。
CommandButton1でユーザーフォームを終了させてもよいのですが、シートを複数回コピーする場合を考えると、終了ボタンで終了させた方がよいと思います。

この回答への補足

CommandButton1でユーザーフォームを終了させる方法をお尋ねしたかったんです。Exit Sub をUnload Meに変更したら希望どおりに作動しました。
)CommandButton1でユーザーフォームを終了させてもよいのですが、シートを複数回コピーする場合を考えると、終了ボタンで終了させた方がよいと思います。
というのはなぜでしょうか?

補足日時:2010/12/08 14:36
    • good
    • 0
この回答へのお礼

解決の糸口になりました。Exit Sub とUnload Meを勘違いしていたようです。また一から勉強しなおしです。どうもありがとうございました。

お礼日時:2010/12/09 14:18

>処理後にExit Subが実行されません


>やはりExit Subにはたどり着けませんでした。

提示のコードはまともに動作するコードです。
上記のように判断した理由はなんですか?
それをちゃんと提示しませう。

(Exit SubをExitSubと書いてあるのは単に転記ミスでしょうね)
 
●因みに提示のコードでは、Exit Subは不要です。
 というよりない方がベターでしょう。
以上です。

この回答への補足

CommandButton1でユーザーフォームを終了させる方法をお尋ねしたかったんです。Exit Sub をUnload Meに変更したら希望どおりに作動しました。Exit SubとUnload Meを勘違いしていたようです。

補足日時:2010/12/08 14:41
    • good
    • 0
この回答へのお礼

質問が不明瞭で申し訳ありませんでした。
優しくしていただいてどうもありがとうございました。

お礼日時:2010/12/09 14:12

「エクセル/マクロ エラー処理がうまくいきません」



前回の回答者ですが、なぜ、私のコードが無視するほどのレベルでしょうか?
もう一度、私の前回のコードを確認してみてください。シート名の法則が書かれています。31文字までとか、使ってはいけない文字とか、同ブックに同じ名前はないこととか、網羅されています。こういうことは基本的なことだと思います。

本来は、シート名をコピーしてシート名を変えれば、後は、MsgBox を出せば済むはずです。

エラートラップというのは、伝家の宝刀のようなもので、エラートラップは上級ワザなのです。こういう私でも、それに頼ると、さっぱりコードが見えなくなることがあります。今回は、識別子のExitSub(正しくは、Exit Sub) は認識されてしまっているけれども、本来は、エラーが出ていて、エラートラップで通り越ししているように見受けられます。

予想しうるエラーは、避けられるなら、事前にエラーの発生を極力避けるというのが、VBAの基本です。

今回は、やむを得ず、エラートラップを生かしますが、シート名を入れる前に、すべてをチェックすれば、少なくも、省メモリになると考えて作ったのですが、ここの質問者さんの多くは、VBAが少し分かるようになると、そういうコードはめんどうだから避けるようになってしまうようです。最近は、そういう人が多くなっているようです。今回だけは、一応、回答を付けておきます。

シートコピーは、元のシートに名前登録などないことが条件になります。
元のシートの名前を変えるのは、どうでしょうね。私なら、そのようなコードは書きません。

'//
Private Sub CommandButton1_Click()
 Dim NewSheetName As String
 NewSheetName = TextBox1.Value
 If NewSheetName = "" Then Exit Sub
 On Error GoTo Err1
  Worksheets("Summary").Copy After:=Worksheets("Summary")
  ActiveSheet.Name = NewSheetName
  Worksheets("Summary").Select
  MsgBox "Task Completed!"
  'Unload Me 'UserForm終了
  Exit Sub
Err1:
  MsgBox "Invalid name!"
End Sub

それと、Sheets とWorksheets の違いは理解しておくようにしましょう。これも、基本です。
    • good
    • 0
この回答へのお礼

前回の質問ではすべての質問にお礼を付ける前に締切ってしまいました。大変失礼しました。
私はまだVBAを勉強中で、何が基本で何が基本じゃないかはわかりません。背伸びせずにわかる範囲から徐々に勉強していこうと思っている次第です。
いつかは頑張ってWendy02さんのように細かいことにも気を配れる完璧超人になりたいものです。ありがとうございました。

お礼日時:2010/12/08 02:12

>フォームを閉じるという処理を目指しています。



だったら
exit sub でなく
フォームを閉じるという処理を目指しています。
ActiveWorkbook.Close または Workbook.Close
ではないでしょうか

この回答への補足

ワークブックではなくユーザーフォームを終了させる方法をお尋ねしたかったんです。Exit Sub をUnload Meに変更したら希望どおりに作動しました。ありがとうございました。

補足日時:2010/12/08 14:42
    • good
    • 0
この回答へのお礼

質問が不明瞭な為にご迷惑をおかけしました。

お礼日時:2010/12/09 14:20

たどりつけないというのはどういう事でしょう・・?


上のコードを見ていると「ExitSub」が「Exit Sub」ではないので普通にエラーになりそうですが
それは単純なコピペミスだとして、「Task Completed」が表示された後は処理がないのでExit Subしなくてもいいような気もするんですが
    • good
    • 0
この回答へのお礼

Exit Sub とUnload Meを勘違いしていたようです。素早い回答、感謝至極、です。

お礼日時:2010/12/09 14:23

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A