Home » エクセルマクロ・Excel VBAの使い方 » ListObjectオブジェクト » VBAで選択されているセル範囲をListObject・テーブルにする

VBAで選択されているセル範囲をListObject・テーブルにする

対象:Excel2007, Excel2010, Excel2013

「選択範囲をlistobjectsに」
という検索でアクセスがありました。

2007以降のExcelでは、[挿入]タブ-[テーブル]グループ-[テーブル]ボタンから、

VBAで選択されているセル範囲をListObject・テーブルにする

単なるセル範囲を、Excelをデータベースとして使うのに便利な[テーブル](ListObjectオブジェクト)にすることができます。

「選択範囲をlistobjectsに」
という検索をした方は、この[挿入]タブ-[テーブル]グループ-[テーブル]ボタンと同じようなことを行う、VBA(Visual Basic for Applications)のコードを探していたのでしょう。

[スポンサードリンク]

選択範囲をテーブルにするサンプルマクロ

以下のようなマクロで、選択されているセル範囲をテーブルにすることができます。
Sub 選択範囲をテーブルにする()
 ActiveSheet.ListObjects.Add _
  SourceType:=xlSrcRange, _
  Source:=Selection.Cells, _
  XlListObjectHasHeaders:=xlYes
End Sub

サンプルマクロの解説

ListObjectsコレクションオブジェクトのAddメソッドで、セル範囲をテーブルにできます。

ListObjects.Addメソッドには、以下の6個の引数を指定できますが、
  • SourceType
  • Source
  • LinkSource
  • XlListObjectHasHeaders
  • Destination
  • TableStyleName
実務で、セル範囲をテーブルにする場合に指定すべきは、上記のマクロで利用している3つ
  • SourceType
  • Source
  • XlListObjectHasHeaders

でしょう。

ListObjects.Addメソッドは、作成したListObjectオブジェクトを返しますから、詳細な設定が必要な場合は、
 Dim lst As ListObject
 Set lst = ActiveSheet.ListObjects.Add _
のようにオブジェクト変数に格納しておいてから、変更処理を別に行うほうが可読性が上がってよさそうに感じます。

引数・SourceTypeは、テーブルにする元データの種類が何であるかを指定し、セル範囲の場合は、XlListObjectSourceType列挙に定義されている、定数・xlSrcRangeを指定します。

VBAで選択されているセル範囲をListObject・テーブルにする

引数・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個であるかのように記述されています。

VBAで選択されているセル範囲をListObject・テーブルにする

本当は「XlListObjectHasHeaders」という引数名なのに、「HasHeaders」になっています。(但しこれはヘルプに記載されているHasHeadersのほうが、本来あるべき名前だと感じます...)

また、引数についての説明が間違っている部分もあります。

ヘルプを鵜呑みにすることなく、オブジェクトブラウザーをしっかり確認することをおすすめします。

[スポンサードリンク]

Home » エクセルマクロ・Excel VBAの使い方 » ListObjectオブジェクト » VBAで選択されているセル範囲をListObject・テーブルにする

「ListObjectオブジェクト」の記事一覧

検索


Copyright © インストラクターのネタ帳 All Rights Reserved.

.