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の説明は以下を確認ください。
- 並び替えのオプション等は、以下のサイト等から必要に応じて定数を変更してください。
- 汎用的なパーツ作成には、Optionalキーワードの知識も有用です。
以上、Excel VBAでParamArrayを利用し、並び替えの複数条件(キーとなる列、昇順・降順)を可変設定する汎用的なサンプルでした。