如何根据MS项目VBA中的自定义数字值检索自定义文本(分配)字段值?



我可以通过硬编码获得我想要的值,例如赋值。Text8,但不能得到它的工作,当我创建一个变量,并试图包括它,如:"ifI= 8,然后告诉我赋值是什么。我文本";可能是语法问题,但我不知道。

Sub TransferAsgnTextX_to_AsgnTCC_viaNumberedMeans()
Dim t As Task
Dim a As Assignment
Dim nr, i As Integer
i = 1
For Each t In ActiveProject.Tasks
nr = ActiveProject.Tasks(i).Number1
If nr > 0 Then
For Each a In t.Assignments
Select Case a.ResourceName
Case "Productivity"
a.Units = "a.Text" & nr
End Select
Next a
End If
i = i + 1
Next t
End Sub
上面的代码给出了一个运行时错误1101,但是如果我硬编码说a。Units = a.Text8则代码运行。但是我想找到基于(单独的)自定义数字的自定义文本字段。

MS Project API没有一个很好的方法来做你想做的分配(它为任务和资源),所以我建议创建一个函数,你可以随时调用你想要获得的数据:

Public Function GetAssignmentTextInfo(a As Assignment, fieldNumber As Integer) As String
If fieldNumber = 1 Then
GetAssignmentTextInfo = a.Text1
End If
If fieldNumber = 2 Then
GetAssignmentTextInfo = a.Text2
End If
If fieldNumber = 3 Then
GetAssignmentTextInfo = a.Text3
End If
If fieldNumber = 4 Then
GetAssignmentTextInfo = a.Text4
End If
'... so on through 30 (for the 30 text fields)

现在你可以在代码块中调用它:

Sub TransferAsgnTextX_to_AsgnTCC_viaNumberedMeans()
Dim t As Task
Dim a As Assignment
Dim nr, i As Integer
i = 1

For Each t In ActiveProject.Tasks
nr = ActiveProject.Tasks(i).Number1
If nr > 0 Then
For Each a In t.Assignments
Select Case a.ResourceName
Case "Productivity"
'call our function instead of hard coding
a.Units = GetAssignmentTextInfo(a, i) & nr
End Select
Next a
End If
i = i + 1
Next t

End Sub

作为增强该方法的额外好处,您可以创建一个名为"FieldType"或者类似的东西,并将其作为GetAssignmentTextInfo函数的参数,以便它可以从其他字段检索数据,而不仅仅是Text1-30。

Public Enum FieldType
Text = 1
Number = 2
Flag = 3
OutlineCode = 4
'etc...
End Enum
Public Function GetAssignmentInfo(a As Assignment, fieldNumber As Integer, fType As FieldType) As String

If fType = FieldType.Text Then
If fieldNumber = 1 Then
GetAssignmentTextInfo = a.Text1
End If

If fieldNumber = 2 Then
GetAssignmentTextInfo = a.Text2
End If

'... so on through 30 (for the 30 text fields)
End If

If fType = FieldType.Number Then
If fieldNumber = 1 Then
GetAssignmentTextInfo = CStr(a.Number1)
End If

If fieldNumber = 2 Then
GetAssignmentTextInfo = CStr(a.Number2)
End If

'... so on through 20 (for the 20 number fields)
End If

Stephen,如果我按照你想做的去做,你想要改变"生产力"的分配单元。将资源转换为Task Number1字段中的任何值。如果是这样,那就这样做吧。a.Units = nr

对于assign对象,除了直接访问属性之外,没有其他方法可以获取它们。因此,解决方案是使用Select Case语句。

一般情况下,如果将值存储在任务级别,则会简单得多,因为task对象提供了GetField方法,该方法接受字段ID参数并返回变量字段值。请参阅我无法访问MS项目VSTO插件中的列,以及FieldNameToFieldConstant是否可以与TaskDependency对象一起使用。

最新更新