Excel VBA入門 その45: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オブジェクトの引数やプロパティは以下の表のようになっています。

引数定数説明
KeyRangeオブジェクトでセル範囲を指定する
SortOnxlSortOnValues値で並べ替えする
xlSortOnCellColor背景色で並べ替え
xlSortOnFontColor文字色で並べ替え
xlSortOnIconアイコンで並べ替え
OrderxlAscending昇順
xlDescending降順
CostomOrderユーザー設定の並べ替え基準
DataOptionxlSortNormal数値とテキストを別々に並べ替え
xlSortTextAsNumbersテキストを数値データとして並べ替え
プロパティ定数説明
HeaderxlGuess先頭行をタイトルか自動判定する
xlYes先頭行をタイトルとみなす
xlNo先頭行をタイトルとみなさない
MatchCaseTRUE大文字・小文字を区別する
FALSE大文字・小文字を区別しない
OrientationxlSortRows縦方向の並べ替え
xlSortColumn横方向の並べ替え
SortMethodxlPinYin日本語をふりがなで並べ替え
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をコピーしました