VBAでは、データを並び替えるためにSortを使うことが多いですが、エラーが発生することも多いですよね。
今回は、Sortのエラーの原因や対処方法について徹底的に説明していきます。
参考:Excel VBA入門 その47:Sortで空白セルを無視して並び替えする方法
Sortのエラー原因・対処法
Sortをしたときのエラーは、以下のようなケースがあります。
- Sortを実行してもソートがうまくいかない(ソートしない)
- 実行時エラー’1004′ アプリケーション定義またはオブジェクト定義のエラーです。と表示された
- Sortを実行したら「メソッドが失敗しました」と表示された
- オブジェクトが必要です。と表示された
- 実行時エラー’9′ インデックスが有効範囲にありません。と表示された
- 実行時エラー’13’ 型が一致しません。と表示された
- 実行時エラー’424′ オブジェクトが必要です。と表示された
- 実行時エラー’448′ 名前付き引数が見つかりません。と表示された
これらの原因・対処法を説明していきます!!
Sortを実行してもソートがうまくいかない(ソートしない)
Sortオブジェクトは、引数が設定されていなくてもスペルなどを間違っていなければエラーが出にくい仕様になっています。
エラーが表示されないのにソートが実行されないという事態に陥ることも多々あります。
よくある例を挙げます。
下の表のD列の値段を昇順に並び替えたいとします。
間違った例を挙げます。本来は、セルの並び替える範囲に、本来「.SetRange Range(“A1”).CurrentRegion」のようにCurrentRegionを使ってデータが入っている表全体を指定します。
この5行目の’.SetRange Range(“A1”).CurrentRegionをコメント文にした状態で実行してみましょう。
Sub データの並び替え()
With ActiveSheet.Sort
.SortFields.Clear
.SortFields.Add Key:=Range("D2"), SortOn:=xlSortOnValues, Order:=xlAscending
'.SetRange Range("A1").CurrentRegion
.Header = xlYes
.Apply
End With
End Sub
実行しても、コードのエラーは出ません。
もちろんソートは行われません。
エラーが出ないので何が間違っているのか分からず途方に暮れることになります。
Sortオブジェクトには、こんなトラップが隠されているのです。
Sortオブジェクトの構文は、
Sortオブジェクト. SortField.Add(Key, SortOn, Order, CustomOrder)
Key→並び替える列
SortOn→並び替えの方法
Order→昇順、降順
で、それに加えて、SetRangeメソッドで並び替え対象のセル範囲を設定する必要があります。
その他、Sortオブジェクトの引数やプロパティは以下の表のようになっています。
引数 | 定数 | 説明 |
Key | - | Rangeオブジェクトでセル範囲を指定する |
SortOn | xlSortOnValues | 値で並べ替えする |
xlSortOnCellColor | 背景色で並べ替え | |
xlSortOnFontColor | 文字色で並べ替え | |
xlSortOnIcon | アイコンで並べ替え | |
Order | xlAscending | 昇順 |
xlDescending | 降順 | |
CostomOrder | - | ユーザー設定の並べ替え基準 |
DataOption | xlSortNormal | 数値とテキストを別々に並べ替え |
xlSortTextAsNumbers | テキストを数値データとして並べ替え |
プロパティ | 定数 | 説明 |
Header | xlGuess | 先頭行をタイトルか自動判定する |
xlYes | 先頭行をタイトルとみなす | |
xlNo | 先頭行をタイトルとみなさない | |
MatchCase | TRUE | 大文字・小文字を区別する |
FALSE | 大文字・小文字を区別しない | |
Orientation | xlSortRows | 縦方向の並べ替え |
xlSortColumn | 横方向の並べ替え | |
SortMethod | xlPinYin | 日本語をふりがなで並べ替え |
xlStroke | 日本語を文字コードで並べ替え |
実行時エラー’1004′ アプリケーション定義またはオブジェクト定義のエラーです。と表示された
Sortにおけるエラー1004は、データが無い列を指定していることや、列の指定が適切ではないことが主な原因です。
例えば、E列にデータが入っていないにも関わらず、.SortFields.Add Key:=Range(“E2”)のように、データが無い列を指定すると発生するエラーです。
また、.SortFields.Add Key:=Range(“C”)のように、列の指定が適切ではないとエラーになってしまいます。
きちんとSortFields.Add Key:=Range(“C2”)のように、データが入っているセル番号を指定することが対処方法になります。
Sortを実行したら「メソッドが失敗しました」と表示された
ユーザー設定リストが設定リストが無い(上手く引き継がれていない)ことが原因として挙げられます。
他にも、参照設定の問題やActiveXコントロールの問題等も考えられます。
オブジェクトが必要です。と表示された
原因は、オブジェクトが適正に設定されていないことが挙げられます。
例えば、With Activesheet.Sort と記述したいところ、Activesheetsのように「s」を付けてしまうなど、本来指定すべきオブジェクトが上手く設定されていないことが原因として考えられます。
実行時エラー’9′ インデックスが有効範囲にありません。と表示された
存在しないシートを選択したなど、適正にオブジェクトが設定されていないことが原因として挙げられます。
例えば、シートが2枚しかないのに、With Worksheets(5).Sortのように、スペリングは合っているものの、存在しないシートを指定してしまうなどが考えられます。
実行時エラー’13’ 型が一致しません。と表示された
Sortの構文のスペルミスによるものが原因として挙げられます。
例えば、本来 Key:=Range(“C2”)と記述すべきところを、誤ってKey=Range(“C2”)としてしまうなどのスペルミスによるものが考えられます。
実行時エラー’424′ オブジェクトが必要です。と表示された
Sortの構文のスペルミスによるものが原因として挙げられます。
例えば、本来 Key:=Range(“C2”)と記述すべきところを、誤ってKey=Range(“C2”)としてしまうなどのスペルミスによるものが考えられます。
実行時エラー’448′ 名前付き引数が見つかりません。と表示された
Sortの構文のスペルミスによるものが原因として挙げられます。
例えば、本来SortOn:=xlSortOnValues,と記述すべきところを、誤ってSortn:=xlSortOnValues,のようにスペルミスをして記述してしまうなどでエラーが発生してしまいます。
Sortオブジェクトを使用した正しいサンプルコード
下の表を種類と値段で並び替えます。
Sub データの並び替え()
With ActiveSheet.Sort
.SortFields.Clear
.SortFields.Add Key:=Range("C2"), SortOn:=xlSortOnValues, Order:=xlAscending
.SortFields.Add Key:=Range("D2"), SortOn:=xlSortOnValues, Order:=xlAscending
.SetRange Range("A1").CurrentRegion
.Header = xlYes
.Apply
End With
End Sub
参考:Excel VBA入門 その55:RemoveDuplicatesで削除されない・エラー対処方法
コメント
[…] 参考:Excel VBA入門 その45:Sortのエラー原因・対処法 (Apply Error’1004’など) […]
[…] 参考:Excel VBA入門 その45:Sortのエラー原因・対処法 (Apply Error’1004’など) […]