通过VBA将任务基线的开始和结束date从MS Project导入Excel

迎接所有人。

两个月前,我面临这个问题而没有解决。

我需要通过VBA将MS Project文件的基线开始和结束date转换为Excel,其中的一个algorithm就是这样的:

Set Prj = MSProject.Application Dim tarea As Task For Each tarea In Prj.ActiveProject.Tasks Select Case BL Case "BL0" StartD = CDate(Format(tarea.BaselineStart, "dd/mm/yyyy")) EndD = CDate(Format(tarea.BaselineFinish, "dd/mm/yyyy")) Case "BL1" StartD = CDate(Format(tarea.Baseline1Start, "dd/mm/yyyy")) EndD = CDate(Format(tarea.Baseline1Finish, "dd/mm/yyyy")) Case "BL2" StartD = CDate(Format(tarea.Baseline2Start, "dd/mm/yyyy")) EndD = CDate(Format(tarea.Baseline2Finish, "dd/mm/yyyy")) Case "BL3" StartD = CDate(Format(tarea.Baseline3Start, "dd/mm/yyyy")) EndD = CDate(Format(tarea.Baseline3Finish, "dd/mm/yyyy")) ... 

…直到BL10; 但是这个代码是极其低效的,并且当Project文件有两千个以上的任务行时需要更多的时间来导入date。

我试过解决scheme,我发现在下一个链接只写一行代码不同的基准https://social.msdn.microsoft.com/Forums/en-US/c964e627-079e-4296-9e5c-b7c82900d982/project-2010- standard-vba-export-to-excel-latest-baseline?forum = project2010custprog ,但结果有一点点不同,

 StartD = tarea.Baseline3Start --> StartD = 11/06/2014 07:00:00 am StartD = tarea.GetField(Application.FieldNameToFieldConstant("Baseline" & "3" & "Start", pjTask)) --> StartD = "wdn 11/06/14" 

与第二个指令vba没有得到完全的基准date,它获取的字段值,因为它显示在MS Project中,我不能将这个最后一个有效的date值结果转换成Excel

我也试着用Eval()和Evaluate()函数来编写一个通用代码来获得这个date

 BLstring = "tarea.Baseline" & "3" & "Start" Eval(BLstring) --> Error 2409 

这是可以理解的,因为这个命令不是原生的Excel函数

有什么办法可以得到这些date,而不使用Select case句子? 或者,可能是,有没有办法执行一个string作为MS Project的外部命令来获得这些date?

任何想法对我都会有很大的帮助。

编辑#0:最后,经过两个月的痛苦和痛苦,我find了解决办法。

安德鲁Eversight解决scheme不适合我,因为它需要从MSProject获取价值相同的方法…它寻找PjFiel枚举值( http://msdn.microsoft.com/en-us/library/ff867782(v=office。 15).aspx )它是188744184,要得到现场任务值:

 StartD = tarea.GetField(Application.FieldNameToFieldConstant("Baseline" & "3" & "Start", pjTask)) --> StartD = "wdn 11/06/14" 

这相当于

 StartD = Tsk.GetField(tsk_fld_BaselineStart) --> StartD = "wdn 11/06/14" 

对于这两种情况我通过pjFiel数字获得字段值

 FieldNameToFieldConstant("Baseline" & "3" & "Start", pjTask) = 188744184 tsk_fld_BaselineStart = pjTaskBaseline3Start = 188744184 

tarea.GetField指令做其余的和结果是一样的( "wdn 11/06/14" )

正如Rachel Hettinger所说,GetField方法总是返回一个string,由于某种原因,我不明白,CDate不会将此结果转换为有效的date值。

更改应用程序的默认date格式,正如Rachel Heetinger所说,在这一点上不可靠,我不想修改任何Project文件(在这个时候)。

我可以通过使用CallByName得到正确的值:

 BLstring = "Baseline" & "3" & "Start" For Each tarea In Prj.ActiveProject.Tasks StartD = CallByName(tarea, BLstring, VbGet) StartD_aux = tarea.Baseline3Start ... 

两条指令都给出相同的结果( 11/06/2014 07:00:00 am )

亲爱的安德鲁和瑞秋谢谢你的快速答复和准时的帮助。

当你有几千行时,性能永远不会太好,但我可以告诉你我做了什么,这是两者的结合。

首先,在开始循环任务之前,使用select case语句获取要使用的字段的名称:

 Dim tsk_fld_BaselineStart As PjField Dim tsk_fld_BaselineFinish As PjField Select Case str_BaselineDestFieldSet Case "Baseline" tsk_fld_BaselineStart = pjTaskBaselineStart tsk_fld_BaselineFinish = pjTaskBaselineFinish Case "Baseline1" tsk_fld_BaselineStart = pjTaskBaseline1Start tsk_fld_BaselineFinish = pjTaskBaseline1Finish Case "Baseline2" tsk_fld_BaselineStart = pjTaskBaseline2Start tsk_fld_BaselineFinish = pjTaskBaseline2Finish '... and so on End Select 

将这些字段捕获到variables中后,当您循环执行任务时,您不必执行巨大的select case语句,或者将string转换为字段值,因为它已经完成:

 Dim Tsk As Task Dim StartD As Date Dim EndD As Date For Each Tsk In ActiveProject.Tasks StartD = CDate(Tsk.GetField(tsk_fld_BaselineStart)) EndD = CDate(Tsk.GetField(tsk_fld_BaselineFinish)) Debug.Print "Task """ & Tsk.Name & """ starts " & StartD & " and ends " & EndD Next Tsk 

确保你明确地声明了StartD和EndD作为datevariables,因为这可能是你得到错误格式的原因。 这不是我以前遇到的问题。 更新11/11: Rachel在评论中澄清了这一点 – 上面的代码已经更新,在date中包含CDate函数。

如果这将在大型项目中经常使用,则可能需要实施一个进度条来向用户显示它在执行期间正在进行,因为即使提高了性能,也可能需要一些时间才能运行。