VBA|Sortのエラー原因・対処法 (Apply Error’1004’など)

エクセルVBA VBAのエラー対応方法



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で削除されない・エラー対処方法

コメント

  1. […] 参考:Excel VBA入門 その45:Sortのエラー原因・対処法 (Apply Error’1004’など) […]

  2. […] 参考:Excel VBA入門 その45:Sortのエラー原因・対処法 (Apply Error’1004’など) […]

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