私のプロジェクトでは、テーブルとその下にある ListObjects および ListColumns をよく利用します。そのままの Range オブジェクトよりも参照と更新が簡単なので、私はそれらを気に入っています。それでも、多くの ListColumns で構成され、プロジェクト内のすべてのワークシートで参照される複数の ListObjects を処理する、適切で保守可能な方法をまだ見つけていません。
少数の列 (Column1、Column2、...、Column10) を持つテーブル (TableA) を含むワークシート ((Name) プロパティを "WorksheetA" に設定) があるとします。
ここで、別のワークシートのコードから列の 1 つを参照したいと考えています。私は次のようにそれを行うことができます:
WorksheetA.ListObjects("TableA").ListColumns("Column7")
メンテナンスが難しく、エラーが発生しやすいため、文字列を直接使用することはお勧めできません。
ならどうしよう?
文字列を定数として格納するための専用モジュールを作成できます。たとえば、「Constants」というモジュール:
Public Const TABLE_A As String = "TableA"
Public Const COLUMN7 As String = "Column7"
次に、私の参照は次のように変換できます。
WorksheetA.ListObjects(Constants.TABLE_A).ListColumns(Constants.COLUMN7)
ただし、このソリューションにはいくつかの欠点があります。
- 定数モジュールは、テーブルと列が追加されるたびに途方もなく速く成長します。
- 参照自体が大きくなり、読みにくくなります。
- すべてのワークブックのテーブルに関連するすべての定数は、1 つの巨大な穴に投げ込まれます。
WorksheetA 内に定数を格納し、次のようなパブリック関数を介して使用できるようにすることができます。
Private Const TABLE_A As String = "TableA"
Private Const COLUMN7 As String = "Column7"
Public Function GetTableAName() As String
GetTableAName = TABLE_A
End Function
Public Function GetTableA() As ListObject
Set GetTableA = WorksheetA.ListObjects(TABLE_A)
End Function
Public Function GetTableAColumn7() As ListColumn
Set GetTableAColumn7 = GetTableA().ListColumns(COLUMN7)
End Function
このソリューションは実際には上記の 3 つの問題をすべて解決しますが、新しいテーブルを追加すると各列に関数を作成する必要があるため、まだ少し「汚い」上に時間がかかります。
この問題に対処する方法について、より良い考えがありますか?
EDIT1 (わかりやすくするため):ユーザーが名前を変更してはならない (テーブル名も列名も) と仮定しましょう。ユーザーがそうした場合、それはユーザーの責任です。
EDIT2 (わかりやすくするため):例として、Column7 を列名として使用しました。列にもっと意味のある名前があると仮定しましょう。