
エクセルマクロの質問です。エクセルのヴァージョンは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も見ています
-
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
callで順に実行されるプロシージャを途中で止める方法
Excel(エクセル)
-
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
-
4
押したボタンの位置取得(共通のマクロ)
Excel(エクセル)
-
5
VBAでcallで呼び出したsubを終了させる
Visual Basic(VBA)
-
6
VBAでブックを非表示で開いて処理して閉じる方法
Excel(エクセル)
-
7
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
8
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
9
もしセルが#N/A"なら~をする・・・には?"
Excel(エクセル)
-
10
《エクセルVBA》「他の人が該当ファイルを使用中の場合」の処理
Excel(エクセル)
-
11
【Excel VBA】ファイル名が一定でないファイルの指定方法
Excel(エクセル)
-
12
配列で格納したものをmsgboxで表示する方法について
Access(アクセス)
-
13
数式による空白を無視して最終行を取得するマクロ
Excel(エクセル)
-
14
excelのマクロで該当処理できなければ飛ばして進むにはどうすればよいのでしょうか
Visual Basic(VBA)
-
15
【VBA】エラー処理で別プロシージャに飛ばす方法
Visual Basic(VBA)
-
16
Excel vba ListBoxについて
Excel(エクセル)
-
17
なぜExit Subがあるのかわかりません
Excel(エクセル)
-
18
【マクロ】名前を保存する際に、同じファイルがあった場合に、メッセージを表示
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
マクロ実行ボタンがコピー出来ない
-
【ExcelVBA】sheet作成時にマク...
-
EXCELのオートフィルターマクロ...
-
VBA シートの切り替えができな...
-
エクセル 「実行時エラー"13":...
-
不明なコマンドです("FROM")。...
-
mfc42.dllファイルってなんです...
-
Access2010 「演算子がありませ...
-
Bootcampで無線lan接続が出来ない
-
MACのBootCampでWin10のインス...
-
ゾンビエクセル・・・(Exc...
-
Office2000でWeb関係が使用でき...
-
エクセルVBAで参照設定というフ...
-
【minecraft mod】macでの作成方法
-
エクセルでテキストを任意のセ...
-
Excel2010でふりがなが漢字にな...
-
オペランドが足りませんとコメ...
-
パソコンにコンポーザーをイン...
-
オートメーションエラー
-
unix の mv コマンド
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【ExcelVBA】sheet作成時にマク...
-
VBA シートの切り替えができな...
-
エクセル/マクロ Exit Subが実...
-
マクロ実行ボタンがコピー出来ない
-
VBAでシートコピー後、シート名...
-
エクセル 「実行時エラー"13":...
-
エクセル 複数シートのフィル...
-
エクセルのシートを自動でコピー
-
エクセルのワークシートの並べ替え
-
Excelユーザーフォームでシート...
-
フェイス・シートについて教え...
-
VBA 教えてください
-
ワークシート上に配置したコマ...
-
不明なコマンドです("FROM")。...
-
Access2010 「演算子がありませ...
-
オペランドが足りませんとコメ...
-
エクセルの文字間スペースを入...
-
mfc42.dllファイルってなんです...
-
Excel2010でふりがなが漢字にな...
-
InstallShieldWizardのエラー
おすすめ情報