在我的项目中,我经常利用表和底层的 ListObjects 和 ListColumns。我喜欢它们,因为它们比裸 Range 对象更容易引用和更新。然而,我仍然没有找到一种健全且可维护的方法来处理由许多 ListColumns 组成的多个 ListObjects,并在项目中的所有 Worksheets 中被引用。
假设我有一个工作表(将(名称)属性设置为“WorksheetA”),其中包含带有少量列(称为 Column1、Column2、...、Column10)的表(称为 TableA)。
现在我想从另一个工作表的代码中引用其中一列。我可以这样做:
WorksheetA.ListObjects("TableA").ListColumns("Column7")
现在,直接使用字符串是一种不好的做法,因为它很难维护并且容易出错。
所以现在怎么办?
我可以创建专用模块来将我的字符串存储为常量。例如,名为“常量”的模块:
Public Const TABLE_A As String = "TableA"
Public Const COLUMN7 As String = "Column7"
然后我的参考可以转换为:
WorksheetA.ListObjects(Constants.TABLE_A).ListColumns(Constants.COLUMN7)
但是,这种解决方案有一些缺点:
- 常量模块会随着每个表和列的添加而增长得快得离谱。
- 引用本身会增长并变得不那么可读。
- 所有工作簿中与表格相关的所有常量都被扔进一个巨大的坑中。
我可以在 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
这个解决方案实际上解决了上面提到的所有三个问题,但它仍然有点“脏”和耗时,因为添加新表需要为每列创建一个函数。
你有更好的想法如何处理这个问题吗?
EDIT1(为清楚起见):假设用户不得更改任何名称(表名或列名)。如果用户这样做,那是他/她的责任。
EDIT2(为清楚起见):我仅将 Column7 用作列名作为示例。让我们假设列具有更有意义的名称。