Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 创建列数可变的表_Vba_Excel - Fatal编程技术网

Vba 创建列数可变的表

Vba 创建列数可变的表,vba,excel,Vba,Excel,我希望能有一些想法来推动我朝着正确的方向前进。我有一个自定义类,它根据条件存储表中的数据。原始数据(由100多列组成,在10-1000行之间变化)位于工作表上。我的代码执行以下操作: 1-从自定义类创建对象 2-向对象的属性添加值 3-将对象添加到集合中 4-将集合返回给控制器,控制器将其发送到视图以构建表 以下内容将至少从原始数据构建列范围集合: Private mcolColumnAddresses As Collection Private Sub Class_Initialize()

我希望能有一些想法来推动我朝着正确的方向前进。我有一个自定义类,它根据条件存储表中的数据。原始数据(由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
最终用户希望能够选择用于构建新表的列。但表的典型类将行用作对象,列标题用作属性。在运行时才知道列的情况下,如何使用类属性构建表?我希望这是有道理的

注意:我不是要代码,而是要建议。还有其他人有这个要求吗?如果是,你是如何处理的?一个例子也是值得欢迎的

但表的典型类将行用作对象,列标题用作属性

如果表中的列确实超过100列,或者列名仅在运行时已知,则可能应该采用不同的方法。每行一个对象是可以的,但是您的类可以提供一个方法来通过名称访问所有列值。在VBA语法中:

  Function GetValue(byval columnName as string) as Variant
  '...
正如您所看到的,您必须在这里牺牲一些类型安全性,但这通常是以合理的方式解决此问题的一个小代价

在内部,对象可以将值存储在某些
字典中(在VBA中,可通过MS脚本运行时获得),并按列名进行索引。这导致了

  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

为了填充字典,任何数据库都有可能确定表的列名,只需在google上搜索“以编程方式获取列名”即可找到一些示例代码。

我认为您必须更一般地针对您的类。用于“属性”的类,如名称/值对,您的泛型“行”类可以实例化其is列和填充的次数。或者你的“Row”类可以将属性(列标题和值)存储在字典中?白板设计问题通常更适合。在发布之前,请查看他们的主题页上的/help/,确保它在主题页上。@MathieuGuindon哦!我不知道。布莱恩:我想你的问题可以在这里讨论,也可以在SE上讨论,但既然你已经删除了你的交叉问题,就让它在这里吧。。。。首先您写了“我有一个自定义类”,然后写了“一个表的典型类将使用一行作为对象,列标题作为属性”-那么到目前为止您实际实现了什么,以及您的白板上只有什么?谢谢您的回答。实际上我已经有了这样的东西。My
model
class initialize事件使用标题值作为键来填充范围集合。但是每个最终用户可能会选择不同的列来打印表。换句话说,他们从原始数据中选择任何列并创建不同的表。但这不是复制/粘贴。新表的数据行基于原始数据的
CountIfs()
Index(Match())
标准。因此,如果在运行时不知道列,我不知道如何使用带有标题属性的
Agenda
类。@Brian:我不知道您的问题到底出在哪里。你的程序从你的用户那里得到一个列名列表作为字符串(精确到什么程度并不重要)。然后,您可以使用类似上面的函数从字典中查询值。为什么您坚持使用“带有标题属性的议程类”?听起来不像我的建议。我想我明白你现在说的话了。完全去掉
Agenda
类,并使用collection/Dictionary对象获取VBA函数的列地址。我想这回答了我的主要问题。