SortオブジェクトのHeaderプロパティの基本について解説しました。
この記事で言及していた、Sort.Headerに定数xlNoを設定できないケースをご紹介します。
結論からいえば下図のようなテーブル(ListObjectオブジェクト)の、
Sortプロパティで取得したSortオブジェクトでは、HeaderにxlNoを設定できません。
テーブルのSortでHeaderにxlNoを設定できないことを確認するサンプルマクロ
具体的なコードで確認しましょう。
先日ご紹介したSubプロシージャを少しだけ修正して以下のようにした場合、「sot.Header = xlNo」の行で実行時エラーが発生します。
Dim sot As Sort
' Set sot = ActiveSheet.Sort
Set sot = ActiveSheet.ListObjects(1).Sort
sot.SortFields.Clear
' sot.SetRange Range("A1:B6")
sot.Header = xlNo ' ← xlNoを指定すると実行時エラーが発生する
sot.SortFields.Add Key:=Range("B1")
End Sub
ご紹介済みのSubプロシージャとどこが違うかを確認しましょう。
まず、オブジェクト変数にセットしているSortオブジェクトを取得するオブジェクト式(オブジェクトを取得するコード)が異なります。
' Set sot = ActiveSheet.Sort
Set sot = ActiveSheet.ListObjects(1).Sort
WorksheetオブジェクトのSortプロパティではなく、
ListObjectオブジェクトのSortプロパティでSortオブジェクトを取得しています。
つづいて以下の行をコメントアウトしています。
' sot.SetRange Range("A1:B6")
ヘルプに「範囲がテーブル内にある場合は使用できません。」と記載されているとおり、ListObjectオブジェクトのSortプロパティで取得したSortオブジェクトの場合、SetRangeメソッドを使えませんのでこの行をコメントアウトしています。
ListObject.Sortプロパティで取得したSortオブジェクトは、どのセル範囲かは既にハッキリしているため、SetRangeメソッドを使えないのは納得の仕様です。
同じ理由で、HeaderプロパティにxlNoを指定すると実行時エラーが発生します。
テーブルは構造がしっかりしていて、見出し行が必ず先頭に存在しています。
だからこそ、テーブルではスクロールしたときに、
上図のような状態になるわけです。
Sort.Header = xlNoで実行時エラーが発生するのは、納得の仕様です。
ローカルウィンドウでSort.Headerを確認しましょう
Sort.Headerの初期値をローカルウィンドウなどで確認すると、この仕様をより深く理解できます。
まずHeaderプロパティにxlNoを設定できる、WorksheetオブジェクトのSortプロパティで取得したSortを確認します。
上図のように、オブジェクト変数にSortオブジェクトがセットされた段階で、Sort.Headerの値はxlGuessになっています。
ヘルプに記載のあるとおり、Sort.Headerプロパティの規定値xlGuessで初期化されることを確認できます。
つづいてこの記事でご紹介しているListObjectのSortです。
オブジェクト変数にSortオブジェクトがセットされた段階で、Sort.Headerの値はxlYesになっています。
- Newer:VarPtr関数でByRef・参照渡しのメモリアドレスを確認する
- Older:ブレークポイントを使ってみてください
Home » エクセルマクロ・Excel VBAの使い方 » Sortオブジェクト » テーブル・ListObjectのSortではHeaderにxlNoを設定できない