我希望得到一些想法让我朝着正确的方向前进。我有一个自定义类,它根据条件存储表中的数据。原始数据(由100多列组成,在10-1000行之间变化)位于工作表上。我的代码执行以下操作:
1 - 从自定义类中创建对象
2 - 为对象的属性添加值
3 - 将对象添加到集合中 4 - 将集合返回给控制器,控制器将集合发送到视图以构建表
以下内容将从原始数据构建一个列范围集合,至少:
Private mcolColumnAddresses As Collection
Private Sub Class_Initialize()
Set mcolColumnAddresses = New Collection
Dim vHeader As Variant
For Each vHeader In mwksReport.Range(mwksReport.Cells(1, 1), mwksReport.Cells(1, mlLastColumn))
mcolColumnAddresses.Add vHeader.Offset(1, 0).Resize(mlLastRow - 1), vHeader.value
Next vHeader
End Sub
最终用户希望能够选择他们想要构建新表的列。但是表的典型类将使用行作为对象,并将列标题作为属性。在直到运行时才知道列时,如何使用类属性构建表?我希望这是有道理的。
注意:我不是要求代码而是要求建议。还有其他人有这个要求吗?如果是这样,你是怎么做到的?也欢迎一个例子。
答案 0 :(得分:1)
但是表的典型类将使用行作为对象,并将列标题作为属性
如果您的表实际上有超过100列,或者列名称只是运行时,那么您可能应该采用不同的方法。每行一个对象很好,但是您的类可以提供一种方法来按名称访问所有列值。在VBA语法中:
Function GetValue(byval columnName as string) as Variant
'...
如你所见,你必须在这里牺牲一些类型的安全性,但这通常是一个很小的代价,以合理的方式解决这个问题。
在内部,您的对象可以将值存储在某些Dictionary
(通过MS Scripting Runtime可用的VBA中)中,并由列名称索引。这导致
Function GetValue(byval columnName as string) as Variant
if valueDict.ContainsKey(columnName) then
GetValue = valueDict(columnName)
else
'... add some error handling here
end if
End Function
为了填充字典,任何数据库都可以确定表的列名,只需谷歌“以编程方式获取列名”来查找一些示例代码。