首页 > 解决方案 > 1 次迭代后仅弹出一次 MsgBox

问题描述

无论此代码中tpred的数量如何,我都希望弹出窗口只显示一次。如何使用循环中的所有示例打开一个弹出窗口。现在我需要用是按钮确认每个发现。

该宏在 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

标签: vbaloopsms-projectmsgbox

解决方案


添加一个变量来跟踪所有前辈是否完整,并将未完成前辈的消息框移到循环外:

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

推荐阅读