ListObjectで選択しているセルの行・列位置を取得する

ListObject(テーブル)上で選択しているセルの行・列位置を求めます。また、選択セルの行の先頭・末尾や、列の先頭・末尾を求める方法も紹介します。

テーブル内での行・列位置(インデックス)を取得する

ListObjectの操作では、テーブル内での行・列位置(インデックス)を指定します。しかし、選択セルについてテーブル内での位置を返すプロパティはないので、次のように求めます。

Dim LO As ListObject
Dim idxLR As Long  '行インデックス
Dim idxLC As Long  '列インデックス

Set LO = ActiveCell.ListObject
If LO Is Nothing Then Exit Sub

idxLR = ActiveCell.Row - LO.DataBodyRange(1).Row + 1
idxLC = ActiveCell.Column - LO.DataBodyRange(1).Column + 1

'見出し行、集計行の選択チェック
If idxLR = 0 Or LO.ListRows.Count < idxLR Then Exit Sub
ActiveCell.ListObject でテーブルを取得

選択中セルが属するテーブルを取得します。テーブル外を選択している場合、エラーにはなりませんがNothingのままになるので、選択が有効かの判定もできます。

LO.DataBodyRange(1) の位置からテーブル内位置を取得

LO.DataBodyRange(1)はテーブル(見出し行を除く)の左上端セルです。シート上でのこの位置とアクティブセルの位置の差分から、テーブル内での位置が求められます。

行インデックス = テーブル左上端の行番号 - アクティブセルの行番号 + 1
列インデックス = テーブル左上端の列番号 - アクティブセルの列番号 + 1
行インデックスのチェック

行インデックスが0の場合はテーブルの見出し行内を選択しています。LO.ListRows.Countより大きい場合は集計行内を選択しています。

これから行う処理によってはエラーになるため、必要に応じてチェックを入れます。

テーブルの行・列を取得する

テーブルの部位としての行・列を処理する場合(追加や削除など)は、インデックスを指定してListRowオブジェクトまたはListColumnオブジェクトを使います。

Dim LR As ListRow
Dim LC As ListColumn

Set LR = LO.ListRows(idxLR)
Set LC = LO.ListColumns(idxLC)

行・列範囲を取得する

行・列の内容を処理する場合は、Rangeオブジェクトを使います。

Dim rngR As Range, rngC as Range

Set rngR = LO.DataBodyRange.Rows(idxLR)
Set rngC = LO.DataBodyRange.Columns(idxLC)
ListObject.ListColumns(1).Range は ListObject.DataBodyRange.Columns(1) と同じ?
同じ場合も違う場合もあります。
前者は見出し(HeaderRowRange)や集計(TotalsRowRange)を含みますが、後者は含みません。言い換えると、見出し行や集計行の有無で前者の内容は変わりますが、後者は変わりません。見出し行や集計行の有無は切り替え可能なものなので、それに影響されないようにしておくほうが無難です。

選択行・列の先頭・末尾セルを取得する

行範囲・列範囲内での位置を指定すれば、先頭セルや末尾セルを取得できます。

Dim aRng As Range

With LO.DataBodyRange.Rows(idxLR)
  '左端セル
  Set aRng = .Cells(1)
  '右端セル
  Set aRng = .Cells(LO.ListColumns.Count)
End With
With LO.DataBodyRange.Columns(idxLC)
  '上端セル
  Set aRng = .Cells(1)
  '下端セル
  Set aRng = .Cells(LO.ListRows.Count)
End With

 

タイトルとURLをコピーしました