テーブル機能は便利だ。VBAで読むにしてもデータの範囲が決まっているのがありがたい。
今までは「セルが空白になったら」とか 「UsedRangeの範囲外になったら」「印刷範囲外になったら」などの割合あいまいな終了条件を書くことが多かったからだ。テーブル機能を使う場合、列の内容を取得する場合、EnumやConstで定義した列番号でアクセスするのが一般的だ。
しかし、ACCESSやDBでよく使うような列名が使いたい。だってテーブル機能にはヘッダが合って列名があるじゃん!それ使えないんかい!ということで、以前も紹介した集計処理に使用できる Cursorクラスをテーブル用に作成した。
ブレイク処理対応テーブル読み込みクラス
'------------------------------------------------------------------------ ' ブレイク処理対応テーブル読み込みクラス '------------------------------------------------------------------------ Option Explicit Private LO As ListObject Private WS As Worksheet Private lngStartRow As Long Private lngRow As Long Private lngLastRow As Long '------------------------------------------------------ ' コンストラクタ '------------------------------------------------------ Public Sub Init(sheet As Worksheet) Set WS = sheet Set LO = WS.ListObjects(1) 'データの最初の行 lngStartRow = LO.DataBodyRange(1).Row 'データの最後の行 lngLastRow = LO.DataBodyRange(LO.DataBodyRange.Count).Row 'カレント行 lngRow = lngStartRow SkipHiddenRow End Sub '------------------------------------------------------ ' 終了判定 '------------------------------------------------------ Property Get Eof() As Boolean Eof = (lngRow > lngLastRow Or lngRow < 1) End Property '------------------------------------------------------ ' 最初の行に移動 '------------------------------------------------------ Sub MoveFirst() lngRow = lngStartRow SkipHiddenRow End Sub '------------------------------------------------------ ' 次行取得 '------------------------------------------------------ Sub MoveNext() lngRow = lngRow + 1 SkipHiddenRow End Sub '------------------------------------------------------ ' セル取得 '------------------------------------------------------ Property Get item(ByVal strCol As String) As Range Set item = WS.Cells(lngRow, LO.ListColumns(strCol).Range(1).Column) End Property '------------------------------------------------------ ' 非表示行をスキップ '------------------------------------------------------ Private Sub SkipHiddenRow() Do Until Not WS.Rows(lngRow).Hidden Or Me.Eof lngRow = lngRow + 1 Loop End Sub Private Sub Class_Terminate() Set LO = Nothing Set WS = Nothing End Sub
56行目の LO.ListColumns(strCol).Range(1).Column で列名から列番号に変換をかけている。
テーブルの指定がシートに1つ目固定になっているので適宜修正していただきたい。
非表示行をスキップするようになっているのでそっちも適宜で。
このようなテーブル機能で作成された表を読むこととする。
呼び出し側
Sub 呼び出し側() Dim tc As TableCursor Set tc = New TableCursor tc.Init Sheet1 Do Until tc.Eof Debug.Print tc.item("id").Value Debug.Print tc.item("ja").Value Debug.Print tc.item("en").Value tc.MoveNext Loop End Sub
どうだろうか。便利だと思うのだが。