如何在MS Project 2010 VBA中检测用户是否删除了值?
解决MS Project 2010中Del键清空字段后的VBA检测问题
这个坑我之前帮团队踩过!MS Project这里的机制确实有点反直觉——用Del键删掉任务的Finish值后,界面看着是空的,但直接读activeproject.Tasks(439).finish居然还能拿到旧值,这是因为Del键并没有真正删除底层存储的字段值,只是在UI层面给它打了个“已清除”的标记。
要准确检测用户是否用Del键清空了字段,有两个靠谱的VBA方法:
方法1:用IsFieldCleared方法(最直接准确)
MS Project专门提供了IsFieldCleared方法来识别这种用户手动清空的场景,它会直接返回True/False告诉你字段是否被Del键之类的操作清空了。
示例代码:
Sub CheckFinishFieldStatus() Dim targetTask As Task ' 替换成你要检查的任务 Set targetTask = ActiveProject.Tasks(439) ' 检查Finish字段是否被用户清空 If targetTask.IsFieldCleared(pjTaskFinish) Then Debug.Print "Finish值已被用户通过Del键删除" ' 这里可以执行你需要的后续逻辑 Else Debug.Print "Finish值有效,当前值为: " & targetTask.Finish End If End Sub
这个方法在MS Project 2010及以上版本都支持,完全适配你的场景。
方法2:用GetField读取界面显示值
如果出于某些原因不想用IsFieldCleared,也可以通过GetField方法读取字段在界面上的显示内容——用户清空后,这个方法会返回空字符串,而直接读属性拿到的是旧值。
示例代码:
Sub CheckDisplayedFinishValue() Dim targetTask As Task Set targetTask = ActiveProject.Tasks(439) Dim displayedValue As String ' 读取界面上显示的Finish值 displayedValue = targetTask.GetField(pjTaskFinish) If displayedValue = "" Then Debug.Print "界面上的Finish值已被清空" ElseIf IsDate(displayedValue) Then Debug.Print "Finish值为: " & CDate(displayedValue) Else Debug.Print "Finish值从未被设置过" End If End Sub
两种方法里,更推荐第一种,因为IsFieldCleared是官方专门针对这种场景设计的,逻辑更清晰,也不容易出错。
内容的提问来源于stack exchange,提问作者Greg Viers
相关产品推荐
相关产品推荐

