【问题标题】:Using a variable instead of the fieldname使用变量而不是字段名
【发布时间】:2019-08-10 04:04:33
【问题描述】:

我在 Microsoft 项目中有 4 个自定义字段。 “Optimistic”、“MostLikely”和“Pessimistic”是任意 3 个 Duration 字段的自定义名称。 “CriticalCnt”也是任何 20 个数字字段的必需自定义名称。我有一个例程,它标识了我已分配给变量的已自定义的 Microsoft Project 字段名称。 当我为每个任务查找这些字段的值时,我想使用变量来识别字段。

我在网上搜索了"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 被分配了“CriticalCnt”的 CustomName。我不知道值 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 字段是否包含三个自定义 Duration 字段之一的字段 ID? (例如 Duration1 = 188743783,Duration5 = 188743956)

标签: vba ms-project


【解决方案1】:

此函数查找使用名称“CriticalCnt”自定义的数字字段,并使用它来识别三个自定义持续时间字段中的哪一个包含每个任务的正确持续时间,并输出每个任务的 ID 及其自定义持续时间。请注意,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

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

【讨论】:

  • 每个任务都使用所有 3 个持续时间字段和 1 个数字字段。 3 个持续时间字段可以是 10 个可用持续时间字段中的任何一个(customNameed= Optimisitic、MostLikely 和 Pessimistic)和 20 个可用数字字段中的任何一个(CustomNamed= CriticalCnt)。每个任务都有这 4 个自定义字段的值。
  • 因此,对于任何一项任务,都有 4 个字段用于保存其数据。当我将 fldCustomDur 添加到调试语句时,会为 Number 字段打印出正确的值。当我运行例程查找“乐观”自定义名称(它是 Duration1)时,我收到错误 13,因为 fldCustomDur=CLng(tsk.Getfield(flsCriticalCnt)) 语句上的类型不匹配。 fldCriticalCnt 显示的值为 188743783,这对于 Duration1 是正确的。持续时间并不总是整数,也可能是小数天。
  • 我查了CLng,它是一个将值转换为整数的舍入函数。我不确定这是我想要应用的功能,但这比我已经接近了。谢谢你。我希望您能够帮助我解决适用于 3 个持续时间字段的 GetField 语句。我已经为此苦苦挣扎了 2 周。谢谢。
  • 持续时间字段将其持续时间转换为分钟并保存为整数分钟。要转换为天数,除以“/60/8”即可得到持续时间。
  • @dgr GetField 函数返回一个字符串——它返回 UI 中显示的字段值,因此持续时间字段将按显示返回,以及为什么适合显式转换数字字段到一个号码。代码假定 CriticalCnt 字段包含有效的字段 ID。如果它包含其他内容,请更新您的问题以反映实际包含的内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-05
  • 2013-12-07
  • 1970-01-01
  • 2020-10-16
相关资源
最近更新 更多