Excel VBAを使ってセル範囲をソートしたい!けど…。
しかし、どうやっていいかわからない!
当サイトでは、他にもExcelで業務効率・作業効率を上げる記事を投稿しています。興味があればそちらも合わせてご覧いただけると幸いです。
それではいってみましょー。
ソートの基本構文
Excel VBAでセル範囲をソートする基本的な構文は以下の通りです。
'セル範囲をソートするシンプルなコード
Range.Sort([Key1], [Order1], [Key2], [Type], [Order2], [Key3], [Order3], [Header])
Rangeの部分でソート対象となる範囲を指定し、「Key1, Key2, Key3」の部分でソートのキーとなる範囲を指定します。「Order1, Order2, Order3」で各キーに対するソートの順序を指定します。
そんなこと言うてもようわからんよ!という方のために少し分解して説明しますね。
Range:この部分で、どのセルの範囲を並べ替えるかを指定します。例えば、A1からC10までのセルを並べ替えたい場合は、Range(“A1:C10”)と書きます。
Key1, Key2, Key3:これらは、どの列や行を基準にしてデータを並べ替えるかを指定する部分です。例えば、A列を基準にしたい場合は、Key1にRange(“A1”)を指定します。
Order1, Order2, Order3:これらは、指定したキー(基準)でデータを昇順(小さいものから大きいものへ)にするか、降順(大きいものから小さいものへ)にするかを指定します。昇順にしたい場合はxlAscending、降順にしたい場合はxlDescendingを指定します。
この命令を使うと、Excelのシート上のデータを簡単に並べ替えることができます。最初は少し複雑に感じるかもしれませんが、何度か使ってみると慣れてきますので、ぜひ試してみてください。
具体的なソートの使い方
Range.Sort()を上手く使えると、「セル範囲内のデータを複数のキーで並べ替えることができる。」「セルの色やフォントなどの属性を基準に並べ替えることができる。」「行だけでなく、列も並べ替えることができる。」などソートの自由度が増します。
個人的におすすめな使い方は下記の3つです。
- 複数のキーでソートする。
- ヘッダーのない範囲をソートする。
- ソート範囲のオートフィルタを無効にする。
なんで便利なのか簡単にお話しますね。
複数のキーでソートする
複数のキーを指定することで、最初のキーでソートし、同じ値の場合には次のキーでソートすることができます。
一つの基準だけでなく、複数の基準(キー)を使用してデータをソートすることができるのでデータを分析するときに役立ちます。
例えば、社員のリストがあり、最初に部署でソートし、次に社員の名前でソートしたい場合、この機能を使用すると、部署ごとに整理された上で、その中で名前順にソートされたリストを得ることができます。これにより、より詳細なソート結果を得ることができ、情報の整理や分析がしやすくなります。
ヘッダーのない範囲をソートする。
ソート範囲にヘッダーがない場合は、Header:=xlNo と指定することで、ヘッダーのない範囲をソートすることができます。
全てのデータがヘッダーを持っているわけではありません。ヘッダーがない場合でも、VBAを使って簡単にソートを実行できるため、データの形式に左右されずに作業を進めることができます。なので、ヘッダー(タイトル行)がないデータ範囲でも、問題なくソートを実行することができるのは大変便利です。
ソート範囲のオートフィルタを無効にする。
ソート後に自動的にオートフィルタが適用される場合、SortMethod パラメータに xlPinYin を指定することで、オートフィルタを無効にすることができます。
オートフィルタが有効な状態でソートを行うと、フィルタリングされたデータのみがソートの対象となってしまいます。これにより、期待した結果と異なるソート結果が得られる可能性があります。オートフィルタを無効にすることで、全てのデータを対象とした正確なソートを実行することができます。
VBAコード例
実際に使えるVBAのコードを書いてどんなときに使えるのかをイメージしてもらえると幸いです。
'A列をキーに降順に並べ替える場合
Sub SortColumnADescending()
Range("A1:C5").Sort Key1:=Range("A1"), Order1:=xlDescending, Header:=xlNo
End Sub
上記のコードを使うような場面は、社員の給与リストがA列にあり、給与の高い順にデータを並べ替えたい場合です。
A列をキーにしてデータを降順(大きいものから小さいものへ)にソートします。給与のような数値データで、上位のデータを先頭に持ってきたい場面で非常に便利です。例えば、給与のトップ10を確認する際などに役立ちます。
'A列を第1キー、B列を第2キーに昇順に並べ替える場合
SortColumnAandBAscending()
Range("A1:C5").Sort Key1:=Range("A1"), Order1:=xlAscending, _
Key2:=Range("B1"), Order2:=xlAscending, Header:=xlNo
End Sub
上記のコードを使うような場面は、A列に部署名、B列に社員の名前が記載されているリストがあり、部署ごとにまとめた後、その中で社員の名前順に並べ替えたい場合です。
A列を第1のキー、B列を第2のキーとして昇順にソートします。部署ごとのリストを作成し、その中でアルファベット順や五十音順などで名前を並べ替える場面で非常に便利です。これにより、特定の部署の社員を簡単に探すことができます。
'A行をキーに左から右へ並べ替える場合
Sub SortRowAAscending()
Range("A1:E3").Sort Key1:=Range("A1"), Order1:=xlAscending, _
Orientation:=xlLeftToRight, Header:=xlNo
End Sub
上記のコードを使うような場面は、A行に各製品の売上データが月ごとに記載されており、過去の月から新しい月へとデータを並べ替えたい場合です。
A行をキーにしてデータを左から右へ昇順にソートします。時間の経過とともに追加されるデータ、例えば月次の売上データなどを、過去から現在へと順番に並べ替える場面で役立ちます。これにより、時系列に沿ったデータの推移や変化を一目で確認することができます。
これらのコードのようにRange().Sortを使用することで、Excelのデータを効率的に整理し、分析や報告の作業をスムーズに進めることができます。
可変範囲のソート
ソート範囲の行が固定でない場合のソート例もあります。最終行は End プロパティで取得して、ソートの設定を行うことができます。
可変範囲のソートをVBAで行う場合、まず最後のデータの位置を特定する必要があります。これにはEndメソッドやUsedRangeプロパティなどを使用します。
例えば、A列にデータが不規則に入力されており、そのデータの範囲を昇順にソートしたい場合は以下のようなコードになります。
'可変範囲のソートするコード
Sub SortVariableRange()
Dim LastRow As Long
Dim ws As Worksheet
' シートを設定
Set ws = ThisWorkbook.Worksheets("Sheet1")
' A列の最後の行を取得
LastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
' 取得した範囲を昇順にソート
ws.Range("A1:A" & LastRow).Sort Key1:=ws.Range("A1"), Order1:=xlAscending, Header:=xlNo
End Sub
上記のコードは、A列のデータの最後の行を特定し、その範囲を昇順にソートします。LastRow変数には、A列の最後のデータの行番号が格納されます。この方法を使用すると、データの範囲が変わっても自動的に適切な範囲をソートすることができます。
まとめ
Excel VBAでのセル範囲のソートは非常に柔軟で強力な機能です。基本的なソートから応用的なソートまで、多岐にわたるケースに対応することができます。
簡単に記事内容をまとめたいと思います。
- ソートの基本構文とコードを理解する。
- 複数のキーでのソートやヘッダーの有無など、細かい設定が可能です。
- 特定の範囲や複数のシートでのソートなど、応用的な使い方もできます。
この知識を活用して、Excelのデータ処理をより効率的に行いましょう。
この記事を気に入っていただけたら、コメントやシェアをしていただけるととても励みになります!これからも、パソコンの作業効率を上げる方法やパソコンのちょっとした疑問や困ったを解決情報を発信していきますので、たまにサイトをチェックしていただけると、とっても嬉しいです(‘ω’)ノ。
SNSのフォローボタンを、ポチってくれるとめっちゃ嬉しいです👍
ではでは、最後までご覧いただきありがとうございました。
Twitter:@Uriuri_writer
Follow @Uriuri_writer
Instagram:@uriuri_writer
Instagram
コメント