[[20230320115218]] 『マクロで不要なワークシートの削除したい』(とろろ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『マクロで不要なワークシートの削除したい』(とろろ)

ブック内に20枚ほどシートがあります。
L7セル(L7〜Q8をセルの結合)に入力されている特定の文字(至急・急)以外の
シートを削除するマクロを教えていただけませんか?

同一作業を1日に何度も行うためマクロを組みたいのですが、初心者のため
まだマクロを組むことができません。
どうか皆様のお力をお貸しください。

< 使用 Excel:Excel2010、使用 OS:Windows10 >


>シートを削除するマクロを教えていただけませんか?
例えば↓のような感じでしょうか?
    Sub たたき台()
        Dim ws As Worksheet
        On Error GoTo エラートラップ
        For Each ws In ThisWorkbook.Worksheets
            If ws.Range("L7").Value <> "至急・急" Then
                Application.DisplayAlerts = False
                ws.[シートを削除する命令]
                Application.DisplayAlerts = True
            End If
        Next ws
        Exit Sub

        エラートラップ:
        MsgBox ws.Name & "の削除に失敗しました" & vbLf & "最後の1シートでないか確認してください"           
    End Sub

 ※[シートを削除する命令]は【マクロの記録】で調べることができます。

(もこな2) 2023/03/20(月) 12:27:20


もこな2さまありがとうございました。

シートの削除の部分はマクロの記録で確認出来るとのことでしたので
SelectedSheets.Delete
を当てはめてみました。

Sub たたき台()

        Dim ws As Worksheet
        On Error GoTo エラートラップ
        For Each ws In ThisWorkbook.Worksheets
            If ws.Range("L7").Value <> "至急・急" Then
                Application.DisplayAlerts = False
                ws.SelectedSheets.Delete
                Application.DisplayAlerts = True
            End If
        Next ws
        Exit Sub
エラートラップ:
        MsgBox ws.Name & "の削除に失敗しました" & vbLf & "最後の1シートでないか確認してください"
    End Sub

そしたらコンパイルエラーが表示されてしまいました。
マクロ初心者のためまだいろいろと理解できていないため教えていただけないでしょうか?

(とろろ) 2023/03/20(月) 13:28:21


どこから、SelectedSheets なんて語が出てきたんですかね?
要らないと思います。
(こみこみ) 2023/03/20(月) 13:45:37

もこな2さまのマクロを標準モジュールに貼り付けて実行してみたのですが
起動しませんてした。

そこで
※[シートを削除する命令]は【マクロの記録】で調べることができます。
と記載があったので、マクロの記録でデモのシート削除を記録したのですが
SelectedSheets.Deleteは不要だったということでしょうか?
(とろろ) 2023/03/20(月) 14:10:55


すみません
マクロのことがまだ分かっておらず、皆さまにとっては初歩的な質問をして
すみません。
(とろろ) 2023/03/20(月) 14:18:52

ああ、マクロ記録だとそうなるのか・・・。

単純に英語を理解すれば良いです。
削除は、Delete
で、直接シートを削除で、良いです。
今回の場合シートはwsになります。
(こみこみ) 2023/03/20(月) 14:21:35


かぶりしましたがそのまま。

>SelectedSheets.Deleteは不要だったということでしょうか?
ちょっとわかりづらかったかもしれませんね。

たぶん、マクロの記録をしたら↓のようなコードが記録されたのでしょう。

    Sub Macro1()
    '
    ' Macro1 Macro
    '

    '
        Sheets("Sheet2").Select
        ActiveWindow.SelectedSheets.Delete
    End Sub

この中でシートの【削除】をする命令は【Delete】です。

よって、↓のようにすればよいです。

    Sub たたき台()
        Dim ws As Worksheet
        On Error GoTo エラートラップ
        For Each ws In ThisWorkbook.Worksheets
            If ws.Range("L7").Value <> "至急・急" Then
                Application.DisplayAlerts = False
                ws.Delete
                Application.DisplayAlerts = True
            End If
        Next ws
    Exit Sub
        エラートラップ:
        MsgBox ws.Name & "の削除に失敗しました" & vbLf & "最後の1シートでないか確認してください"
    End Sub

(もこな2) 2023/03/20(月) 14:27:53


コメントかちあってしまいました。

こみこみさまご教授いただきありがとうございました。

コードをws.Deleteにしてマクロを実行してみましたが、至急と急以外
のシートは削除されませんでした。

最初の私の質問の仕方が悪くてすみませんでした。

L7セルに入力されているものは"至急・急"ではなく"至急"と"急"でした。
申し訳ありません。(*´Д`)
その場合は
If ws.Range("L7").Value <> "至急・急" Then のコードはどのように変更
したらよいのでしょうか?

(とろろ) 2023/03/20(月) 14:38:52


もこな2さま

コメント衝突してしまいました。すみません。

マクロコードの書き換えご丁寧にコメントいただきありがとうございました。
皆様に甘えてばかりですみません。
上記の質問よろしければ、ご教授いただけないでしょうか?
(とろろ) 2023/03/20(月) 14:42:22


If ws.Range("L7").Value <> "*急" Thenでマクロを実行してみましたが
"至急"と"急"以外の削除したいシートが削除されませんでした。
※ワイルドカードで対応できるかな?と安易な発想ですみません。( ;∀;)

コンパイルエラーが表示されて
「sheet1のシートの削除に失敗しました。最後の1シートでないか確認してください」と
表示されてしまいました。

(とろろ) 2023/03/20(月) 14:51:36


>L7セルに入力されているものは"至急・急"ではなく"至急"と"急"でした。
    Sub 研究用()
        Dim ws As Worksheet
        Stop  'ブレークポイントの代わり

        On Error GoTo エラートラップ
        For Each ws In ThisWorkbook.Worksheets
            Select Case ws.Range("L7").Value
                Case "至急", "急"
                    Stop 'ブレークポイントの代わり
                    'なにもしない
                Case Else
                    Stop 'ブレークポイントの代わり
                    Application.DisplayAlerts = False
                    ws.Delete
                    Application.DisplayAlerts = True
            End Select
        Next ws
    Exit Sub

        エラートラップ:
        MsgBox ws.Name & "の削除に失敗しました" & vbLf & "最後の1シートでないか確認してください"
    End Sub

私は作業依頼には興味がわかないので、これでいったん区切りにします。

 ほかに疑問があれば、いろいろトライ&ネット検索したうえで、どう考えたら(どうしたら)どこで詰まったのか
 具体的なコードを提示して質問してください。

なお、研究するうえで【ステップ実行】という方法をつかうと、動きや変数の中身を確認しながらコードを実行することができますのでお勧めします。

 ※ステップ実行という言葉を聞いたことがなければ↓を読んでみてください。

 【ステップ実行】
https://www.239-programing.com/excel-vba/basic/basic023.html
http://plus1excel.web.fc2.com/learning/l301/t405.html

 【ブレークポイント】
https://www.239-programing.com/excel-vba/basic/basic022.html
https://www.tipsfound.com/vba/01010

 【イミディエイトウィンドウ】
https://www.239-programing.com/excel-vba/basic/basic024.html
https://excel-ubara.com/excelvba1/EXCELVBA486.html

 【ローカルウィンドウ】
https://excel-ubara.com/excelvba4/EXCEL266.html
http://excelvba.pc-users.net/fol8/8_2.html

(もこな2) 2023/03/20(月) 15:19:29


ワイルドカードを使うなら

If ws.Range("L7").value Like "*急" Then

ですね。
(ngk) 2023/03/20(月) 15:22:26


もこな2さま

いろいろと質問ばかりしてすみませんでした。
マクロ初心者のためわからないことばかりですみませんでした。

新しいマクロのコードを書き込んでいただいてありがとうございました。

(とろろ) 2023/03/20(月) 15:47:46


ngkさま
コメントありかとうございました。

If ws.Range("L7").value Like "*急" Then

で書き換えてみましたがやはりマクロの反応がありませんでした。

今回は一旦あきらめて別の方法を検討してみたいと思います。

(とろろ) 2023/03/20(月) 15:53:34


"至急"または"急"以外のシートをということなので、

If Not ws.Range("L7").value Like "*急" Then

または、

If Not ws.Range("L7").value Like "*[!急]" Then

ですね。

Like 演算子 | Microsoft
Learn https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/like-operator
(hatena) 2023/03/20(月) 15:59:32


これじゃだめなの

 if InStr(Range("L7").Value, "急") = 0 then
    削除
(こみこみ) 2023/03/20(月) 16:22:21

hatenaさま
こみこみさま

コメントありがとうございました。
いただいたコードをマクロに当てはめましたが、やはりマクロは起動しませんでした。

ありがとうございました。( ;∀;)
(とろろ) 2023/03/20(月) 16:44:35


>いただいたコードをマクロに当てはめましたが、やはりマクロは起動しませんでした。

現在のコードを書いてみてください。
もこな2さんのコードを組み替えてきちんと書き替えているならば
まともに動くはずですが。

おそらくは書き替える場所や、そもそものセルの位置などが違うのではないかと。

(ngk) 2023/03/20(月) 17:12:51


>やはりマクロは起動しませんでした。

???
意味が解らない。
勝手に起動するわけが無い。
(こみこみ) 2023/03/20(月) 17:20:33


一旦区切りにすると言っておきながらですが、難航しているようなので追加で何点か。

■1
既にアドバイスがありますが、ワイルドカードを使って部分一致させるならば↓のようにLike演算子を使うとよいです。

 × If ws.Range("L7").Value <> "*急" Then
 ○ If Not ws.Range("L7").Value Like "*急" Then

ただし、【Like "*急"】ですと、"〜〜〜急"のように急で終わる文字列という意味になりますから、今回のケースであれば上記のようにNOTを付けて、急で【終わらない】文字列という指定をすべきでしょう。

■2
>マクロの反応がありませんでした。
反応がない(起動しない)わけではないとおもいますので、【ステップ実行】して確認してみましょう。

■3
>いただいたコードをマクロに当てはめましたが、やはりマクロは起動しませんでした。
闇雲に試すのではなくどのようなことをやっているのかちゃんと調べてみましょう。

なお、標準モジュールに記述するのであれば↓は

  if InStr(Range("L7").Value, "急") = 0 then

  If InStr(ws.Range("L7").Value, "急") = 0 Then

↑のように【シートを指定】しないとマズいことが起きかねません。

(もこな2) 2023/03/20(月) 20:06:53


ngkさま
こみこみさま
もこな2さま

コメントありがとうございます。

    Sub たたき台()
        Dim ws As Worksheet
        On Error GoTo エラートラップ
        For Each ws In ThisWorkbook.Worksheets
            If Not ws.Range("L7").Value Like "*急" Then
                Application.DisplayAlerts = False
                ws.Delete
                Application.DisplayAlerts = True
            End If
        Next ws
    Exit Sub
エラートラップ:
        MsgBox ws.Name & "の削除に失敗しました" & vbLf & "最後の1シートでないか確認してください"
    End Sub

もこな2さまのこのコードで自分のPCで希望するシート削除が出来ました。
コメントをいただいた皆様ご尽力頂きありがとうございました。

午前中は、会社のリモートPCで作業を行なっていた為、上手くいかなかったのですが
また水曜日に会社のEXCEL2010で検証したいと思います。
(とろろ) 2023/03/20(月) 20:52:33


何度も同じ質問をしてすみません。

本日会社のエクセルのバージョンを確認したらEXCEL2013でした。

    Sub たたき台()
        Dim ws As Worksheet
        On Error GoTo エラートラップ
        For Each ws In ThisWorkbook.Worksheets
            If Not ws.Range("L7").Value Like "*急" Then
                Application.DisplayAlerts = False
                ws.Delete
                Application.DisplayAlerts = True
            End If
        Next ws
    Exit Sub
エラートラップ:
        MsgBox ws.Name & "の削除に失敗しました" & vbLf & "最後の1シートでないか確認してください"
    End Sub

を標準モジュールに入力しマクロの実行を行いましたがやはり無反応でした。

ステップ実行F8を押しながらマクロの動作確認をしても何も反応しません。
先日自宅のPC(Excel365)でマクロを実行したら希望する結果が出たのですが
バージョン違いなどで動作しないということはあるのでしょうか?

ご教授ください。
(とろろ) 2023/03/22(水) 14:31:37


マクロが実行可能かどうか確認しましょう
https://support.microsoft.com/ja-jp/office/excel-%E3%81%AE%E3%83%9E%E3%82%AF%E3%83%AD%E3%81%AE%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E8%A8%AD%E5%AE%9A%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B-a97c09d2-c082-46b8-b19f-e8621e8fe373
(りんく) 2023/03/22(水) 14:37:06

すみません。
なんかマクロは動いていた様子でメッセージボックスは表示されますが
シートの削除の部分は反応していない様子でした。
(とろろ) 2023/03/22(水) 14:58:11


反応がない、とはF8を押しても上から実行されないのか、
それとも実行はされるがIf内のコードが実行されないのかどちらでしょうか。
※そもそもVBAのコードは反応したりしません。

あと
If Not ws.Range("L7").Value Like "*急" Then

If InStr(ws.Range("L7").Value,"急") = 0 then
にしたらどうなるでしょうか?
※削除したいシートのL7セルに”急”が含まれていないならば、というIf文です。
(ngk) 2023/03/22(水) 17:12:49


■4
既に皆さんからコメントがありますが、【なんかマクロは動いていた様子】【反応していない様子】とはどうやって確認しましたか?
繰り返しになりますが、ちゃんと【ステップ実行】して確認されたほうが良いと思います。

■5
↓ですと【超特急】とか【めっちゃ急】なんかも削除対象外になります。

 If Not ws.Range("L7").Value Like "*急" Then

また、↓ですと【急行電車】とか【緩急つけましょう】なんかも削除対象外になります。(既にコメントされてますが一応。)

 If InStr(ws.Range("L7").Value,"急") = 0 then

この辺りは理解できてますか?

(もこな2) 2023/03/22(水) 22:12:06


ngkさま
もこな2さま

コメントありがとうございます。

ステップ実行の確認ですが、Visual Basicを開き"たたき台"マクロを書き込んだ標準モジュール
を開いてF8キーを押しながらEXCELのワークシートの動作確認をしています。
L7セルに入力されている"至急"と"急"以外のワークシートが削除されるか確認していますが
シートは削除されずメッセージボックスが表示されると結果になっています。
↑このやり方ではだめですか?

会社のPCはEXCEL2013ではうまく動作しないのですが、自宅のPCはEXCEL365を使用しており
こちらで同じ作業をすると、もこな2さまのマクロはちゃんと動作する感じです。
(とろろ) 2023/03/23(木) 09:22:35


 横から失礼します。

 >シートは削除されずメッセージボックスが表示されると結果になっています。
 ということなので、下記の一文をコメントにして実行してください。
 実行エラー(デバック)となると思いますので、そのメッセージを確認してみてください。
 メッセージの内容が分からなければ、メッセージをこちらに書き込めばアドバイスもらえると思います。

 On Error GoTo エラートラップ ← これをコメント

(めいぷる) 2023/03/23(木) 09:54:28


EXCEL2013 使用していますけど問題ないですよ。
会社のPCで動作しないというのはセキュリティーが保護されていると思いますよ。
管理者に問い合わせたらどうですか。

(こんぶ) 2023/03/23(木) 10:12:33


>ステップ実行の確認ですが、Visual Basicを開き"たたき台"マクロを書き込んだ標準モジュール
を開いてF8キーを押しながらEXCELのワークシートの動作確認をしています。
L7セルに入力されている"至急"と"急"以外のワークシートが削除されるか確認していますが
シートは削除されずメッセージボックスが表示されると結果になっています。

そちらで確認された最終結果のみを報告されても、
コードの進みがどうなっているかが把握出来ません。

知りたいポイントは
If Not ws.Range("L7").Value Like "*急" Then
が実行されてIf内に分岐され
ws.Delete
まで実行されているか、なので
その辺りをきちんと書かないと解決には向かいませんよ。

(ngk) 2023/03/23(木) 11:02:03


追記

>先日自宅のPC(Excel365)でマクロを実行したら希望する結果が出たのですが

との事でしたので、L7の値が自宅と会社のブックで違うのでは、と予測しています。
一度L7セルの値を確認してみてはいかがでしょうか。
(ngk) 2023/03/23(木) 11:06:08


■6
>このやり方ではだめですか?
具体的な【ステップ実行】の方法は既に提示したサイト等をご覧いただくとして、重要なのは"何が起こったか"だけを確認するのではなく、【どの順番】で【どんな判定】がされて【どのタイミング】で【どの処理】をしたかを一元的に確認しないと状況が分析できません。

■7
>シートは削除されずメッセージボックスが表示されると結果になっています。
可能ならば、その状況で↓を実行して、イミディエイトに出力されたものをそのまま提示してみてください。
(シート名は、提示が憚れるものであれば適宜変えてもかまいません)

    Sub 解析用()
        Dim ws As Worksheet

        For Each ws In ThisWorkbook.Worksheets
            Debug.Print " インデックス番号:" & ws.Index
            Debug.Print " シート名    :" & ws.Name
            Debug.Print " L7セルの値     :" & "【" & ws.Range("L7") & "】"
            Debug.Print " Visible       :" & IIf(ws.Visible, "表示", "非表示")
            Debug.Print " ProtectContents :" & IIf(ws.ProtectContents, "保護あり", "保護なし")
            Debug.Print vbLf
        Next
    End Sub

(もこな2) 2023/03/23(木) 13:55:59


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.