• ベストアンサー

エクセルのマクロでシート名の検索をしたい

マクロの初心者です。お教え下さい。 ブックの中に複数のシートがあります。 どのシートにも「個人別データ」という名前のシートが無い時に 「個人別データのシートがありません。」とメッセージボックスを 表示させ、マクロを終了したいのです。 下記の通り記述すると、個人別データの シートがあっても「個人別データのシートがありません。」と メッセージボックスが表示されてしまい、うまく行きません。 ご教授下さい。  Dim Sh As Worksheet For Each Sh In Sheets If Not Sh.Name = "個人別データ" Then MsgBox "個人別データのシートがありません。" Exit Sub End If Next

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

  • ベストアンサー
  • bonaron
  • ベストアンサー率64% (482/745)
回答No.2

Dim Sh As Worksheet Dim flg As Boolean For Each Sh In Sheets  If Sh.Name = "個人別データ" Then   flg = True   Exit For  End If Next If Not flg Then  MsgBox "個人別データのシートがありません。"  Exit Sub End If これでいかがですか?

matchy4649
質問者

お礼

ありがとうございます! 望んでいた通りのものです。

その他の回答 (3)

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.4

無理矢理セットしてしまうとか。 Sub try() Dim ws As Worksheet On Error Resume Next Set ws = Worksheets("個人別データ") On Error GoTo 0 If ws Is Nothing Then MsgBox "個人別データのシートがありません。" Exit Sub End If Set ws = Nothing End Sub

matchy4649
質問者

お礼

なるほどOn Error Resume Nextを使う方法がありますね。 ありがとうございます。

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.3

今のマクロでは、シート名が「個人別データ」以外のシートが一枚でも有ると「個人別データのシートがありません。」と、警告がでます。 ループを回して、「個人別データ」と言うシートがあれば処理を終了、最後までループを回しても「個人別データ」と言うシートが無ければ警告を出すようにしてはいかがでしょう。 Dim Sh As Worksheet For Each Sh In Sheets  If Sh.Name = "個人別データ" Then   Exit Sub  End If  Next MsgBox "個人別データのシートがありません。"

matchy4649
質問者

お礼

なるほど、ループをさらにかませれば出来そうですね。 ありがとうございました。

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.1

>If Not Sh.Name = "個人別データ" Then Not だから、「"個人別データ" 以外の場合」という事になります。 フラグ(旗)等を使います。 Dim Sh As Worksheet Dim flg As Boolean flg = False For Each Sh In Sheets If Sh.Name = "個人別データ" Then flg = True Exit Sub End If Next If flg = False Then MsgBox "個人別データのシートがありません。"

matchy4649
質問者

お礼

なるほど、もう一つ変数を入れるとうまく行くのですね。 ありがとうございました!

関連するQ&A

  • Excelで,特定のシートを開いたときにメッセージボックスを表示するに

    Excelで,特定のシートを開いたときにメッセージボックスを表示するには? Excelを使用しているときに,例えばSheet3を開いたとき,メッセージボックスが開くようにしたいです。 個人的に考えているのは,そのシートの「コードの表示」で現れるVisual Basicの部分に Private Sub Worksheet_Open() YesNo = MsgBox("メッセージ。よろしいですか?", vbYesNo) If YesNo = vbYes Then End If このようなマクロを入れるといいのかと思いましたが動きません。 どこが間違っているのでしょうか?

  • 開いているシートをチェックする

    いつもこちらでお世話になってます。 VBAで、ひとつのブックの開いているシートをチェックする方法を教えてください。 "sheet1" "sheet2"  "sheet3" と同じブックにあるとし、 "sheet1"を開いてマクロを実行したら、 「シート1です」とメッセージボックスを出し、"F4"を選択。 "sheet2"を開いてマクロを実行したら、 「シート2です」とメッセージボックスを出し、"G4"を選択。 "sheet3"を開いてマクロを実行したら、 何もしない。 というようなコードをどうすればいいいのでしょうか? 自分なりに試してみたのは、以下のようなものです。 ' Macro () If Sheets("sheet1").Activate Then MsgBox "シート1です"   Sheets("sheet1").range("f4").select End If If Sheets("sheet2").Activate Then MsgBox "シート2です" Sheets("sheet2").range("g4").select End If End Sub これだと、どのシートを開いていても、 "sheet1"が開いて、"シート1です" のメッセージが出て、OKを押すと、"F4"を選択し、そのまま "sheet2"が開いて、"シート2です" のメッセージが出て、OKを押すと、"G4"を選択してし、 "sheet2"が開いた状態になってしまいます。 今現在は、2つのマクロが別々にあります。 マクロのオプションでCtrl+半角キーを同じにしたい、と考えています。 マクロのオプションで同じ半角キーをすることはできるようなのですが、 そうすると、Private Sub Worksheet_Activateで "sheet1"が開いたときは"E4"を選択するようにしているので、デバックが出てしまいます。 どのようにすればいいのでしょうか?

  • エクセルマクロでブック名を検索できない

    エクセルマクロで今開いているブック以外のブック名を取得して編集するマクロを作っていますが、一度他のブックを開かずにエラーメッセージ"価格を検索したいブックを開いて下さい。"を表示させると以降開いたブック名を取得出来ません。 For Each wb In Application.Workbooks s = wb.Name If s <> ActiveWorkbook.Name Then Exit For Else MsgBox "価格を検索したいブックを開いて下さい。" Exit Sub End If Next オブジェクトの解放など調べてみたのですが、初心者でよく解らず困っています。どなたか教えて下さい。

  • エクセル 複数シートを一つのシートにまとめるマクロについて

    エクセル 複数シートを一つのシートにまとめるマクロについて こんにちは いつもお世話になっています あるサイトから上記の目的のマクロを参考にして試したんですが、所有してるデスクトップPCでは成功するのに、ノートPCでは次のエラーが出ます。 「コンパイルエラー 変数が定義されていません」そして、以下に載せたコードの「k = 1」の部分が青い背景色になります。とりあえず、デスクトップでできるので間に合うのですが、ノートPCでのトラブル理由を今後のために勉強したいのです。理由を教えてください。 エクセル2003 SP3 ノートPCは工人舎のモバイルSA1F0 参考にさせていただいたサイトは「エクセル 複数シートを一つに集約」 http://okwave.jp/qa/q1608016.html?order=DESC&by=datetime コード引用 集約用にSheet3を確保します・ Sheet3以外の全シートを集約します。 Sub test07() Dim sh3 As Worksheet Dim sh As Worksheet Set sh3 = Worksheets("Sheet3") k = 1 For Each sh In ActiveWorkbook.Worksheets If sh.Name <> "Sheet3" Then MsgBox sh.Name sh.UsedRange.Copy sh3.Cells(k, "A").Select sh3.Paste k = k + sh.UsedRange.Rows.Count End If Next End 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

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

    見積書を作成しているんですが、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 マクロ自体をあまり理解できてなくて、会社の人や、ここで教えていただいて進めているので、出来ればそのままコピーして使用できるようにしていただけるとありがたいです。 よろしくお願いします。

  • マクロ作動

    Private Sub Worksheet_SelectionChange(ByVal Target As Range) tm = Time() '現在時間を取得 If tm < TimeValue("08:30:00") Then Exit Sub If tm > TimeValue("09:30:00") Then Exit Sub  Dim ANS As Integer  Dim 値 As String If Sheets("営業確認").Range("D6").Value <> "" Then ANS = MsgBox(Sheets("営業確認").Range("B6") & "のデーターが残っています。クリアしますか?", _ vbYesNo) Select Case ANS Case vbYes Sheets("営業確認").Select Sheets("営業確認").Range("B6:E461").Select Selection.ClearContents Sheets("営業確認").Range("G6:K461").Select Selection.ClearContents Sheets("入力").Select MsgBox "クリアしました" Case vbNo MsgBox "キャンセル" End Select Else End If End Sub プログラムを組みましたが、上記のとおり時間設定している間は『キャンセル』をしてもセルを動かす度にマクロが動いてしまいます。 下記のようなマクロは可能でしょうか。 (1)一番最初にシートが開くとマクロが作動 (2)その後、指定してるシートに値があってもマクロは作動しない (3)また翌日シートを開くとマクロが作動 ※1日1回マクロが作動出来ればいいです

  • エクセルVBA、MsgBOXで入力した2つのシート番号で挟まれたシートをすべて消去したい。

    マクロ自動記録で複数シートのDeleteを試してみると、   Sheets(Array("Sh20", "Sh19", "Sh18")).Select   Sheets("Sh18").Activate   ActiveWindow.SelectedSheets.Delete となって、シート名を個別に指定する必要が出てくる。 シートの左から18枚目から20枚目とか、15枚目から40枚目とか MsgBOXで入力した2つの数字で指示したいのですが、良い方法はありませんか? ちなみに、MsgBoxでA=15,B=40を入力して、   mysh = A   For Sh=1 to B-A+1   Sheets(Array(mysh)).Select   ActiveWindow.SelectedSheets.Delete   next とやったら、シート1枚消すごとに、 「データがあります。消してよいですか?」のメッセージが出てきて、 作業が面倒です。 一括して消す方法がないでしょうか?

  • メッセージボックスを表示させるエクセルマクロ

    こんにちは。マクロ初心者です。 エクセル(Excel2003)でメッセージボックスを 表示させるマクロが思うようにいかず困っています。 B列に「○○会社」と入力されれば、 「取引先です。」 とメッセージボックスを表示させたいと思い、 次のとおりマクロを作成しました。 -------------------------------- Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 2 And Target Like "*会社" Then MsgBox "取引先です。" End If End Sub -------------------------------- しかし、コピーなどで複数のセルを貼り付ける(入力)行為をすると、 「実行エラー'13': 型が一致しません」と出てしまいます。 Worksheet_Change(ByVal Target As Range)を使っているので、 -------------------------------- Private Sub Worksheet_Change(ByVal Target As Range) If Target.Count > 1 Then Exit Sub If Target.Column = 2 And Target Like "*会社" Then MsgBox "取引先です。" End If End Sub -------------------------------- と、「If Target.Count > 1 Then Exit Sub 」を入れれば、 メッセージは出なくなるのですが、 これだと、A列セルに、コピー&ペーストで複数セルを貼り付けた場合、 「○○会社」があっても、マクロが効いてきません。 複数セルの貼り付けにも対応させるには、 どのようにすればよろしいでしょうか? 基本的なところが理解できていないのだと自覚しておりますが、 どうかご教授願います。 長々とわかりづらい文章ですみません。よろしくお願いします。

  • 不特定のシートをマクロで削除を ~2

    いつもお世話になります WINDOWS7 EXCELL2010 です。 御指導を仰ぎたいのは、 参照図で言いますとシート名「シート名一覧」のA列に下記のマクロで抽出されたシート名の一覧があります。 このシートのB列に削除したいシートに○(例えばB16 B17)を入れるとマクロでそのシートが削除されるマクロが可能であれば是非ご教授いただけませんでしょうか。 抽出するマクロは下記です。 Sub アクティブセルからシート名一覧を作成する() Dim sh As Object Dim row_num As Long Dim col_num As Long If MsgBox("アクティブセルから下にシート名一覧を作成してもいいですか?", vbYesNo + vbDefaultButton2) = vbNo Then Exit Sub row_num = ActiveCell.Row col_num = ActiveCell.Column For Each sh In ActiveWorkbook.Sheets Cells(row_num, col_num).Value = sh.Name row_num = row_num + 1 Next sh End Sub 宜しくお願いいたします。

専門家に質問してみよう