MS Project VBA:创建任务子集对象时添加任务报错求助
问题分析与解决方案
你遇到的"Object variable or With block variable not set"错误,核心原因是TaskCollection对象未初始化。直接赋值TaskCollection = ActiveProject.Tasks时,ActiveProject.Tasks是Project内置的已实例化集合,所以可以正常运行;但在enExportList分支中,你需要手动创建集合实例来存放筛选后的任务,否则直接调用Add方法会触发对象未设置错误。
修复步骤:
- 在
enExportList分支开始处,先实例化一个新的Collection对象(如果TaskCollection是自定义集合类型,对应实例化该类型) - 遍历TaskArray时,将有效Task对象添加到已初始化的集合中
示例修复代码:
Sub select_data_subset(config As type_ExportConfig) Dim TaskCollection As Collection ' 若为自定义集合类型则替换为对应类型 Dim TaskArray() As String Dim counter As Integer Dim targetTask As Task Select Case config.ExportType Case enExportAll Set TaskCollection = ActiveProject.Tasks ' 直接引用内置集合 Case enExportList ' 关键:初始化集合对象 Set TaskCollection = New Collection ' 拆分TaskList为数组(假设你的拆分逻辑正确) TaskArray = Split(config.TaskList, ",") For counter = LBound(TaskArray) To UBound(TaskArray) Set targetTask = ActiveProject.Tasks(Val(TaskArray(counter))) ' 确认Task对象有效后再添加 If Not targetTask Is Nothing Then TaskCollection.Add targetTask End If Next counter End Select ' 后续处理TaskCollection的逻辑... End Sub
关键说明:
- 手动构建任务集合时,必须用
Set TaskCollection = New Collection(或自定义集合的实例化语句)创建集合实例,否则TaskCollection处于Nothing状态,调用Add方法必然报错。 - 保留
If Not targetTask Is Nothing判断,可避免因TaskList中存在无效ID导致的潜在错误。
内容的提问来源于stack exchange,提问作者Stgauss
相关产品推荐
相关产品推荐

