shikumika’s diary

日々の事務作業で手間なことを簡単にできる仕組み(自動化、方法など)、困ったことの解決方法を調べた備忘録

【Excel VBA】並び替えで複数条件を可変設定するサンプル(ParamArrayの事例)

Excel VBAで、並び替えの複数条件(キーとなる列、昇順・降順)を可変設定する汎用的なコードサンプルです。データ範囲も固定ではなく、最終行と最終列の情報から範囲が可変します。

コードの再利用性や可読性を向上させるため、処理(プロシージャ)をパーツ化し、ParamArrayを利用して引数の数を可変にした具体例です。

ParamArrayを利用すると、引数の数が固定されず、同様の処理を一つのパーツで表現でき、活用の幅が拡がります。

前回記載した【Excel VBA】処理のパーツ化で引数を省略可能にする方法と併せて、汎用性の高いパーツの作成に便利です。

事例の前提

サンプルの前提は次の状態です。

  • アクティブなブックに、「sheet1」の名前のシートがあり、並び替えしたいデータがある
  • 範囲や条件、対象シートが変更した場合にもコードを再利用し、並び替えができるように、「 Function 指定範囲の並び替え」を引数付きで呼び出す。
  •  引数は必須で「対象シート」、任意で並び替えの設定情報として
    [優先1の列番号,優先1の昇順・降順],[優先2の列番号,優先2の昇順・降順],……)
    の規則で、1次元の配列で指定する。
    なお、昇順・降順は、"昇順"もしくは"降順"の文字列とする。

VBAサンプル

次のとおりです。

Sub 並び替えサンプル()

    '引数は、指定範囲の並び替え(対象シート,[優先1の列番号,優先1の昇順・降順],[優先2の列番号,優先2の昇順・降順],……)とする。'
    Call 指定範囲の並び替え(Sheets("sheet1"), 2, "昇順", 1, "降順")
    
End Sub

Function 指定範囲の並び替え(対象シート As Worksheet, ParamArray 並び替えの設定情報() As Variant)
    'ParamArray 並び替えの設定情報()は、[優先1の列番号,優先1の昇順・降順],[優先2の列番号,優先2の昇順・降順],……)とする。'
    '昇順・降順は、"昇順"もしくは"降順"の文字列とする。'

    Dim 最終行 As Long
    Dim 最終列 As Long
    Dim i As Long
    Dim 昇順降順 As Long
    
    With 対象シート
        '既にあるフィルターのクリア'
        .Cells.Select
        .Sort.SortFields.Clear
        
        '最終行と最終列の取得'
        最終行 = .Cells(Rows.Count, 並び替えの設定情報(0)).End(xlUp).Row '並び替えの最初の列で、最終行を確認'
        最終列 = 対象シート.Cells(1, Columns.Count).End(xlToLeft).Column
    End With
    
    With 対象シート.Sort
    
        '並び替えのキーを設定'
        '並び替えの設定情報が列番号、昇順降順の順で続くので、Stepは2にしている。'
        For i = 0 To UBound(並び替えの設定情報) - 1 Step 2
        
            '昇順と降順の指定を確認'
            Select Case 並び替えの設定情報(i + 1)
                Case "昇順"
                    昇順降順 = xlAscending
                Case "降順"
                    昇順降順 = xlDescending
                Case Else
                    MsgBox "昇順降順の指定が誤っているため終了します"
                    End
            End Select
            
            '並び替えのキー設定'
            .SortFields.Add _
                Key:=Range(対象シート.Cells(2, 並び替えの設定情報(i)), 対象シート.Cells(最終行, 並び替えの設定情報(i))), _
                SortOn:=xlSortOnValues, _
                Order:=昇順降順, _
                DataOption:=xlSortNormal
        Next i
        
        '並び替えの範囲等を指定して、並び替え'
        .SetRange Range(対象シート.Cells(1, 1), 対象シート.Cells(最終行, 最終列))
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply

    End With
    
End Function

事例の補足説明

  • 最終行、最終列の設定は、最終行列に空白セルがあると誤った範囲を取得するため、適宜修正してください。
  • ParamArrayの説明は以下を確認ください。

    learn.microsoft.com

  • 並び替えのオプション等は、以下のサイト等から必要に応じて定数を変更してください。

    learn.microsoft.com

  • 汎用的なパーツ作成には、Optionalキーワードの知識も有用です。

    shikumika.org

 

以上、Excel VBAでParamArrayを利用し、並び替えの複数条件(キーとなる列、昇順・降順)を可変設定する汎用的なサンプルでした。