「選択範囲をlistobjectsに」
という検索でアクセスがありました。
2007以降のExcelでは、[挿入]タブ-[テーブル]グループ-[テーブル]ボタンから、
単なるセル範囲を、Excelをデータベースとして使うのに便利な[テーブル](ListObjectオブジェクト)にすることができます。
「選択範囲をlistobjectsに」
という検索をした方は、この[挿入]タブ-[テーブル]グループ-[テーブル]ボタンと同じようなことを行う、VBA(Visual Basic for Applications)のコードを探していたのでしょう。
選択範囲をテーブルにするサンプルマクロ
以下のようなマクロで、選択されているセル範囲をテーブルにすることができます。ActiveSheet.ListObjects.Add _
SourceType:=xlSrcRange, _
Source:=Selection.Cells, _
XlListObjectHasHeaders:=xlYes
End Sub
サンプルマクロの解説
ListObjectsコレクションオブジェクトのAddメソッドで、セル範囲をテーブルにできます。
ListObjects.Addメソッドには、以下の6個の引数を指定できますが、- SourceType
- Source
- LinkSource
- XlListObjectHasHeaders
- Destination
- TableStyleName
- SourceType
- Source
- XlListObjectHasHeaders
でしょう。
ListObjects.Addメソッドは、作成したListObjectオブジェクトを返しますから、詳細な設定が必要な場合は、
Dim lst As ListObject
Set lst = ActiveSheet.ListObjects.Add _
のようにオブジェクト変数に格納しておいてから、変更処理を別に行うほうが可読性が上がってよさそうに感じます。
引数・SourceTypeは、テーブルにする元データの種類が何であるかを指定し、セル範囲の場合は、XlListObjectSourceType列挙に定義されている、定数・xlSrcRangeを指定します。
引数・Sourceは、テーブルの元データを指定します。今回は選択されているセル範囲ですので、Selection.Cellsというオブジェクト式を指定しています。
引数・XlListObjectHasHeadersは、選択されているセル範囲の1行目がフィールド見出しであるかどうかを指定します。セル範囲をテーブルにしたいという実務でのシーンを考えると、その1行目にはフィールド見出しが入力されているというケースが多そうに感じますので、上記のマクロでは定数・xlYesを指定しています。
元のセル範囲の1行目がフィールド見出しではなくデータの場合は、引数・XlListObjectHasHeadersに定数・xlNoを指定して、
ActiveSheet.ListObjects.Add _
SourceType:=xlSrcRange, _
Source:=Selection.Cells, _
XlListObjectHasHeaders:=xlNo
としてください。
この場合、「列1」「列2」「列3」といった、仮のフィールド見出しの行が自動的に挿入されます。
ListObjects.Addメソッドのヘルプには間違いが
ところで、2015年8月現在、ListObjects.Addメソッドのヘルプは、残念なことに間違っているところが複数あります。
引数の数が本当は6個なのに、5個であるかのように記述されています。
本当は「XlListObjectHasHeaders」という引数名なのに、「HasHeaders」になっています。(但しこれはヘルプに記載されているHasHeadersのほうが、本来あるべき名前だと感じます...)
また、引数についての説明が間違っている部分もあります。
ヘルプを鵜呑みにすることなく、オブジェクトブラウザーをしっかり確認することをおすすめします。
Home » エクセルマクロ・Excel VBAの使い方 » ListObjectオブジェクト » VBAで選択されているセル範囲をListObject・テーブルにする