プログラム全体の概況を確認する

この講座は有料講座です。
講座の購入後ご覧になれます。

ログインアカウントの新規作成

解説

プログラム全体のレビューをする準備です。
この段階で、いくつか修正すべき箇所が見つかりました。
また、シート削除のマクロについても、効率的な書き方を紹介しています。

この教材についての過去の質問・感想

11714 : 小川慶一の回答 (2019-12-25 09:41:29)

ゲストさん:

ポイントとしては、以下を分離するという発想を持つことです。
・削除実施する/しないの判定
・削除の実施

今回で言えば、前者が flag の設定、後者が Delete メソッドの実施ですね。


> 間違えました。これだと、残すリストにあるのをきれいに消しちゃってますね。だから、フラグ使ってたんですね。
>
> 失礼しました。
>
> ゲストさん:
>
> > ご指導ありがとうございます。
> > 参考リンクを拝見したところ、わざわざフラグを使う必要がないこと、フラグって、ループの処理を外に出したり、共通処理をまとめたりしてるだけなことに気づきました。私のコードは、ループから出している処理が単発の3行だけなので、今となっては「この人はなぜフラグを使おうと思ったのか?」という感じです。
> >
> > 改めました。質問欄を汚してすみません。またcode付け忘れました。
> >

> > Sub DeleteUnlistedSheets()
> >     Dim Sh As Worksheet
> >     Dim Gyo As Long
> >     '全てのシートについて
> >     For Each Sh In ThisWorkbook.Sheets
> >         'NokosuList内の全ての値について
> >         For Gyo = 1 To ThisWorkbook.Sheets("NokosuList").Range("A" & Rows.Count).End(xlUp).Row
> >             'もしシート名がリストと一致したら、シートを削除する
> >             '大文字小文字の差を吸収するため、両辺にUcaseを通す
> >             If UCase(ThisWorkbook.Sheets("NokosuList").Range("A" & Gyo).Value) = UCase(Sh.Name) Then
> >                 Application.DisplayAlerts = False
> >                     Sh.Delete
> >                 Application.DisplayAlerts = True
> >                 Exit For
> >             End If
> >         '保存シート名ループ終了
> >         Next
> >     '全てのシートループ終了
> >     Next
> > End Sub
> > 

> >
> > 小川慶一さん:
> >
> > > フラグを使った処理の基本的な流れは抑えられていると思います。
> > > 悪くないです。
> > >
> > > [1] 変数宣言は、構造文の外へ。
> > > [2] フラグ設定の部分は、いろいろなやり方があります。以下は良い参考になるかと。今後のために示します。
> > > https://www.exvba.com/comment_detail.php?comment_id=11669
> > >


11710 : ゲストさんのコメント (2019-12-23 11:45:27)

間違えました。これだと、残すリストにあるのをきれいに消しちゃってますね。だから、フラグ使ってたんですね。

失礼しました。

ゲストさん:

> ご指導ありがとうございます。
> 参考リンクを拝見したところ、わざわざフラグを使う必要がないこと、フラグって、ループの処理を外に出したり、共通処理をまとめたりしてるだけなことに気づきました。私のコードは、ループから出している処理が単発の3行だけなので、今となっては「この人はなぜフラグを使おうと思ったのか?」という感じです。
>
> 改めました。質問欄を汚してすみません。またcode付け忘れました。
>

> Sub DeleteUnlistedSheets()
>     Dim Sh As Worksheet
>     Dim Gyo As Long
>     '全てのシートについて
>     For Each Sh In ThisWorkbook.Sheets
>         'NokosuList内の全ての値について
>         For Gyo = 1 To ThisWorkbook.Sheets("NokosuList").Range("A" & Rows.Count).End(xlUp).Row
>             'もしシート名がリストと一致したら、シートを削除する
>             '大文字小文字の差を吸収するため、両辺にUcaseを通す
>             If UCase(ThisWorkbook.Sheets("NokosuList").Range("A" & Gyo).Value) = UCase(Sh.Name) Then
>                 Application.DisplayAlerts = False
>                     Sh.Delete
>                 Application.DisplayAlerts = True
>                 Exit For
>             End If
>         '保存シート名ループ終了
>         Next
>     '全てのシートループ終了
>     Next
> End Sub
> 

>
> 小川慶一さん:
>
> > フラグを使った処理の基本的な流れは抑えられていると思います。
> > 悪くないです。
> >
> > [1] 変数宣言は、構造文の外へ。
> > [2] フラグ設定の部分は、いろいろなやり方があります。以下は良い参考になるかと。今後のために示します。
> > https://www.exvba.com/comment_detail.php?comment_id=11669
> >


11709 : ゲストさんのコメント (2019-12-23 08:25:47)

ご指導ありがとうございます。
参考リンクを拝見したところ、わざわざフラグを使う必要がないこと、フラグって、ループの処理を外に出したり、共通処理をまとめたりしてるだけなことに気づきました。私のコードは、ループから出している処理が単発の3行だけなので、今となっては「この人はなぜフラグを使おうと思ったのか?」という感じです。

改めました。質問欄を汚してすみません。またcode付け忘れました。

Sub DeleteUnlistedSheets()
    Dim Sh As Worksheet
    Dim Gyo As Long
    '全てのシートについて
    For Each Sh In ThisWorkbook.Sheets
        'NokosuList内の全ての値について
        For Gyo = 1 To ThisWorkbook.Sheets("NokosuList").Range("A" & Rows.Count).End(xlUp).Row
            'もしシート名がリストと一致したら、シートを削除する
            '大文字小文字の差を吸収するため、両辺にUcaseを通す
            If UCase(ThisWorkbook.Sheets("NokosuList").Range("A" & Gyo).Value) = UCase(Sh.Name) Then
                Application.DisplayAlerts = False
                    Sh.Delete
                Application.DisplayAlerts = True
                Exit For
            End If
        '保存シート名ループ終了
        Next
    '全てのシートループ終了
    Next
End Sub


小川慶一さん:

> フラグを使った処理の基本的な流れは抑えられていると思います。
> 悪くないです。
>
> [1] 変数宣言は、構造文の外へ。
> [2] フラグ設定の部分は、いろいろなやり方があります。以下は良い参考になるかと。今後のために示します。
> https://www.exvba.com/comment_detail.php?comment_id=11669
>


11707 : 小川慶一の回答 (2019-12-23 05:17:43)

フラグを使った処理の基本的な流れは抑えられていると思います。
悪くないです。

[1] 変数宣言は、構造文の外へ。
[2] フラグ設定の部分は、いろいろなやり方があります。以下は良い参考になるかと。今後のために示します。
https://www.exvba.com/comment_detail.php?comment_id=11669


11706 : ゲストさんのコメント (2019-12-23 02:56:46)

何度もすみません。前段、前々段の投稿はミスがあったため、削除お願いします。

先生こんにちは。シートに削除対象外のシート名を記載するバージョンを(CountIfを使った方がすっきり書けますが、)フラグを使って書いてみました。
 違和感がありましたら、コメントお願いします。

Sub DeleteSheetsByFlag()
    '全てのシートについて
    Dim Sh As Worksheet
    For Each Sh In ThisWorkbook.Sheets
        '削除対象フラグを設定。初期値はオン。
        Dim sakujoFlagOn As Boolean
        sakujoFlagOn = True
        'NokosuList内の全ての値について
        Dim gyo As Long
        For gyo = 1 To ThisWorkbook.Sheets("NokosuList").Range("A" & Rows.Count).End(xlUp).Row
            'もしシート名がリストと一致したら
            '大文字小文字の差を吸収するため、両辺にUcaseを通す
            If UCase(ThisWorkbook.Sheets("NokosuList").Range("A" & gyo).Value) = UCase(Sh.Name) Then
            '削除対象フラグをオフに切り替える。
                sakujoFlagOn = False
                Exit For
            End If
        '保存シート名ループ終了
        Next
        
        '削除対象フラグがTrueのままだったらシート削除
        If sakujoFlagOn Then
            Application.DisplayAlerts = False
                Sh.Delete
            Application.DisplayAlerts = True
        End If
    '全てのシートループ終了
    Next
End Sub


11145 : 小川慶一の回答 (2019-02-13 21:11:09)

受講生 さん:

スケーラビリティ次第です。

除外リストに書かれるシートの枚数が増える場合は表にしたほうがメンテナンスが簡単ですね。
あと、プログラマーでない一般利用者でもメンテナンス可能な仕組みにするかどうか?とか。


> >>・残すシートリストを用意しておき、それに該当していない場合のみ削除
> この方法は、私の書き方が悪いのかもしれませんが、結構コードが長くなってしまいました。その点、Select Caseは手軽に使えて便利だと思いました。


11120 : 受講生さんのコメント (2019-02-11 02:01:39)

>>・残すシートリストを用意しておき、それに該当していない場合のみ削除
この方法は、私の書き方が悪いのかもしれませんが、結構コードが長くなってしまいました。その点、Select Caseは手軽に使えて便利だと思いました。


3日がかりのその仕事、3分で終わらせる方法教えます。ガラパゴスタディーオンライン講座 ユーザー登録

本講座の動画一覧

  1. 【動画1】 実践添削事例-パソコンスクールのシフト表・予約フォーム生成マクロ - イントロダクション
    【動画1】 実践添削事例-パソコンスクールのシフト表・予約フォーム生成マクロ - イントロダクション 未習得
  2. 【動画2】 プログラム全体の概況を確認する
    【動画2】 プログラム全体の概況を確認する 未習得
  3. 【動画3】 人が書いたプログラムのインデントの調整と、変数宣言のタイミングについて。
    【動画3】 人が書いたプログラムのインデントの調整と、変数宣言のタイミングについて。 未習得
  4. 【動画4】 インプットボックスの戻り値を検査する
    【動画4】 インプットボックスの戻り値を検査する 未習得
  5. 【動画5】 予約受付表の作り方解説、効率よいステップ実行の方法等
    【動画5】 予約受付表の作り方解説、効率よいステップ実行の方法等 未習得
  6. 【動画6】 モジュールレベル変数宣言のデメリット、イミディエイトウィンドウでのマクロ実行、画像ファイルを変数で参照する
    【動画6】 モジュールレベル変数宣言のデメリット、イミディエイトウィンドウでのマクロ実行、画像ファイルを変数で参照する 未習得
  7. 【動画7】 ここまでのふりかえり、「デバッグ→コンパイル」、画面のチラつき防止
    【動画7】 ここまでのふりかえり、「デバッグ→コンパイル」、画面のチラつき防止 未習得
  8. 【動画8】 DPRに基づいたリライト。R→D、D→R
    【動画8】 DPRに基づいたリライト。R→D、D→R 未習得
  9. 【動画9】 週替りカレンダーを作る
    【動画9】 週替りカレンダーを作る 未習得
  10. 【動画10】 週替りカレンダーに担当者情報を記入する
    【動画10】 週替りカレンダーに担当者情報を記入する 未習得
  11. 【動画11】 週替りカレンダーに受付可能時間を記入する-ベタな方法
    【動画11】 週替りカレンダーに受付可能時間を記入する-ベタな方法 未習得
  12. 【動画12】 週替りカレンダーに受付可能時間を記入する-ベーシック
    【動画12】 週替りカレンダーに受付可能時間を記入する-ベーシック 未習得
  13. 【動画13】 週替りカレンダーに受付可能時間を記入する-アドバンス
    【動画13】 週替りカレンダーに受付可能時間を記入する-アドバンス 未習得
  14. 【動画14】 カレンダーに受付可能時間担当者詳細を記入する
    【動画14】 カレンダーに受付可能時間担当者詳細を記入する 未習得
  15. 【動画15】 週替りカレンダーに受付可能時間を記入する-祝日に色をつける
    【動画15】 週替りカレンダーに受付可能時間を記入する-祝日に色をつける 未習得
  16. 【動画16】 イラストを挿入する
    【動画16】 イラストを挿入する 未習得
  17. 【動画17】 罫線の色を変更する
    【動画17】 罫線の色を変更する 未習得
  18. 【動画18】 Functionプロシージャを使ったブラッシュアップ(その1)
    【動画18】 Functionプロシージャを使ったブラッシュアップ(その1) 未習得
  19. 【動画19】 Functionプロシージャを使ったブラッシュアップ(その2)
    【動画19】 Functionプロシージャを使ったブラッシュアップ(その2) 未習得
  20. 【動画20】 予約受付表を作成する
    【動画20】 予約受付表を作成する 未習得
  21. 【動画21】 生成した予約受付表に値を投入する
    【動画21】 生成した予約受付表に値を投入する 未習得
  22. 【動画22】 画面更新によるチラつきを避ける2つの方法
    【動画22】 画面更新によるチラつきを避ける2つの方法 未習得
  23. 【動画23】 本講座のまとめ
    【動画23】 本講座のまとめ 未習得

塾長 小川慶一

メニュー

コメント紹介

もっと見る

ページの先頭へ