エクセルマクロのExit Subが実行されない

このQ&Aのポイント
  • エクセルのマクロでExit Subが実行されない問題についての質問です。エクセルの2000版を使用しています。特定の条件下でシートをコピーして名前を変更し、フォームを閉じる処理を行いたいのですが、Exit Subが実行されません。
  • 条件分岐文(If文)の中でExit Subを使用していますが、処理の最後にたどり着くことができません。メッセージボックスを挿入するとメッセージは表示されるため、問題はExit Subの部分にあると考えられます。
  • Exit Subが実行されない理由と解決法について教えてください。
回答を見る
  • ベストアンサー

エクセル/マクロ Exit Subが実行されない

エクセルマクロの質問です。エクセルのヴァージョンは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

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

  • ベストアンサー
  • hananoppo
  • ベストアンサー率46% (109/235)
回答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でユーザーフォームを終了させてもよいのですが、シートを複数回コピーする場合を考えると、終了ボタンで終了させた方がよいと思います。

ocypodidae
質問者

お礼

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

ocypodidae
質問者

補足

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

その他の回答 (4)

  • myRange
  • ベストアンサー率71% (339/472)
回答No.5

>処理後にExit Subが実行されません >やはりExit Subにはたどり着けませんでした。 提示のコードはまともに動作するコードです。 上記のように判断した理由はなんですか? それをちゃんと提示しませう。 (Exit SubをExitSubと書いてあるのは単に転記ミスでしょうね)   ●因みに提示のコードでは、Exit Subは不要です。  というよりない方がベターでしょう。 以上です。

ocypodidae
質問者

お礼

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

ocypodidae
質問者

補足

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

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.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 の違いは理解しておくようにしましょう。これも、基本です。

ocypodidae
質問者

お礼

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

  • shinkami
  • ベストアンサー率43% (179/411)
回答No.2

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

ocypodidae
質問者

お礼

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

ocypodidae
質問者

補足

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

  • kool_noah
  • ベストアンサー率33% (95/285)
回答No.1

たどりつけないというのはどういう事でしょう・・? 上のコードを見ていると「ExitSub」が「Exit Sub」ではないので普通にエラーになりそうですが それは単純なコピペミスだとして、「Task Completed」が表示された後は処理がないのでExit Subしなくてもいいような気もするんですが

ocypodidae
質問者

お礼

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

関連するQ&A

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

    エクセルマクロの質問です。エクセルのヴァージョンは2000です。 シートをコピーして新シートに任意の名前を付けるマクロを作っています。 ユーザーフォームの中に一つのテキストボックス(新シートの名前入力用)と 二つのコマンドボタンを設置し一つは実行ボタン、もう一つはキャンセルボタンとしました。 テキストボックスに不正な名前(空白、記号、すでに存在するシート名)が入力された状態で 実行ボタンを押すと新シートは作成されず、メッセージボックスで実行できない旨が表示され、 入力フォームに戻るという感じにしようと思っています。 エラー処理には下記の通りOn Errorステートメントを試してみました。が、どうもうまくいきません。 エラーが出ても新しいシートが作成されてしまい、その後にメッセージボックスが出てしまいます。 正しいエラー処理の仕方をご教示頂けると幸いです。どうぞよろしくお願いします。 Private Sub CommandButton1_Click() Dim NewSheetName As String NewSheetName = TextBox1.Value On Error GoTo Err1 Sheets("Summary").Select Sheets("Summary").Copy After:=Sheets("Summary") ActiveSheet.Name = NewSheetName Exit Sub Err1: MsgBox "Invalid name"    Exit Sub End Sub

  • コマンドボタンに二回目のマクロ実行しない設定を

    excel2007を使ってマクロ作成の初心者です。 「最新明細」シート上に、ユーザーフォームがあります。 その中のコマンドボタンクリックすると マクロ2を実行します。 しかし、このマクロは月初めに1回だけ実行し、 再びボタンをクリックしても、マクロ2を実行しないようにしたいです。 いろいろ考えたましたが、思ったように動作させることできず、こまってます。 どうしたらよいのでしょう。 Sub 処理済の確認() Dim AB3 As Date Dim AB4 As Date Sheets("計算").Select If AB3 = AB4 Then Exit Sub MsgBox "データは処理済みです。" Sheets("最新明細").Select Else End If If AB3 <> AB4 Then マクロ2の実行 End If End Sub

  • エクセルのマクロで exit について

    よろしくおねがいします 各々のシートのX1セルを値を参照して ゼロ以外の時は 印刷の処理をして ゼロの時は処理をしない という内容を書きたく思います。 このままで記述だとX1セルの値がゼロの場合 いきなりsubを抜けてしまうのですが 1,2枚目でゼロの場合 その次のシートにきちんと処理が 継続したいのですが どこを修正したらよろしいでしょうか? Sub マクロ() Dim shAry As Variant Dim i As Integer, cnt As Integer, x As Integer shAry = Array("東京", "千葉", "群馬") For cnt = LBound(shAry) To UBound(shAry) Sheets(shAry(cnt)).Select x = Int(((Range("x1").Value) - 1) / 5) + 1 If x = 0 Then GoTo ゼロの場合の処理 Else MsgBox "印刷枚数は " & x & "枚です" ここにいんさつの処理があります End If Next Exit Sub ゼロの場合の処理: MsgBox "印刷する内容はありません" End Sub

  • ■助けてください。■エクセルのマクロで困っています。

    エクセルで、シートを一つ削除するマクロを教えてください。 本当に困っています。 マクロをご存知の方、ずぶの素人の私にご教示何卒よろしくお願いします。 文末にマクロを記述いたしますが、そちらは、 指定した日付以降にエクセルのファイルを開くと シートがすべて削除されて、「有効期限切れ」という シートだけが出てくるというものです。 現在、これを応用して、すべてのシートを 削除するのではなく、ひとつのシートだけ削除したいのです。 例えば「SheetA」、「SheetB」、「SheetC」、「有効期限切れ」という 4つのシートがあったとして、 指定した期日が来たら、「SheetC」だけを削除したいのです。 なお、エクセルファイルを開く際に、マクロを無効にされてしまうと 期日が来てもSheetCが削除されずに 残ってしまっては困るのです。 そこで、マクロを有効にしないと SheetCが現れないようにしたいのです。 (以下のマクロではそのようになっています) 一つだけシートを削除するマクロをやり方をご存知の方、マクロのご教示のほど 何卒よろしくお願い致します。 なお、小生、マクロはずぶの素人でして、 マクロの文面を頂いてコピー貼り付けするぐらいしか 能がありません。 つきましては、以下の文面を モディファイしてご教示頂けませんでしょうか。 よろしくお願いいたします。 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) endsheetname = "有効期限切れ" If (Sheets.Count = 1) And (Sheets(1).Name = endsheetname) Then Exit Sub If Sheets("SheetA ").Visible Then Sheets("SheetC ").Visible = xlVeryHidden End Sub Private Sub Workbook_Open() endsheetname = "有効期限切れ" If Date >= "3008/09/29" Then Application.DisplayAlerts = False If Sheets.Count = 1 Then If Sheets(1).Name <> endsheetname Then Sheets.Add(After:=ActiveSheet).Name = endsheetname End If Else On Error Resume Next Sheets(endsheetname).Delete On Error GoTo 0 Sheets.Add(After:=ActiveSheet).Name = endsheetname End If sheetnumber = Sheets.Count For i = 1 To sheetnumber For j = 1 To 2 If Sheets.Count = 1 Then Exit For If Sheets(j).Name = " SheetC " Then If Not Sheets("SheetC ").Visible Then Sheets("SheetC ").Visible = True If Sheets(j).Name <> endsheetname Then Sheets(Sheets(j).Name).Delete: Exit For Next Next Range("b" & 3).Value = "ご利用ありがとうございました。" ActiveWorkbook.Save Application.DisplayAlerts = True End If If (Sheets.Count = 1) And (Sheets(1).Name = endsheetname) Then Exit Sub If Not Sheets(" SheetC ").Visible Then Sheets(" SheetC ").Visible = True End Sub

  • Excelマクロで変数を文字列として代入したい

    excelでピボットテーブルを作成する前段階で参照シート名を変数に入れそれを式に入れたいのですが、どの様な式にしたら良いでしょうか? 何卒、宜しくお願い致します。 Dim NewSheetName As String NewSheetName = InputBox("参照データのあるシート名を入力ください") If NewSheetName = "" Then Exit Sub Sheets.Add MsgBox "選択したシート名は" & NewSheetName & "です。" ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _    'ここの変数     ' ↓ "NewSheetName!R1C1:R95C18",Version:=xlPivotTableVersion15).CreatePivotTable _ TableDestination:="Sheet1!R3C1", TableName:="ピボットテーブル2", DefaultVersion _ :=xlPivotTableVersion15 Sheets("Sheet1").Select

  • エクセルのマクロについて教えていただきたいのですが・・・

    見積書を作成しているんですが、1枚目のシート(見積書)に明細が書ききれなかった時に、マクロを実行すると、『明細書』と言う名前のシートが(1)~(5)枚目まで追加され、各シートの小計を1枚目のシートに書き出す・・・と言うマクロを作りたいのですが、うまくいかずに困っています>< 追加されるシートの元となる『見積もりマスター』と言うシートがあって、そのシート内でそれぞれのシートの小計は取れるのですが・・・ 下記のマクロの中に何か追加すればうまくいく方法はありますか?? (明細書は追加する時もあれば追加しない時もあってその都度、使う人が、最大5枚まで何枚追加するかを決めるそうです。) Sub Macro1() Dim cnt As Integer Dim wkNum As Double Dim ws As Worksheet  For Each ws In Worksheets   If Left(ws.Name, 4) = "明細書(" Then    If IsNumeric(Mid(ws.Name, 5, 1)) Then     wkNum = Val(Mid(ws.Name, 5, 1))     If cnt < wkNum Then      cnt = wkNum     End If    End If   End If  Next ws  If cnt >= 5 Then   MsgBox ("明細書シートが既に5枚以上あるため追加できません")   Exit Sub  Else   Sheets("明細マスター").Copy after:=Sheets(Worksheets.Count)   ActiveSheet.Name = "明細書(" & cnt + 1 & ")"  End If End Sub マクロ自体をあまり理解できてなくて、会社の人や、ここで教えていただいて進めているので、出来ればそのままコピーして使用できるようにしていただけるとありがたいです。 よろしくお願いします。

  • エクセル マクロ エラー

    Sub 保存() Dim MySheetName As Variant MySheetName = InputBox("シート名を入力してください") If MySheetName = "" Then Exit Sub Sheets("1").Copy After:=Sheets(Worksheets.Count) ActiveSheet.Name = MySheetName Sheets("原本").Range("A1:K73").Copy Sheets("1原本").Range("A1") End Sub シートにグラフを乗せたらエラーが出たのですが 解除できないでしょうか?

  • If文中のExit Sub

    Dim i As String i = TextBox1.Value If i ="" Then MsgBox "入力なし" Exit Sub End If Exit Subは何の意味が有るのでしょう? Exit Subを調べたり試したりしたのですが、良く、解りません。 宜しくお願い致します。

  • エクセルマクロについて助言下さい。

    エクセルマクロについて助言下さい。 ★やりたい事 シート名を指定しアクティブにする BOOOKに複数のセルがあり、シート名は日付(1・2など) 但し、必ず連続ではなく1~31までのシートが存在します。 現在のマクロ↓ シート名を取得し関数で指定のシートが存在するか確認しています。 作業シートのC1セルが0で指定シートなし 0でないで指定シートあり(処理開始)としてます。 作業2のI3セルに日付データがあります。 Sub 抽出() 'シート名を取得する Sheets("作業").Select Dim i As Integer Dim mySheetCnt As Integer Dim mySheetNam As String    mySheetCnt = ThisWorkbook.Sheets.Count For i = 1 To mySheetCnt mySheetNam = Sheets(i).Name Sheets("作業").Cells(i, 1) = mySheetNam Next i   Range("A1").Select If ActiveCell.Value = "" Then 'A1が空白の場合の処理 MsgBox "指定の日付のシートが存在しません" Exit Sub End If Sheets("作業").Select Range("C1").Select If ActiveCell.Value = 0 Then 'C1が0の場合の処理 MsgBox "指定の日付のシートが存在しません" Exit Sub End If Sheets("作業2").Select Range("I3").Select Sheets(ActiveCell.alue).Select End Sub このコードだと3と指定すると左から3枚目にあるシートが選択されます。 3枚目ではなくシート名が 3 を選択したいのです。。 分かりにく説明で申し訳ありませんが、教えてください。

  • エクセルのマクロを利用して

    マクロ初心者でです。 いろんなサイトから引用させて頂き次のようなマクロを作成しました。 実行すると、日付と担当者氏名(A1)がファイル名となるものです。 そこで教えて頂きたいのですが、実行すると保存先がマイドキュメントに なるのですが、これを例えば「C:\日報」というフォルダが指定されるようにしたいのですが、 自分なりに、いろいろ試したのですが全くできません。 宜しくお願い致します。 Sub 名前をつけて保存() Dim SaveFileName As String, re As Variant With Sheets("sheet1").Range("A1") If .Value = "" Then MsgBox "名前が入力されていません", vbExclamation Exit Sub Else SaveFileName = Format(Now, "yyyymmdd") & "_" & .Value End If End With re = Application.GetSaveAsFilename(SaveFileName) If re = False Then MsgBox "保存を中止しました", vbExclamation Else MsgBox "日報をを保存しました", vbInformation End If End Sub

専門家に質問してみよう