【问题标题】:Find the tasks, where there is a certain date between start and finish查找任务,在开始和完成之间有特定日期
【发布时间】:2019-11-26 16:57:50
【问题描述】:

我正在尝试创建一个过滤器来查找在某一天运行的所有任务。

Task 1  10 März 2021 08:00  23 April 2021 08:00
Task 2  23 April 2021 08:00 26 Mai 2021 08:00
Task 3  20 Mai 2021 08:00   26 Mai 2021 08:00

搜索22.Mai 2021,应该返回甘特图中的Task 1和Task 2。

我有 4k+ 行,我只想查看这些任务。

可以是过滤器、函数或 VBA。

我无法通过过滤器获得它。

我熟悉 Excel VBA,但对 MS Project 不熟悉。

【问题讨论】:

    标签: vba ms-project


    【解决方案1】:

    查找在特定时间窗口内运行的任务的技巧是查找在窗口结束之前开始的任务 AND 在窗口的开始

    要查找在 2021 年 5 月 22 日运行的任务(例如,窗口是一天),请使用:Start < #22/5/2021# And Finish >= #21/5/2021#

    这将找到您想要的所有四种情况:

    1. 在窗口开始之前开始但在窗口期间完成的任务。
    2. 在窗口期间开始并在窗口结束后完成的任务。
    3. 在窗口期间开始和结束的任务。
    4. 在窗口开始之前开始并在窗口结束之后完成的任务。

    在这种情况下,您正在寻找一个单日的窗口,但此方法适用于较长的时间段 - 例如,查找在接下来的 90 天内运行的所有任务。

    另请参阅this related question,其中包含说明 1-4 的图形。

    【讨论】:

    • 对不起,回答迟了:这部分是我同时尝试的方式:用户定义的字段,公式为IIf(([Start]<=DateValue("21/5/202")) And ([End]>=DateValue("21/5/202"));"YES";"NO"),然后过滤为“是”。现在查看 vba 和您的链接。
    【解决方案2】:

    最后,我找到了解决这个问题的 3 种方法:

    1. VBA 和带有公式的自定义字段(最快): 感谢https://stackoverflow.com/a/48754562/3157070
    Sub DateFilter()
    
    Dim dateString As String
    Dim customFormula As String
    
    dateString = VBA.Interaction.InputBox("Date Input", "Date", "01/01/2020")
    
    
    customFormula = "IIf(([Start]<=DateValue(""" & dateString & """)) And ([End]>=DateValue(""" & dateString & """));""YES"";""NO"")"
    'Debug.Print customFormula
    
    'put it into custom field Text24
    CustomFieldSetFormula FieldID:=pjCustomTaskText24, Formula:=customFormula
    CustomFieldProperties FieldID:=pjCustomTaskText24, Attribute:=pjFieldAttributeFormula, SummaryCalc:=pjCalcNone, GraphicalIndicators:=False
    
    'Call custom filter
    FilterApply "YES"
    End Sub
    
    
    1. 带有公式的自定义字段,没有 vba:
    IIf(([Start]<=DateValue("7/14/2022")) And ([End]>=DateValue("7/14/2022"));"YES";"NO")
    
    1. 仅 VBA(我不知道为什么,但 4000 行需要几分钟...):

    感谢https://stackoverflow.com/a/59340705/3157070

    Sub DateFilter1()
    
    Dim T As Task
    Dim dateString As String
    
    Application.ScreenUpdating = False
    
    dateString = VBA.Interaction.InputBox("Date Input", "Date", "01/01/2020")
    
    For Each T In ActiveProject.Tasks
    
        If T.ScheduledStart <= dateString And T.ScheduledFinish >= dateString Then
    
            T.Text24 = "YES"
    
        Else
            T.Text24 = "NO"
    
        End If
    Next
    
    Application.ScreenUpdating = True
    FilterApply "YES"
    
    End Sub
    
    

    所有这些都解决了我的问题。 请分享您的改进。

    【讨论】:

      【解决方案3】:

      我看了一个 youtube,“疯狂的时间表”在下面添加了一行以省略空行:

      If Not (tsk Is Nothing) Then
        ...your IF-code...
      End if
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-08-07
        • 2022-12-10
        • 1970-01-01
        • 2015-03-14
        • 1970-01-01
        • 2013-02-05
        • 1970-01-01
        相关资源
        最近更新 更多