创建具有可变列数的表

时间:2018-06-13 16:57:55

标签: excel vba excel-vba

我希望得到一些想法让我朝着正确的方向前进。我有一个自定义类,它根据条件存储表中的数据。原始数据(由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

最终用户希望能够选择他们想要构建新表的列。但是表的典型类将使用行作为对象,并将列标题作为属性。在直到运行时才知道列时,如何使用类属性构建表?我希望这是有道理的。

注意:我不是要求代码而是要求建议。还有其他人有这个要求吗?如果是这样,你是怎么做到的?也欢迎一个例子。

1 个答案:

答案 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

为了填充字典,任何数据库都可以确定表的列名,只需谷歌“以编程方式获取列名”来查找一些示例代码。