はじめに

今回は、会社の経理部や営業部で頻繁に使用されるデータの並び替えについて、VBAマクロで解決をしていきます。例えば、月末や年度切り替えなど、社員リストや給与データなどをDLし、グループごとに昇順にしたい。社員ID順に並び替えたいなど、データを特定の順序で並べ替える作業は頻繁に起こりえます。エクセルのフィルタなどで、並べ替えることもできますが、データ量が多い場合や、定例化されている業務など、VBAマクロ「Sort」を活用し、Excelのデータを自動で並べ替える方法を紹介します。
Sortメソッドとは?
Sortメソッドは、Excelのセル範囲内のデータを特定の列を基準に並べ替えるためのVBAのメソッドです。昇順(小さい順)や降順(大きい順)での並べ替えが可能で、複数の列を基準にして並べ替えることもできます。エクセルの手作業でよく使われる、項目のフィルタや並び替え機能と同じ扱いです。
所属ごとに昇順で並び変える

Sub 所属順ごとに並び替え()
Dim ws As Worksheet
Dim lastRow As Long
' 対象シートを設定
Set ws = ThisWorkbook.Sheets(1) ' 1枚目のシートの場合。
' 所属項目の最終行取得
lastRow = ws.Cells(ws.Rows.Count, "C").End(xlUp).Row
' 並べ替え
ws.Sort.SortFields.Clear
ws.Sort.SortFields.Add Key:=ws.Range("C2:C" & lastRow), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ws.Sort
.SetRange ws.Range("A1:C" & lastRow) ' 並べ替え範囲(表全体)
.Header = xlYes ' 見出し行あり
.MatchCase = False
.Orientation = xlTopToBottom
.Apply
End With
MsgBox "所属を昇順で並べ替えました!"
End Sub
コードの解説:
' 対象シートを設定
Set ws = ThisWorkbook.Sheets(1) ' 1枚目のシートの場合。
シート1のデータに対してSortをかけていきます。
' 所属項目の最終行取得
lastRow = ws.Cells(ws.Rows.Count, "C").End(xlUp).Row
所属項目に対してSortをしますので、C列の指定します。また、C列の最終行を取得します。
' 並べ替え
ws.Sort.SortFields.Clear
ws.Sort.SortFields.Add Key:=ws.Range("C2:C" & lastRow), _
SortOn:=xlSortOnValues, Order:=xlAscending,
並び替えは昇順とし、C2からCの最終行までを対象としています。
DataOption:=xlSortNormal
With ws.Sort
.SetRange ws.Range("A1:C" & lastRow) ' 並べ替え範囲(表全体)
.Header = xlYes ' 見出し行あり
.MatchCase = False
.Orientation = xlTopToBottom
.Apply
End With
並び替えは1行まるまる行います。項目行もありです。
MsgBox "所属を昇順で並べ替えました!"
Sort、並び替え後は、メッセージを表示します。
並び替え(Sort)方法をセルで指定する

並び替え方法のアイデアとして、並び替え方法をエクセルのセル指定に出来るようにVBAコードを改修しました。
B2セルには、並び替えしたい項目をプルダウンリスト化。ID・氏名・所属の3つを選択できるようにしています。
C2セルには、並び替えをどのようにをプルダウンリスト化。昇順・降順の2つを選択できるようにしています。
Sub 並び替えをセルで指定()
Dim ws As Worksheet
Dim lastRow As Long
Dim sortKey As String
Dim sortOrder As String
Dim colNum As Long
Dim orderType As XlSortOrder
Set ws = ThisWorkbook.Sheets(1)
' 最終行取得(A列)
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
' 並び替えリストから(B2: ID/氏名/所属)
sortKey = ws.Range("B2").Value
' 並び替えリストから(C2: 昇順/降順)
sortOrder = ws.Range("C2").Value
' 並び替えの列番号を判定
Select Case sortKey
Case "ID": colNum = 1
Case "氏名": colNum = 2
Case "所属": colNum = 3
Case Else
MsgBox "正しい並び替え項目を選択してください。"
Exit Sub
End Select
' 並び替え順序を判定
Select Case sortOrder
Case "昇順": orderType = xlAscending
Case "降順": orderType = xlDescending
Case Else
MsgBox "昇順または降順を選択してください。"
Exit Sub
End Select
' 並び替え実行(見出しはA4:C4、データはA5以降)
ws.Sort.SortFields.Clear
ws.Sort.SortFields.Add Key:=ws.Range(ws.Cells(5, colNum), ws.Cells(lastRow, colNum)), _
SortOn:=xlSortOnValues, Order:=orderType, DataOption:=xlSortNormal
With ws.Sort
.SetRange ws.Range("A4:C" & lastRow) ' A4を見出し行として含める
.Header = xlYes ' 1行目は見出し
.MatchCase = False
.Orientation = xlTopToBottom
.Apply
End With
MsgBox sortKey & "を" & sortOrder & "で並び替えました!"
End Sub
コードの解説:
' 最終行取得(A列)
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
データの最終行を取得する場合は、基本的には空白がない列を選定します。A列は、ID項目となっており、空白がないため、今回はA列を基準としました。
' 並び替えリストから(B2: ID/氏名/所属)
sortKey = ws.Range("B2").Value
' 並び替えリストから(C2: 昇順/降順)
sortOrder = ws.Range("C2").Value
並び替えはセルから指定します。項目はB2、C2で昇順・降順を確定しています。
並び替え方法をInputBoxで指定する

先ほどは、エクセルのセルを使用し、並び替え方法を指定しましたが、今度は、VBAマクロのInputBoxを使用し、並び替えをします。
Sub 並び替えダイアログ()
Dim ws As Worksheet
Dim lastRow As Long
Dim sortKey As String
Dim sortOrder As String
Dim colNum As Long
Dim orderType As XlSortOrder
Set ws = ThisWorkbook.Sheets(1)
' 最終行取得(A列)
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
' 並び替え基準をダイアログで取得
sortKey = InputBox("並び替えたい項目を入力してください:" & vbCrLf & _
"(ID / 氏名 / 所属)", "並び替え基準", "ID")
' キャンセル対応
If sortKey = "" Then Exit Sub
' 並び替え順序をダイアログで取得
sortOrder = InputBox("並び替え順序を入力してください:" & vbCrLf & _
"(昇順 / 降順)", "並び替え順序", "昇順")
If sortOrder = "" Then Exit Sub
' 基準列を判定
Select Case sortKey
Case "ID": colNum = 1
Case "氏名": colNum = 2
Case "所属": colNum = 3
Case Else
MsgBox "「ID」「氏名」「所属」のいずれかを入力してください。"
Exit Sub
End Select
' 並び替え順序を判定
Select Case sortOrder
Case "昇順": orderType = xlAscending
Case "降順": orderType = xlDescending
Case Else
MsgBox "「昇順」または「降順」を入力してください。"
Exit Sub
End Select
' 並び替え実行(1行目を見出し、2行目以降がデータ)
ws.Sort.SortFields.Clear
ws.Sort.SortFields.Add Key:=ws.Range(ws.Cells(2, colNum), ws.Cells(lastRow, colNum)), _
SortOn:=xlSortOnValues, Order:=orderType, DataOption:=xlSortNormal
With ws.Sort
.SetRange ws.Range("A1:C" & lastRow) ' 見出し含む
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.Apply
End With
MsgBox sortKey & "を" & sortOrder & "で並び替えました!"
End Sub
コードの解説:
' 並び替え基準をダイアログで取得
sortKey = InputBox("並び替えたい項目を入力してください:" & vbCrLf & _
"(ID / 氏名 / 所属)", "並び替え基準", "ID")
どの項目で並び替えをしたいかに対してInputBoxを使いダイアログウィンドウを表示したことで、人の目で分かりやすくしました。ID・氏名・所属のいずれかを入力します。
' 並び替え順序をダイアログで取得
sortOrder = InputBox("並び替え順序を入力してください:" & vbCrLf & _
"(昇順 / 降順)", "並び替え順序", "昇順")
どのように並び替えるかというところで、こちらも先ほどと同様にダイアログウィンドウを表示します。昇順か降順かを入力します。
まとめ
今回の投稿記事はいかがでしたでしょうか。経理部や営業部で定例作業として行われるようなExcelデータでもVBAマクロのSortを使用することで、毎月の同じ作業をマクロ一つで効率的に並べ替えが出来ようになります。
最初に紹介したVBAマクロは、並び替えの方法をVBAコード内で修正します。次のVBAマクロは、並び替えの方法をエクセルセルで指定するやり方。そして最後のVBAマクロは、ダイアログとしてウィンドウを表示し、並び替え方法を指定する方法の3つのアイデアをVBAマクロとしてご紹介しました。ぜひ、活用してみてください。

コメント