
エクセルマクロの質問です。エクセルのヴァージョンは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
No.4ベストアンサー
- 回答日時:
こんな感じでどうでしょう。
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でユーザーフォームを終了させてもよいのですが、シートを複数回コピーする場合を考えると、終了ボタンで終了させた方がよいと思います。
というのはなぜでしょうか?
解決の糸口になりました。Exit Sub とUnload Meを勘違いしていたようです。また一から勉強しなおしです。どうもありがとうございました。
No.5
- 回答日時:
>処理後にExit Subが実行されません
>やはりExit Subにはたどり着けませんでした。
提示のコードはまともに動作するコードです。
上記のように判断した理由はなんですか?
それをちゃんと提示しませう。
(Exit SubをExitSubと書いてあるのは単に転記ミスでしょうね)
●因みに提示のコードでは、Exit Subは不要です。
というよりない方がベターでしょう。
以上です。
この回答への補足
CommandButton1でユーザーフォームを終了させる方法をお尋ねしたかったんです。Exit Sub をUnload Meに変更したら希望どおりに作動しました。Exit SubとUnload Meを勘違いしていたようです。
補足日時:2010/12/08 14:41No.3
- 回答日時:
「エクセル/マクロ エラー処理がうまくいきません」
前回の回答者ですが、なぜ、私のコードが無視するほどのレベルでしょうか?
もう一度、私の前回のコードを確認してみてください。シート名の法則が書かれています。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 の違いは理解しておくようにしましょう。これも、基本です。
前回の質問ではすべての質問にお礼を付ける前に締切ってしまいました。大変失礼しました。
私はまだVBAを勉強中で、何が基本で何が基本じゃないかはわかりません。背伸びせずにわかる範囲から徐々に勉強していこうと思っている次第です。
いつかは頑張ってWendy02さんのように細かいことにも気を配れる完璧超人になりたいものです。ありがとうございました。
No.2
- 回答日時:
>フォームを閉じるという処理を目指しています。
だったら
exit sub でなく
フォームを閉じるという処理を目指しています。
ActiveWorkbook.Close または Workbook.Close
ではないでしょうか
この回答への補足
ワークブックではなくユーザーフォームを終了させる方法をお尋ねしたかったんです。Exit Sub をUnload Meに変更したら希望どおりに作動しました。ありがとうございました。
補足日時:2010/12/08 14:42お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) エクセルのマクロについて教えてください。 7 2023/07/04 09:18
- Excel(エクセル) なぜExit Subがあるのかわかりません 4 2023/02/19 12:34
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/02/02 09:25
- Visual Basic(VBA) 【変更】ファイルを閉じてダイアログで保存した時、更新したシートだけの処理の実行をする 5 2022/03/26 18:31
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
このQ&Aを見た人はこんなQ&Aも見ています
-
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
VBAでブックを非表示で開いて処理して閉じる方法
Excel(エクセル)
-
-
4
VBAでcallで呼び出したsubを終了させる
Visual Basic(VBA)
-
5
コンボボックス内の文字サイズ変更
Excel(エクセル)
-
6
押したボタンの位置取得(共通のマクロ)
Excel(エクセル)
-
7
配列で格納したものをmsgboxで表示する方法について
Access(アクセス)
-
8
UserForm1.Showでエラーになります。
工学
-
9
【VBA】エラー処理で別プロシージャに飛ばす方法
Visual Basic(VBA)
-
10
callで順に実行されるプロシージャを途中で止める方法
Excel(エクセル)
-
11
VBA 変数名に変数を使用したい。
Visual Basic(VBA)
-
12
VBAでの Replace関数で、ワイルドカードは使えないのでしょうか?
Visual Basic(VBA)
-
13
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
14
VBAでワークシートを引数としてサンプル関数に渡したい
Visual Basic(VBA)
-
15
なぜExit Subがあるのかわかりません
Excel(エクセル)
-
16
【マクロ】名前を保存する際に、同じファイルがあった場合に、メッセージを表示
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
EXCELのVBAで複数のシートを追...
-
オートフィルターの絞込みをし...
-
勤怠表について ABS、TEXT関数...
-
【マクロ】【画像あり】関数が...
-
空白のはずがSUBTOTAL関数でカ...
-
Excelで4択問題を作成したい
-
エクセルについて
-
エクセルシートの見出しの文字...
-
【Officer360?Officer365?の...
-
エクセルの複雑なシフト表から...
-
Excelに貼ったXのURLのリンク...
-
グループごとの人数のカウント
-
グループごとの個数をカウント...
-
ページが変なふうに切れる
-
エクセル
-
エクセル ドロップダウンリスト...
-
グループごとの人数のカウント
-
エクセル GROUPBY関数について...
-
特定のセルだけ結果がおかしい...
-
VBA チェックボックスをオーバ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【ExcelVBA】sheet作成時にマク...
-
エクセル/マクロ Exit Subが実...
-
VBA シートの切り替えができな...
-
マクロ実行ボタンがコピー出来ない
-
Excelユーザーフォームでシート...
-
エクセル 「実行時エラー"13":...
-
VBAでシートコピー後、シート名...
-
エクセル 複数シートのフィル...
-
【エクセル】シートを分割する...
-
Excelのシートを集約したいので...
-
アクセス97での罫線について
-
VBAを入れる場所
-
EXCELのオートフィルターマクロ...
-
シート保護でオートフィルタ機...
-
【エクセル】複数の文字を同時...
-
Excelマクロによる単語リストの...
-
全てのブックへのシートの挿入
-
シートの表示が消えて整列をし...
-
Excelシートの統合するマ...
-
ワークシート上に配置したコマ...
おすすめ情報