Gilja's logs of the struggles with programming

シン母駆け出しエンジニアの奮闘記

Excel VBAエキスパート試験スタンダード学習_2

おはようございます

子どもの習い事の試合が続き、久しぶりの週末学習です

今日は学習が足りていなかったテーブルについてまとめてから問題にチャレンジします

テーブル値操作には大きく分けて3通りある

うろ覚えでそんなことは覚えているのですが、

具体的にコーディングしたこともないのでやってみよう!




テーブル操作

テーブの特定

ListObjectオブジェクト

方法 基本文法
テーブルのセルから特定 テーブル内のセル.ListObject
テーブルが存在するセルから特定 対象のシート.ListObjects(インデックス/テーブル名)
Rangeとテーブルの名前で特定 Range(テーブル名)

☆Range(テーブル名)の書き方では、できない操作もある

Range("A1").ListObject

特定
'タイトル行を含むテーブル全体
Range("A1").ListObject.Range
'タイトル行を含まない
Range("A1").ListObject.DataBodyRange
'タイトル行
Range("A1").ListObject.HeaderRowRange

'列
Range("A1").ListObject.ListColumns(インデックス/項目名)
Range("A1").ListObject.ListColumns(1)
Range("A1").ListObject.ListColumns("商品名")
Range("A1").ListObject.ListColumns(1).Range 'セル全体
Range("A1").ListObject.ListColumns(1).DataBodyRange 'タイトル行含まないセル全体
Range("A1").ListObject.ListColumns(1).HeaderRowRange 'タイトル行

'行
Range("A1").ListObject.ListRows(インデックス) 'インデックスにタイトル行は含まない
Range("A1").ListObject.ListRows(1).Range 'セル全体
操作
'データを探す=AutoFilter
Range("A1").ListObject.Range.AutoFilter 2, "みかん"
Range("A1").ListObject.DataBodyRange.AutoFilter 2, "みかん"
'ex.絞り込んだ範囲をコピー(アクティブセルがテーブル外だと不具合有り)
With Range("A1").ListObject.Range 'タイトル行含む
    .AutoFilter 2, "みかん"
    .Copy Sheets("Sheet2").Range("A1")
End With
With Range("A1").ListObject.DataBodyRange 'タイトル行以外
    .AutoFilter 2, "みかん"
    .Copy Sheets("Sheet2").Range("A1")
End With
'ex.絞り込んだ特定列のコピー
With Range("A1").ListObject
    Range.AutoFilter 2, "みかん"
    .ListColumns(1).Range.Copy Sheets("Sheet2").Range("A1")
    .ListColumns(3).Range.Copy Sheets("Sheet2").Range("B1")
End With
'ex.絞り込んだ特定列に書式設定
With Range("A1").ListObject
    .Range.AutoFilter 2, "みかん"
    .ListColumns(2).DataBodyRange.Font.Bold = True
    .Range.AutoFilter 2
End With
'ex.絞り込んだ行を削除
With Range("A1").ListObject.DataBodyRange
    .AutoFilter 2, "みかん"
    .EntireRow.Delete
    .AutoFilter 2
End With
挿入
'テーブルの右隣に列を挿入
Range("A1").ListObject.ListColumns.Add
'ex.追加した列に数値列の値の2倍の値を入力する
Range("A1").ListObject.ListColumns.Add
n = Range("A1").ListObject.ListColumns.Count
Range("A1").ListObject.ListColumns(n).DataBodyRange = "=[@数値]*2"

Range("テーブル1")

特定

構造化参照を使用

テーブル名[[特殊項目指定子], [列指定子]]

特殊項目指定子

  • [#All] #すべて

  • [#Data] #データ

  • [#Headers] #見出し

  • [#Totals] #集計

'タイトル行を含むテーブル全体
Range("テーブル1[#All]")
'タイトル行を含まない
Range("テーブル1")
Range("テーブル1[#Data]")

'列
Range("テーブル1[[#All], [商品名]]") 'セル全体
Range("テーブル1[商品名]") 'タイトル行含まないセル全体
Range("テーブル1[[#Data], [商品名]]")

'行選択不可
操作
'データを探す=AutoFilter
Range("テーブル1").AutoFilter 2, "みかん"
'ex.絞り込んだ範囲をコピー(アクティブセルがテーブル外だと不具合有り)
Range("テーブル1[#All]").Copy Sheets("Sheet2").Range("A1") 'タイトル行含む
Range("テーブル1[#Data]").Copy Sheets("Sheet2").Range("A1") 'データ行のみ
'ex.絞り込んだ行を削除
Range("テーブル1[#Data]").EntireRow.Delete
挿入
'列を挿入=右隣にデータを入力すれば、Excelが自動でテーブル範囲を広げることを利用

'ex.追加した列に数値列の値の2倍の値を入力する
Range("テーブル1[[#Data], [数値]]").Offset(0, 1) = "=[@数値]*2"