Vba 使用变量而不是字段名

Vba 使用变量而不是字段名,vba,ms-project,Vba,Ms Project,我在Microsoft project中有4个自定义字段。“乐观”、“最乐观”和“悲观”是任意3个持续时间字段的必填自定义名称。“CriticalCnt”也是20个数字字段中任意一个字段的必需自定义名称。我有一个例程,用于标识已自定义的Microsoft Project Fieldname,我已将其分配给变量。 在为每个任务查找这些字段的值时,我希望使用变量来标识字段 我在网上搜索了“ProjectSummaryTask”、“FieldConstantToFieldname”、“Fieldnam

我在Microsoft project中有4个自定义字段。“乐观”、“最乐观”和“悲观”是任意3个持续时间字段的必填自定义名称。“CriticalCnt”也是20个数字字段中任意一个字段的必需自定义名称。我有一个例程,用于标识已自定义的Microsoft Project Fieldname,我已将其分配给变量。 在为每个任务查找这些字段的值时,我希望使用变量来标识字段

我在网上搜索了
“ProjectSummaryTask”、“FieldConstantToFieldname”、“FieldnametoFieldConstant”
,但运气不好

我想做的是做以下事情:

Dim i as integer, fieldvalue as long, Tsk as Task
For I = 1 to ActiveProject.task.count do
    Fieldvalue =Activeproject.Task.CriticalCnt
    Debug.print ("Task=" & Task(i).id & " Task(i).CriticalCnt=" & 
    Task(i).CriticalCnt)
next i
此例程获取9位代码以标识CustomNamed字段。在本例中,Number4被分配了CustomName“CriticalCnt”。我不知道此例程中使用值3更新了什么

Sub GetFieldID()

Dim Projectfield As Long, ProjectFieldName As String, Message As String, i 
As Integer, tasks As tasks, t As Long, NT As Long, tmp As tasks, criticalCnt 
As String

Projectfield = FieldNameToFieldConstant("CriticalCnt", pjDuration)
Message = "ProjectfieldNumber = " & Projectfield & vbCrLf
MsgBox Message & ActiveProject.ProjectSummaryTask.GetField(Projectfield)
ActiveProject.ProjectSummaryTask.SetField FieldID:=Projectfield, Value:="3"
ProjectFieldName = FieldConstantToFieldName(Projectfield)
Message = "New Value for Field:" & ProjectFieldName & vbCrLf
MsgBox Message & ActiveProject.ProjectSummaryTask.GetField(Projectfield)
Set tasks = ActiveProject.tasks
NT = tasks.Count

Debug.Print ("NT=" & NT)
    For t = 1 To NT
        Debug.Print ("T=" & t)
        Debug.Print (".id = " & tasks(t).ID & " Value= " & Projectfield & _
        " tasks(t).Projectfield= " & Projectfield)
        Debug.Print ("Value=" & _
        ActiveProject.ProjectSummaryTask.GetField(Projectfield))
    Next t
End Sub

此函数用于查找名称为“CriticalCnt”的自定义数字字段,并使用它来标识三个自定义持续时间字段中的哪一个字段包含每个任务的正确持续时间,并输出每个任务的ID及其自定义持续时间。请注意,CriticalCnt包含自定义持续时间字段的字段ID(九位数)


注意:对于最终用户来说,似乎存储自定义持续时间字段的名称而不是字段ID会更好。在这种情况下,CriticalCnt将是一个文本字段,使用三项下拉列表进行自定义:“乐观”、“最乐观”和“悲观”。

此函数查找使用名称自定义的数字字段”CriticalCnt”,并使用它来标识三个自定义持续时间字段中的哪一个包含每个任务的正确持续时间,并输出每个任务的ID及其自定义持续时间。请注意,CriticalCnt包含自定义持续时间字段的字段ID(九位数)


注意:对于最终用户来说,似乎存储自定义持续时间字段的名称而不是字段ID会更好。在这种情况下,CriticalCnt将是一个文本字段,使用三项下拉列表进行自定义:“乐观”、“最乐观”和“悲观”“

CriticalCnt字段是否包含三个自定义持续时间字段之一的字段ID?(例如,Duration1=188743783,Duration5=188743956)CriticalCnt字段是否包含三个自定义持续时间字段之一的字段ID?(例如Duration1=188743783,Duration5=188743956)每个任务都使用所有3个持续时间字段和1个数字字段。3个持续时间字段可以是10个可用持续时间字段中的任意一个(CustomNamed=optimistic、MostLikely和悲观),也可以是20个可用数字字段中的任意一个(CustomNamed=CriticalCnt)。每个任务对这4个自定义命名字段中的每一个都有一个值。因此,对于任何一个任务,有4个字段用于保存其数据。。当我将fldCustomDur添加到Debug语句中时,会为Number字段打印出正确的值。当我运行例程查找“乐观”自定义名称(它是Duration1)时,我在fldCustomDur=CLng(tsk.Getfield(flsCriticalCnt))语句中得到一个类型不匹配的错误13。显示的fldCriticalCnt值为188743783,这对于持续时间1是正确的。持续时间并不总是整数,但也可能是小数天。我查找了CLng,它是一个舍入函数,用于将值转换为整数。我不确定这是否是我想要应用的功能,但这比我所做的要近得多。非常感谢。我希望您能够帮助我解决用于3个持续时间字段的GetField语句。我已经为此挣扎了两周。谢谢。持续时间字段的持续时间已转换为分钟,并保留为整数分钟。若要转换为天,请除以“/60/8”以获得持续时间。@dgr
GetField
函数返回一个字符串——它返回如UI所示的字段值,因此持续时间字段将按显示的方式返回,以及为什么将数字字段显式转换为数字是合适的。代码假定CriticalCnt字段包含有效的字段ID。如果它包含其他内容,请更新您的问题以反映实际包含的内容。每个任务使用所有3个持续时间字段和1个数字字段。3个持续时间字段可以是10个可用持续时间字段中的任意一个(CustomNamed=optimistic、MostLikely和悲观),也可以是20个可用数字字段中的任意一个(CustomNamed=CriticalCnt)。每个任务对这4个自定义命名字段中的每一个都有一个值。因此,对于任何一个任务,有4个字段用于保存其数据。。当我将fldCustomDur添加到Debug语句中时,会为Number字段打印出正确的值。当我运行例程查找“乐观”自定义名称(它是Duration1)时,我在fldCustomDur=CLng(tsk.Getfield(flsCriticalCnt))语句中得到一个类型不匹配的错误13。显示的fldCriticalCnt值为188743783,这对于持续时间1是正确的。持续时间并不总是整数,但也可能是小数天。我查找了CLng,它是一个舍入函数,用于将值转换为整数。我不确定这是否是我想要应用的功能,但这比我所做的要近得多。非常感谢。我希望您能够帮助我解决用于3个持续时间字段的GetField语句。我已经为此挣扎了两周。谢谢。持续时间字段的持续时间已转换为分钟,并保留为整数分钟。若要转换为天,请除以“/60/8”以获得持续时间。@dgr
GetField
函数返回一个字符串——它返回如UI所示的字段值,因此持续时间字段将按显示的方式返回,以及为什么将数字字段显式转换为数字是合适的。代码假定CriticalCnt字段包含有效的字段ID。如果它包含其他内容,请更新您的问题以反映实际包含的内容。
Sub GetCustomDuration()

' Schedule contains 4 customized fields--1 number field and 3 duration fields.
' The duration fields are named "Optimistic", "MostLikely" and "Pessimistic".
' Each task uses one of these fields and the selected one is identified in the
' customized number field called "CriticalCnt" which contains its field ID.


' find the field customized to contain the CriticalCnt data
Dim fldCriticalCnt As Long
fldCriticalCnt = Application.FieldNameToFieldConstant("CriticalCnt")

Dim tsk As Task
For Each tsk In ActiveProject.Tasks

    ' determine which of the three duration fields to use for this task
    Dim fldCustomDur As Long
    fldCustomDur = CLng(tsk.GetField(fldCriticalCnt))

    ' get the custom duration value
    Dim CustomDur As String
    CustomDur = tsk.GetField(fldCustomDur)

    Debug.Print "Task=" & tsk.ID & " CriticalCnt=" & CustomDur _
        & " (" & DurationValue(CustomDur) & " minutes)"
Next tsk

End Sub