1次迭代后仅弹出一次MsgBox

时间:2019-01-03 19:16:49

标签: vba loops ms-project msgbox

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

该宏在MS Project中用于触发任务并检查前任者是否完整。如果有多个前任者,则每个前任者都会显示一个弹出窗口。

我在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

2 个答案:

答案 0 :(得分:0)

添加变量以跟踪所有前辈是否已完成,并为不完整的前辈移动消息框 外部

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

答案 1 :(得分:-1)

您的解决方案是创建自定义表单,而不是使用内置消息框。

对您想要的内容进行一些假设:

  • 在任务顶部有一个简单的标签,上面写着一些内容 遵循“以下任务的前身是 不完整。选择您仍要触发的任务。”
  • 使用For Each tpred In T.PredecessorTasks将复选框添加到 您的表格。可以只是一个带有任务名称和相关前任标题的复选框。
  • 在此循环中,仅添加满足If compl <> 100的任务 条件。
  • For Each tpred In T.PredecessorTasks中建立表单后 循环,然后必须显示该表格并允许用户检查/选择 每个任务。该表单还必须具有一个用户可以按以按下的按钮 确认他们的选择。
  • 用户确认选择后,请遍历每个 复选框和过程,但是您需要这样做。用户可以不选择任何内容, 或者他们可以选择全部。

我在这里使用了一些特定的术语-您学习过程的一部分就是找到并使用这些术语来建立您的知识和经验。在此过程中,您将学习以下内容:

  • 如何制作自定义表格
  • 如何将控件添加到集合或数组中
  • 如何处理集合或数组中的控件
  • 如何调整表单的大小,以使其在初次使用时看起来很整洁 知道表单上会有多少个控件。

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