1 次迭代后仅弹出 MsgBox 一次

Popup MsgBox only once after 1 iteration

我想让弹出窗口 window 只显示一次,而不管此代码中 tpred 的数量。 如何使用循环中的所有示例进入一个弹出窗口 window。现在我需要使用“是”按钮确认每个发现。

该宏用于MS Project 中触发任务并检查predesessor 是否完成。如果有一个以上的前任,则弹出窗口会与每个前任一起出现。

我在 VBA 方面很差,非常感谢您的帮助。

For Each T In ActiveSelection.Tasks

    reportingTeam = T.Text3
    RICEF = T.Text21
    UniqueID = T.UniqueID
    TaskName = T.Name
    completion = T.PercentComplete
    Duration = T.Duration / 60 & " hour/s"
    Start = DatePart("d", T.Start) & "." & DatePart("m", T.Start) & "." & DatePart("yyyy", T.Start)
    Finish = DatePart("d", T.Finish) & "." & DatePart("m", T.Finish) & "." & DatePart("yyyy", T.Finish)
    primaryres = T.Text4
    DataTeamResp = T.Text23
    recip2 = T.Text25
    reso = T.ResourceNames
    SPOC = T.Text10

    ' check if task isnt trigered?
    If completion > 0 Then
        MsgBox ("Task already triggered")
        Exit Sub
    End If

    For Each tpred In T.PredecessorTasks

        compl = compl & tpred.PercentComplete
        prednewid = prednewid & vbNewLine & tpred.UniqueID & "<br />"
        prednnazwa = prednnazwa & vbNewLine & tpred.Name & "<br />"
        predres = predres & vbNewLine & tpred.ResourceNames & "<br />"
        predSPOC = predSPOC & vbNewLine & tpred.Text10 & "<br />"
        predcomp = predcomp & vbNewLine & tpred.PercentComplete & " %" & "<br />"

        If compl <> 100 Then

            info = info & vbNewLine & tpred.UniqueID & " -> " & tpred.Name & " -> " & tpred.PercentComplete & " %" & " -> " & tpred.ResourceNames

            If MsgBox("For the:   " & T.UniqueID & "  ->  " & T.Name & vbNewLine & "following predecessors are not complete: " & vbNewLine & info & vbNewLine & vbNewLine & "Do you still want to trigger this task?", vbYesNo) = vbNo Then

                info = ""
                Exit Sub

            End If

        End If

    Next tpred

    T.PercentComplete = 5
    completion = T.PercentComplete / 100

Next T

您的解决方案是创建自定义表单而不是使用 built-in 消息框。

对您想要的内容做出一些假设:

  • 在任务顶部有一个简单的标签,上面写着一些东西 按照“以下任务的前身是 不完整。 Select您还想触发哪些任务。"
  • 使用 For Each tpred In T.PredecessorTasks 添加复选框 你的表格。这可以只是一个带有任务名称和相关前任作为标题的复选框。
  • 在此循环中,只添加满足 If compl <> 100 的任务 条件。
  • For Each tpred In T.PredecessorTasks 中构建表单后 循环,然后您必须显示表单并允许用户 check/select 每个任务。表单还必须有一个按钮,用户可以按下该按钮 确认他们的select离子。
  • 一旦用户确认了他们的 select离子,运行 通过每个 复选框和过程,但是你需要。用户可以 select none, 或者他们可能 select 全部。

我在这里使用了一些特定的术语 - 您的学习之旅的一部分是找到并使用这些术语来积累您的知识和经验。在这段旅程中,您将学到如下内容:

  • 如何制作自定义表单
  • 如何向 collection 或数组
  • 添加控件
  • 如何处理来自 collection 或数组
  • 的控件
  • 如何调整表单大小,使其在您最初不喜欢时看起来很整洁 知道窗体上将有多少个控件。

在其中一些步骤中,您可能会遇到编码挑战 - 如果您无法通过搜索(您最喜欢的搜索引擎或 Stack Exchange 上的此处)找到答案,请针对该特定问题打开一个新问题。这里有很多有经验的人愿意提供帮助。

添加一个变量来跟踪所有前置任务是否完整,并将不完整前置任务的消息框移到循环之外:

Dim AllPredsComplete As Boolean
AllPredsComplete = True

For Each tpred In T.PredecessorTasks

    prednewid = prednewid & vbNewLine & tpred.UniqueID & "<br />"
    prednnazwa = prednnazwa & vbNewLine & tpred.Name & "<br />"
    predres = predres & vbNewLine & tpred.ResourceNames & "<br />"
    predSPOC = predSPOC & vbNewLine & tpred.Text10 & "<br />"
    predcomp = predcomp & vbNewLine & tpred.PercentComplete & " %" & "<br />"

    If tpred.PercentComplete < 100 Then
        AllPredsComplete = False
        info = info & vbNewLine & tpred.UniqueID & " -> " & tpred.Name & " -> " _
            & tpred.PercentComplete & " %" & " -> " & tpred.ResourceNames
    End If

Next tpred

If Not AllPredsComplete Then

    If MsgBox("For the:   " & T.UniqueID & "  ->  " & T.Name & vbNewLine _
        & "following predecessors are not complete: " & vbNewLine & info & vbNewLine _
        & vbNewLine & "Do you still want to trigger this task?", vbYesNo) = vbNo Then

        info = ""
        Exit Sub

    End If

End If