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
を使い、誤って見出しをソートしないようにする
コメント