複数条件をまとめるプロシージャーを作成する

vbanarabitoukatueyecatch

エクセルVBA 並び替えのための複数条件を束ねるプロシージャーを作成します。
スイッチング的機能でそれぞれの条件をまとめ、最終的に実行するためのVBAコードです。

こんにちは じゅんぱ店長 (@junpa33) です。

VBAを使って、エクセルのセルデータの並び替えを行うツールを作成しています。

これまで、並び替えに必要な環境や条件を個別に説明、処理コードを作成してきました。

そして、実際に並び替えを実行するには、それらの条件を整理して順番に実行して行くコントロールセンターのようなまとめるプロシージャーが必要になります。

今回は、そのプロシージャーを説明して行きます。

並び替えマクロ 記事階層

この記事の番号は10番です。

複数の条件をまとめる実行プロシージャー

まず、実行するための複数の条件を列記しておきます。

  1.  並び替えしたいデータエリア全体
  2.  データ範囲のタイプ
  3.  先頭行のタイプ
  4.  キーの選択
  5.  並びの順序(ユーザー設定リスト利用)
  6.  並び替えの実行(データ範囲タイプ別)
  7.  データ切り出し用情報取得 

①から⑦までのそれぞれの条件の処理については、すでにプロシージャーを作成準備しました。

条件を処理するこれらのプロシージャーを適宜動作させて、並び替えを実施完了させることになります。

そしてこの、一連の流れを束ねるのが今回作成するまとめるプロシージャーになります。

このプロシージャーを実行する方法は、ユーザーフォーム「ソートナビゲーター」の「並び替え実行」ボタンのクリックイベントで起動します。

まとめるプロシージャーのVBAコードの内容

まとめるプロシージャーのVBAコードについてそれぞれの条件処理を見ていきます。

実際の条件の各処理については、対応する各プロシージャーが行いますので、

ここに記述するVBA「並び替え作業」をまとめるプロシージャーは、その時の並び替えに必要な条件を「その条件に対応したプロシージャーへのスイッチング」が主な役割になります。

条件を束ねる方法として、

利用者が設定した条件で、その条件を適用するためにコード処理が殆ど必要ない条件については、

「並び替え実行」のイベントモジュールのプロシージャーによって、イベントモジュールでの変数処理後、ダイレクトに、それぞれの条件処理のプロシージャーへ送られています。

条件① 並び替えしたいデータエリア全体

VBA
Sub 並び替え作業()
    Dim ANS As Long
        DataSN = ws.Name
        If DataNSN <> DataSN Then
        MsgBox "シートが変更されましたので、並び替えデータシート" _
            & "全体のチェックが必要です。" & vbCrLf & _
            "「並び替えデータシート全体チェック」をまず実行して" _
            & "ください。", vbInformation, "実行するには・・"
        Exit Sub
        End If
        Set SSRange = Nothing
        If Not DataRange = "Type1" Then
            If ErEnd = True Then
                ANS = MsgBox("「条件設定の不備」を修正しましたか?" _
                            , vbYesNo + vbQuestion, "確認")
                If ANS = 7 Then
                    MsgBox "不備を修正してください。終了します。"
                    Exit Sub
                Else
                    ErEnd = False
                End If
            End If
        End If

この「並び替え作業」というまとめるプロシージャーが、実行された時のアクティブシートが、並び替えデータがあるシートになります。

このアクティブシートについてですが、

このプロシージャー実行前に行った、「データエリア全体把握」の対象のシートと同じものかどうかをチェックします。

もし違っていれば、「別シートまたぎ」ということになります。

同じであれば、以降のVBAコードを進行させますが、違って入れは、メッセージを出してプロシージャーを終了させます。

変数DataNSNは「データシート全体のボリュームを把握」で取り出した変数です。

条件② データ範囲のタイプ

VBA
        If DataRange = "Type1" Then
            Set SSRange = SortAreaA
        ElseIf DataRange = "Type2" Then
            Set SSRange = SortAreaB
        ElseIf DataRange = "Type3" Then
            Set SSRange = SortAreaC
        ElseIf DataRange = "Type4" Then
            Set SSRange = SortAreaD
        End If
        
        If ErEnd = True Then
            MsgBox "一旦終了します。"
            Exit Sub
        End If

並び替えのデータ範囲が4タイプあり、ユーザーフォームから入力された条件で、それに合ったデータ範囲の設定をします。

そしてこのVBAコードで、「範囲指定条件の変数SSRange」に代入します。

このデータ範囲の設定時点で、エラーが発生していた時はここでプロシージャーを実行中止にします。

変数「SortAreaA」「SortAreaB」「SortAreaC」「SortAreaD」は範囲の選択パターンで取り出した変数です。

プロシージャーの記述の最後に、データ範囲4のパターンの「部分範囲指定のテキストボックス表示」(ユーザーフォーム上)をデフォルト(白紙)に戻しておきます。

VBA
        ソートナビゲーター.部分範囲指定表示.Value = ""

条件③ 先頭行のタイプ

先頭行のタイプの条件は、「見出し」か「見出しではない」かです。

この条件は、イベントプロシージャー「並び替えGO」から直接並び替え実行のプロシージャーへ条件指示を行います。

条件④ キーの選択

この部分の条件は、それぞれのイベントプロシージャーで変数に値をセットして、並び替え実行のプロシージャーへ条件を送っています。

条件⑤ 並び替えの順序(ユーザー設定リスト)

VBA
        If CusOdr1 = "ON" Then
            MsgBox "並び替え列1のユーザー設定リストの設定"
            CusOdr1V = CusOdr
        End If
        If CusOdr2 = "ON" Then
            MsgBox "並び替え列2のユーザー設定リストの設定"
            CusOdr2V = CusOdr
        End If
        If CusOdr3 = "ON" Then
            MsgBox "並び替え列3のユーザー設定リストの設定"
            CusOdr3V = CusOdr
        End If

このコードで、ユーザーリストによる並び替えの条件をまとめます。

ユーザー設定リストを使う場合に、リストの選択と変数へ ” リストのデータ ” を代入します。

3つの列キーそれぞれに実行します。

変数CusOdrはユーザー設定リストを外部入力するVBAで作成した変数です。

プロシージャーの記述の最後に、ユーザー設定リストをデフォルト(白紙)に戻しておきます、

VBA
        CusOdr1V = ""
        CusOdr2V = ""
        CusOdr3V = ""

条件⑥ 並び替えの実行(データ範囲タイプ別)

VBA
        If SortType = "StypeA" Then
            Call Module1.Sort実行
        ElseIf SortType = "StypeB" Then
            Call Module1.Sort背景色
        ElseIf SortType = "StypeC" Then
            Call Module1.Sort列から背景色
        ElseIf SortType = "StypeD" Then
            Call Module1.Sort背景色から列
        Else
            Call Module1.Sort実行
        End If

このコードで、キーの優先度に応じた並び替えの実行をまとめます。

列キーだけで実行背景色だけで実行列キー優先+背景色で実行背景色優先+列キーで実行の4タイプに振り分けます。

条件⑦ データ切り出し用情報取得

VBA
        With SSRange
        If SSRange Is Nothing Then Exit Sub
            DCutr = .Row
            DCutc = .Column
            DCutEr = .Rows.Count + DCutr - 1
            DCutEc = .Columns.Count + DCutc - 1
        End With

データ切り出し機能で利用するための情報を取得しています。

データ範囲の始まりのセルと終わりのセルの番地を取得します。

まとめるプロシージャーのまとめ

プロジェクトを完成させるためには、通常、複数の設定条件をそれぞれに処理し、最後に出揃ったものを一つにまとめ上げ最終的に実行するためのまとめるプロシージャーが必要になります。

条件処理のメインはそれぞれ個別処理のプロシージャーになります。

統括プロシージャーは、それぞれの条件の最終スイッチング的なものになってくると思います。

プロジェクトのためのコード設計的には、色々な手法がありますので、一概には言えませんが、スッキリした手法だと思います。

エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。

vbastudyeyecatch2 エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です

今回の記事はここまでです。   最後までご覧いただき有難うございました。

<記事内容についての告知>VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。