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を利用し、並び替えの複数条件(キーとなる列、昇順・降順)を可変設定する汎用的なサンプルでした。