スポンサーリンク

【VBA】Sort:並び替える範囲の指定とHeaderの扱い

Excel VBAで並び替えを行う際に大切なのが、「どの範囲を対象にするか」、そして**「先頭行を見出しとして扱うかどうか」**です。
これを正しく設定しないと、データが崩れたり、見出し行まで並び替えられてしまうことがあります。

この記事では、並び替えでよく使う 範囲指定とHeaderの扱い について詳しく解説します。


スポンサーリンク

1. 並び替える範囲の指定方法

並び替えを行う際には、どこまでを対象にするか(SetRange) を指定します。

.SetRange ws.Range("A1:C20")

このように書くと、A1:C20の範囲をまとめて並び替えの対象とします。
もし .SetRange を正しく設定しないと、指定したキー列だけがソートされ、他の列との整合性が崩れてしまいます。

ポイント

  • 対象範囲は必ずデータ全体を含めること
    → 1列だけにすると、列ごとにバラバラの並びになってしまう
  • 表が可変長の場合は、CurrentRegion や UsedRange を活用すると便利

例:表全体を自動で取得する場合

.SetRange ws.Range("A1").CurrentRegion

スポンサーリンク

2. Headerの扱いとは?

Excelには「見出し行(Header)」があります。
VBAでソートする場合、この見出しをデータに含めるのか・含めないのかを指定する必要があります。

設定方法は以下の通りです。

.Header = xlYes   '1行目を見出しとして扱う
.Header = xlNo    '見出しなし(すべてデータとして並び替える)
.Header = xlGuess 'Excelが自動で判断する

スポンサーリンク

3. Headerを正しく設定しないとどうなる?

たとえば以下のような社員表を考えてみます。

部署名前入社日
営業田中2020/04/01
開発鈴木2019/06/15

ここで .Header = xlNo と設定してしまうと、
「部署」「名前」「入社日」という見出し行まで一緒に並び替えられてしまい、見出しがデータの中に紛れ込む状態になります。

正しくは .Header = xlYes と設定して、1行目を見出し行として守る必要があります。


スポンサーリンク

4. コード例:範囲とHeaderを指定して並び替え

以下は、A列の部署(昇順)で並び替える例です。

Sub 範囲とHeaderを指定した並び替え()
    Dim ws As Worksheet
    Dim targetRange As Range
    
    Set ws = ThisWorkbook.Sheets("Sheet1")
    Set targetRange = ws.Range("A1:C20")
    
    With ws.Sort
        .SortFields.Clear
        
        '部署列を昇順に
        .SortFields.Add Key:=ws.Range("A2:A20"), _
                        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        
        '並び替える範囲を指定
        .SetRange targetRange
        
        '1行目を見出しとする
        .Header = xlYes
        
        '並び替え実行
        .Apply
    End With
End Sub

5. 実務での使いどころ

  • 売上表や社員名簿など、必ず見出し行がある表では .Header = xlYes が基本
  • データだけのリスト(見出しがない場合)は .Header = xlNo
  • 不確定な場合は .Header = xlGuess でも可(ただし誤判定のリスクがあるので非推奨)

6. まとめ

  • 並び替えの対象は .SetRange で必ず表全体を指定する
  • 見出し行を守るために、.Header の設定が重要
  • 基本的には .Header = xlYes を使い、誤って見出しをソートしないようにする

コメント

タイトルとURLをコピーしました