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)
選択行・列の先頭・末尾セルを取得する
行範囲・列範囲内での位置を指定すれば、先頭セルや末尾セルを取得できます。
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