【问题标题】:Popup MsgBox only once after 1 iteration1 次迭代后仅弹出一次 MsgBox
【发布时间】:2019-01-03 19:16:49
【问题描述】:

我希望弹出窗口只显示一次,无论此代码中 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

【问题讨论】:

    标签: vba loops ms-project msgbox


    【解决方案1】:

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

    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
    

    【讨论】:

    • 嗨,Rachel,非常感谢您的帮助,它非常有效。非常感谢!也不知道我可以用 _ 来打破界限 :) 每天都有新东西。问候贾雷克
    【解决方案2】:

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

    对你想要什么做一些假设:

    • 在任务顶部有一个简单的标签来说明一些事情 按照“以下任务的前身是 不完整。选择您仍要触发的任务。”
    • 使用For Each tpred In T.PredecessorTasks 将复选框添加到 你的表格。这可能只是一个以任务名称和相关前辈作为标题的复选框。
    • 在这个循环中,只添加满足If compl &lt;&gt; 100的任务 条件。
    • 一旦在For Each tpred In T.PredecessorTasks 中构建了表单 循环,然后您必须显示表单并允许用户检查/选择 每个任务。表单还必须有一个用户可以按下的按钮 确认他们的选择。
    • 一旦用户确认他们的选择,运行每个 复选框和过程,但你需要。用户可以选择无, 或者他们可以选择全部。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-13
      • 2016-05-10
      • 1970-01-01
      • 2017-07-01
      • 2019-05-06
      • 1970-01-01
      • 2021-12-21
      • 2023-02-07
      相关资源
      最近更新 更多