VBA テーブルとListObjects

Written by

Editorial Team

Reviewed by

Steve Rynearson

Translated by

masahiro yoshida

Last updated on 5月 26, 2022

このチュートリアルでは、VBAで、テーブルとListObjectsを操作する方法を紹介します。

VBAのテーブルとListObjects

このチュートリアルでは、VBAを使用して表を作成し、表に簡単なソートを追加し、表をフィルタリングし、その他の表関連タスクを実行する方法について説明します。

VBAでテーブルを作成する

ListObjects.Addメソッドは、ワークシートの範囲に基づいて、ワークシートに表を追加することができます。Sheet1というワークシートに($A$1:$B$8)で示された範囲があります。

Range in a Worksheet in Excel

次のコードは、デフォルトの表スタイルを使用して、範囲 ($A$1:$B$8) に基づいて、Table1 という表をワークシートに追加するものです。

Sub CreateTableInExcel()

ActiveWorkbook.Sheets("Sheet1").ListObjects.Add(xlSrcRange, Range("$A$1:$B$8"), , xlYes).Name = _
"Table1"

End Sub

結果は次のようになります。

Table Created in VBA

VBAで表の一番右に列を追加する

テーブルの最後に列を追加するには、ListColumns.Addメソッドを使用することができます。下図のようなTable1というテーブルがあります。

Table Created in VBA

以下のコードでテーブルに列を追加すると、常にテーブルの一番右に列が追加されます。

Sub AddColumnToTheEndOfTheTable()

ActiveWorkbook.Sheets("Sheet1").ListObjects("Table1").ListColumns.Add

End Sub

結果は次のようになります。

Adding a Column to a Table in Excel Using VBA

VBAで表の一番下に行を追加する

ListRows.Addメソッドを使うと、テーブルの一番下に行を追加することができます。下図にTable1というテーブルを用意しました。

Table Created in VBA

以下のコードを実行すると、常にテーブルの一番下に行が追加されます。

Sub AddRowToTheBottomOfTheTable()

ActiveSheet.ListObjects("Table1").ListRows.Add

End Sub

結果は次のようになります。

Adding a Row to the Bottom of the Table

VBAで簡単なソートを追加する

VBAでテーブルをソートすることができます。下図のTable1というテーブルがありますが、VBAでSales 列を低いものから高いものへソートすることができます。

Table Created in VBA

以下のコードでは、Sales列を昇順にソートしています。

Sub SimpleSortOnTheTable()

Range("Table1[[#Headers],[Sales]]").Select
ActiveWorkbook.Worksheets("Sheet1").ListObjects("Table1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Sheet1").ListObjects("Table1").Sort.SortFields.Add _
Key:=Range("Table1[[#All],[Sales]]"), SortOn:=xlSortOnValues, Order:= _
xlAscending, DataOption:=xlSortNormal

With ActiveWorkbook.Worksheets("Sheet1").ListObjects("Table1").Sort

.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply

End With

End Sub

結果は次のようになります。

Sorting a Table Using VBA

VBAで表をフィルタする

VBAを使用してExcelテーブルをフィルタリングすることもできます。Table1という表があり、1500以上の売上だけを表示するようにフィルタリングしてみましょう。

Table Created in VBA

Autofilterメソッドには5つのオプションのパラメータがあります。2列目であるSales列をフィルタリングしたいので、Fieldを2に設定し、日付と数値に使用されるxlAnd演算子パラメータを使用します。

Sub SimpleFilter()

 ActiveWorkbook.Sheets("Sheet1").ListObjects("Table1").Range.AutoFilter Field:=2, Criteria1:= _
 ">1500", Operator:=xlAnd

End Sub

結果は次のようになります。

Add a Filter to a Table

VBAのShowAllDataメソッドでフィルタをクリアする

フィルタを解除するには、WorksheetクラスのShowAllDataメソッドにアクセスすればOKです。表のフィルタ(複数可)をクリアするには、まず表のセルを選択する必要がありますが、これはVBAで行うことができます。 ShowAllDataメソッドは、ワークシートにフィルターが適用されているかどうかをチェックしておかないと、エラーが発生してしまいます。次のコードは、これを解決する方法を示しています。

Sub ClearingTheFilter()

Range("Table1[[#Headers],[Sales]]").Select
If ActiveWorkbook.Worksheets("Sheet1").FilterMode = True Then
ActiveSheet.ShowAllData

End If

End Sub

Excelの表からすべてのフィルタを解除する

ListObjectsクラスのShowAllDataメソッドにアクセスするには、まずテーブルのセルを選択する必要があります。次のコードで、これを行うことができます。

Sub ClearAllTableFilters()
ActiveWorkbook.Worksheets("Sheet1").ListObjects("Table1").AutoFilter.ShowAllData
End Sub

VBAで行を削除する

ListRows.Deleteメソッドを使うと、テーブルのデータベース内の行を削除することができます。どの行を削除するかは、行番号で指定します。以下のようなTable1というテーブルがあるとします。

Table Created in VBA

このテーブルのデータボディの2行目を削除したい場合、次のようなコードで可能になります。

Sub DeleteARow()

ActiveWorkbook.Worksheets("Sheet1").ListObjects("Table1").ListRows(2).Delete

End Sub

結果は次のようになります。

Deleting a Row Using VBA

VBAで列を削除する

ListColumns.Deleteメソッドを使うと、テーブルから列を削除することができます。下図のTable1というテーブルがあります。

Table Created in VBA

最初の列を削除するには、次のコードを使用します。

Sub DeleteAColumn()

ActiveWorkbook.Worksheets("Sheet1").ListObjects("Table1").ListColumns(1).Delete

End Sub

結果は次のようになります。

Delete a Column with VBA

VBAでテーブルを通常の範囲に戻す

VBAを使用して、テーブルを通常の範囲に戻すこともできます。次のコードは、Table1を通常の範囲に戻します。

Sub ConvertingATableBackToANormalRange()

ActiveWorkbook.Sheets("Sheet1").ListObjects("Table1").Unlist

End Sub

VBAでワークシート内の全テーブルに帯付き列と書式を追加する

ListObjectsコレクションを使って、ワークシート内のすべてのテーブルにアクセスすることができます。以下のシートでは、2つの表がありますが、VBAを使用して、一度に両方の表に帯状の列を追加し、両方の表のデータセクションのフォントを太字に変更したいと思います。

Two Tables in Excel on the Same Worksheet

Sub AddingBandedColumns()

Dim tbl As ListObject
Dim sht As Worksheet

Set sht = ThisWorkbook.ActiveSheet

For Each tbl In sht.ListObjects
tbl.ShowTableStyleColumnStripes = True
tbl.DataBodyRange.Font.Bold = True
Next tbl

End Sub

結果は次のようになります。

Adding Banded Columns And Changing The Font of The Table to Bold

VBAのAccessでDoCmd.RunSQLを使ってテーブルを作成する

VBAでAccessにテーブルを作成する主な方法の1つは、DoCmd.RunSQLメソッドを使用して、SQLステートメントでアクションクエリを実行することです。 サンプルフォームにボタンがあり、ボタンをクリックすると、ProductsTableというテーブルが作成され、ProductsIDという主キーフィールドとSalesというフィールドの2つのフィールドまたは列が作成されます。

Create the Products Table in Access

このテーブルを作成するために、次のコードを使用します。

Private Sub cmdCreateProductsTable_Click()

DoCmd.RunSQL "CREATE TABLE ProductsTable " _
& "(ProductID INTEGER PRIMARY KEY, Sales Integer);"

End Sub

結果は次のようになります。

Create a Table in Access VBA

VBAを使ってccessのテーブルをフィルタする

AccessでもDoCmd.ApplyFilterメソッドを使えば、テーブルにフィルタをかけることができます。AccessでProductsTableという下図のような簡単なテーブルを作成しました。 フォームでこのボタンを押すと、1500以上の売上だけが表示されるようにしたいと思います。

Filtering a Table in Access

そこで、次のようなコードでこれを実現します。

Private Sub cmdFilter_Click()

DoCmd.OpenTable "ProductsTable"

DoCmd.ApplyFilter , "[Sales]>1500 "

End Sub

結果は次のようになります。

Filtered Access Table

vba-free-addin

VBA Code Examples Add-in

Easily access all of the code examples found on our site.

Simply navigate to the menu, click, and the code will be inserted directly into your module. .xlam add-in.

(No installation required!)

Free Download

Return to VBA Code Examples