MS Project VBA:使用任务子集创建对象

问题描述 投票:0回答:1

我正在编写一个子程序来从活动项目的任务中获取数据。我想要做的是传递一个配置参数,并根据该参数将我的任务子集设置为 activeproject.tasks 中包含的内容,或者选择任务子集并将它们添加到我的新对象中。

我的代码如下所示:

Sub select_data_subset(config As type_ExportConfig)

Dim TaskTarget As Task
Dim TaskCollection As Tasks
Dim TaskArray As Variant
Dim counter As Integer

Select Case config.ExportType
    Case enExportAll
        Set TaskCollection = ActiveProject.Tasks
    Case enExportList
        TaskArray = Split(config.TaskList, Application.ListSeparator)
        For counter = LBound(TaskArray) To UBound(TaskArray)
            TaskCollection.Add ActiveProject.Tasks(Val(TaskArray(counter)))
        Next
End Select

End Sub

如果我的配置显示导出全部(enExportAll 是我在模块其他位置的枚举的一部分),我将创建一个与 activeproject.tasks 相同的新对象。如果我的配置提供了要导出的项目列表,我所做的就是从 activeproject.tasks 中提取每个项目并将其添加到我的任务对象中。然后我将该对象传递给另一个函数来进行数据处理。

我遇到的问题是我无法让 enExportList 案例工作。 enExportAll 工作完美。但另一方面,当我告诉我的 TaskCollection 对象添加对象时,它不喜欢它。我收到“对象变量或未设置块变量”。我已经检查了 activeproject.tasks(val(taskarray(counter))) 上的手表,它返回一个任务对象,所以我不知道为什么会收到错误。

vba ms-project
1个回答
0
投票

Tasks对象不是通用目的集合对象。它是 Project 对象和 ActiveSelection 对象的属性。 Add 方法在项目中创建一个新任务。

这里至少有两个选择:

  1. 不要使用 Tasks 对象,而是通过循环数组 config.TaskList 来循环任务。
  2. 通过为所需任务设置过滤器并执行 SelectAll 来使用 ActiveSelection 对象的 Tasks 属性。

在这种情况下,选项 1 可能是最好的。

当任务列表很容易过滤时,选项 2 才有意义——例如他们已经有一些共同点。否则,执行此操作的方法是使用“标志”字段,将所有任务设置为“假”,将所需任务的“标志”设置为“真”,然后设置一个过滤器来仅显示这些任务。

© www.soinside.com 2019 - 2024. All rights reserved.