【VBA入門】Sortでセルの範囲内を自動で並べ替える

  • 2024.12.20
       
【VBA入門】セルの範囲内をソートする(自動で並べ替える)

皆さんは、Exelで作業をする際にソート機能を活用していますか?

セルに格納されたデータを数値の小さい順から大きい順に並べ替えたり、あるいは割り振ったIDや名前によって並べ替えたりと、ソートが必要になる場面も多いかと思います。

今回は、

  • ソート機能とは?
  • Sortメソッドの使い方
  • Sortオブジェクトの使い方

など、Excel VBAのソート機能の基本的な内容から応用方法まで詳しく解説していきます!

Excelのソート機能とは?VBAではどうやって使う?

ソートとは、一定の法則に従ってデータを順番に並べ替えることです。

数値であれば小さい値から大きい値へと順に並べたり、文字列であればアルファベット順や五十音順にデータを並べ直すといった具合です。Excelには、あらかじめ条件を指定することで、この並べ替えを自動的に行ってくれる機能が存在します。

VBAでソート機能を実装する場合は、RangeオブジェクトのSortメソッドを使用する方法と、Excel2007以降であればSortオブジェクトを使用する方法の2種類があります。

Sortメソッドで並べ替え条件を設定する

まずは、Sortメソッドの使い方について解説をしていきます。

メソッドの基本的な構文は以下の通りです。

【基本構文】

Range("セル範囲").Sort Key1:=Range("キー"), Order1:=並べ替え順

Key1には、並べ替えの基準となる列や行のセルを指定します。

Order1では、並べ替えの順序を指定します。「xlAscending」が昇順、「xlDescending」が降順の指定になります。

サンプルとして、以下の表をSortメソッドで並べ替えてみましょう。

今回は、商品の値段を基準に昇順で並べ替えを行います。

【サンプルコード】

Sub sampleSort()
  Range("B3:C9").Sort Key1:=Range("C3"), Order1:=xlAscending
End Sub

【実行結果】

Sortメソッドの設定項目

Sortメソッドには、先ほど説明したもの以外にも様々な引数が存在します。
以下に一覧をまとめました。

引数 説明
Key1 1番目に優先する並べ替え基準のセル範囲
Order1 Key1の並べ替え順序を昇順か降順かで指定
Key2 2番目に優先する並べ替え基準のセル範囲
Order2 Key2の並べ替え順序を昇順か降順かで指定
Key3 3番目に優先する検索基準のセル範囲
Order3 Key3の並べ替え順序を昇順か降順かで指定
Header

指定範囲の最初の行にヘッダーが含まれているか否かを指定

  • xlGuess:ヘッダーかどうかを自動で判定する
  • xlNo:ヘッダーを含まない(範囲全てを並べ替える)
  • xlYes:ヘッダーを含む(ヘッダーを除いて並べ替える)
OrderCustom ユーザー設定の並べ替え順を指定
MatchCase 大文字と小文字を区別するか否かを指定
  Trueは区別する。Falseは区別しない。
Orientation 行で並べ替えるか、または列で並べ替えるかを指定
  xlSortRowsは行単位、xlSortColumnsは列単位で並び替え
SortMethod 日本語をふりがな順で並び替えるか、または文字コード順で並び替えるかを指定
  xlPinYinはひらがな順、xlStrokeは文字コード順で並べ替え

各引数は省略可能ですが、前回に並べ替えを行なった際の設定(ワークシートで手作業で行なった分も含む)が引き継がれるものもあるため、都度指定をする方が安全に運用できます。

Sortオブジェクトの使い方

Excel2007以降では、Sortオブジェクトの使用が可能になりました。

以下のプロパティを使って、ソートの設定を行います。

プロパティ 説明
Header

指定範囲の最初の行にヘッダーが含まれているか否かを指定

  • xlGuess:ヘッダーかどうかを自動で判定する
  • xlNo:ヘッダーを含まない(範囲全てを並べ替える)
  • xlYes:ヘッダーを含む(ヘッダーを除いて並べ替える)
MatchCase 大文字と小文字を区別するか否かを指定
  Trueは区別する。Falseは区別しない。
Orientation 行で並べ替えるか、または列で並べ替えるかを指定
  xlSortRowsは行単位、xlSortColumnsは列単位で並び替え
SortMethod 日本語をふりがな順で並び替えるか、または文字コード順で並び替えるかを指定
  xlPinYinはひらがな順、xlStrokeは文字コード順で並べ替え

また、プロパティの1つであるSortFieldsコレクションAddメソッドを使って、キーや並べ替え条件の指定を行うことができます。

【基本構文】

ワークシート名.Sort.SortFields.Add Key:=Range(“キー”), Order:=並べ替え順

以下は、Sortオブジェクトを使用する場合のコードの一例です。

【サンプルコード】

Sub sampleSortObj()

  Dim ws As Worksheet
  Set ws = ActiveSheet
  
  With ws.Sort

    With .SortFields
      .Clear
      .Add Key:=ws.Range("B1"), Order:=xlAscending
    End With
    
    .SetRange ws.Range("A1:B9")
    .Apply
  End With

End Sub

キーの指定を行う際は、先にClearメソッドで前回ソート時の情報をクリアしてからAddメソッドを使用します。

SortオブジェクトのSetRangeメソッドで並べ替えを行うセル範囲を指定し、Applyメソッドで並べ替えを実行しています。

数値型の配列をソートする

配列そのものには残念ながらソート機能が無いため、代わりにSortメソッドを使用して並べ替えを行う方法を紹介します。

以下のサンプルコードで確認していきましょう。

【サンプルコード】

Sub sampleSortArray()
    
    Dim arr() As Variant
    arr = Array(1, 5, 2, 4, 3)

  Dim arrCount As Integer
  arrCount  = UBound(arr) + 1
  
    For num = 1 To arrCount
        Cells(num, 1).Value = arr(num - 1)
    Next num
    
    Range("A1:A" & arrCount).Sort key1:=Range("A1"), Order1:=xlAscending
    
End Sub

【実行結果】

このサンプルコードではまず、作成した動的配列の要素をExcelシート上のセルに反映させています。要素をセルに反映させることで、Sortメソッドでの並べ替えが可能になります。

セルへのコピーは、ループ処理を使用して行なっています。配列のインデックス番号は0から始まりますが、セル範囲は1から順に数を数えるため、ループの開始数値には1を指定します。

UBound関数は、配列のインデックス番号の最大値を取得する関数です。要素数が合計で5つのため、この関数で返される数値は4になりますが、ループの開始数値を1から始めているので数を1つ足してから終了数値に指定しています。

Dir関数で取得したファイル・フォルダの一覧をソートする

Dir関数は、指定した条件に一致するファイルやサブフォルダなどの一覧を取得することができる関数です。

▼▼Dir関数に関する詳しい解説はこちらをご覧ください▼▼

データを扱う上で非常に有用な機能ですが、残念ながらDir関数にもソート機能は用意されていないため、検索結果を並べ替えたい場合には別途で処理する必要があります。

この場合も、Sortメソッドを使って並び替えを行うと便利です。

【サンプルコード】

Sub sampleSortFile()

  Dim path As String, directory As String, msg As String
  
  path = "C:\Program Files (x86)\Microsoft Office\*"
  directory = dir(path, vbDirectory)
  
 'ファイル名・フォルダ名が見つからなくなるまでループ
  Do While directory <> ""

    If InStr(directory, ".") <> 1 Then
      msg = msg & directory & vbCrLf
    End If

    '次のファイル名、フォルダ名を取得
    directory = dir()
  Loop
    
  Dim arr() As String

 '改行ごとに文字列を区切り、配列の要素として格納
  arr = Split(msg, vbCrLf)
  
  Dim arrCount As Integer
  arrCount = UBound(arr) + 1
  
  Range("A1:A" & arrCount) = WorksheetFunction.Transpose(arr)
  Range("A1:A" & arrCount).Sort key1:=Range("A1"), Order1:=xlDescending
    
  MsgBox msg

End Sub

【実行結果】

このコードでは、まず初めにDir関数を使ってファイル名とサブフォルダ名の一覧を取得しています。
(フォルダのパスに関しては、使用しているPC環境で多少の違いが出るので、自身の環境に合わせて変更を行ってください)

一旦、取得した一覧を文字列として変数に代入した後、Split関数を使って配列arrの要素に格納しています。その後、格納した要素をセルに反映させてから、Sortメソッドを使って降順に並び替えています。

辞書(Dictionary)型のデータをキーの文字列でソートする

次に、Dictionary(辞書)内の要素をソートする方法について見ていきます。
基本的な流れはこれまでと同様ですが、今回はSortオブジェクトの方を使用して並び替えを行ってみましょう。Dictionaryはキーとデータが紐づいて格納されているため、キーをもとにソートします。

▼▼Dictionary型の詳しい解説はこちらをご覧ください▼▼

【サンプルコード】

Sub sampleSortDictionary()

    Dim myDic As Object
    Set myDic = CreateObject("Scripting.Dictionary")
    
    myDic.Add "じゃがいも", 210
    myDic.Add "きゅうり", 150
    myDic.Add "はくさい", 270
    myDic.Add "トマト", 320
    myDic.Add "えのき", 190
    
    
    Dim num As Integer
    num = 1

    Dim str As String
    
    For Each Key In myDic
        Cells(num, 1).Value = Key
        Cells(num, 2).Value = myDic.Item(Key)
        
        str = str & Key & " : " & myDic.Item(Key) & vbCrLf
        num = num + 1
    Next Key
    

    With ActiveSheet.Sort
        With .SortFields
            .Clear
            .Add Key:=Range("A1"), Order:=xlAscending
        End With
        
        .SetRange Range("A1:B" & myDic.Count)
        .Apply
    End With
    
    MsgBox str

End Sub

【実行結果】

まず初めに、Dictionayオブジェクトを作成して要素を格納した後、Excelシート上のセルにそれぞれのキーとデータを反映させています。

各要素の反映が完了したら、Sortオブジェクトを使用してソートの設定を行います。今回はキーを基準に並べ替えを行うので、SortFieldsコレクションのAddメソッドでA列を指定しています。

Dictionay内の各キーには、ひらがなかカタカナのどちらかが格納されているので、ソート後の順番は五十音順になっています。

まとめ

ここまで、Excelのソート機能について解説してきました。

大量のデータを扱うExcelでの作業においては、ソートを駆使してデータを整理するスキルは様々な場面で応用が効きますので、しっかりマスターして使いこなしてくださいね!

関連記事

VBAの勉強方法は?

書籍やインターネットで学習する方法があります。昨今では、YouTubeなどの動画サイトやエンジニアのコミュニティサイトなども充実していて多くの情報が手に入ります。
そして、より効率的に知識・スキルを習得するには、知識をつけながら実際に手を動かしてみるなど、インプットとアウトプットを繰り返していくことが重要です。特に独学の場合は、有識者に質問ができたりフィードバックをもらえるような環境があると、理解度が深まるでしょう。

ただ、VBAに限らず、ITスキルを身につける際、どうしても課題にぶつかってしまうことはありますよね。特に独学だと、わからない部分をプロに質問できる機会を確保しにくく、モチベーションが続きにくいという側面があります。独学でモチベーションを維持する自信がない人にはプログラミングスクールという手もあります。費用は掛かりますが、その分スキルを身につけやすいです。しっかりと知識・スキルを習得して実践に活かしたいという人はプログラミングスクールがおすすめです。

プログラミングスクールならテックマニアがおすすめ!

ITスキル需要の高まりとともにプログラミングスクールも増えました。しかし、どのスクールに通うべきか迷ってしまう人もいるでしょう。そんな方にはテックマニアをおすすめします!これまで多くのITエンジニアを育成・輩出してきたテックマニアでもプログラミングスクールを開講しています。

<テックマニアの特徴>
・たしかな育成実績と親身な教育 ~セカンドキャリアを全力支援~
・講師が現役エンジニア ~“本当”の開発ノウハウを直に学べる~
・専属講師が学習を徹底サポート ~「わからない」を徹底解決~
・実務ベースでスキルを習得 ~実践的な凝縮カリキュラム~

このような特徴を持つテックマニアはITエンジニアのスタートラインとして最適です。
話を聞きたい・詳しく知りたいという方はこちらからお気軽にお問い合わせください。

     

Otherカテゴリの最新記事