Всплывающее окно MsgBox только один раз после 1 итерации - PullRequest
0 голосов
/ 03 января 2019

Я хочу, чтобы всплывающее окно отображалось только один раз, независимо от количества tpred в этом коде.Как попасть в одно всплывающее окно со всеми примерами из цикла.Теперь мне нужно подтвердить нажатием кнопки «Да» каждый результат.

Макрос используется в MS Project для запуска задачи и проверки завершения предшествующего процесса.Если существует более одного predessecor, всплывающее окно появляется с каждым предшествующим.

Я очень беден в 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 голосов
/ 17 января 2019

Добавьте переменную, чтобы отслеживать, все ли предшественники завершены, и переместите окно сообщения для неполных предшественников. за пределами цикл:

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
0 голосов
/ 04 января 2019

Ваше решение - создать пользовательскую форму, а не использовать встроенное окно сообщения.

Делая некоторые предположения о том, что вы хотите:

  • В верхней части задач должен быть простой ярлык, который что-то говорит в соответствии с "Следующие задачи имеют предшественников, которые не завершено. Выберите, какие задачи вы хотите запустить. "
  • Используйте For Each tpred In T.PredecessorTasks, чтобы добавить флажок к ваша форма. Это может быть просто флажок с названием задачи и соответствующими предшественниками в качестве заголовка.
  • В этом цикле добавляйте только те задачи, которые соответствуют If compl <> 100 состояние.
  • Как только форма построена в For Each tpred In T.PredecessorTasks затем вы должны показать форму и позволить пользователю проверить / выбрать каждое задание В форме также должна быть кнопка, на которую пользователь может нажать подтвердить свой выбор.
  • Как только пользователь подтвердит свой выбор, просмотрите каждый из Флажки и процесс, однако вам нужно. Пользователь может выбрать ни один, или они могут выбрать все.

Я использовал здесь некоторые конкретные термины - часть вашего учебного пути состоит в том, чтобы найти и использовать эти термины для развития ваших знаний и опыта. В этом путешествии вы узнаете такие вещи, как:

  • Как сделать пользовательскую форму
  • Как добавить элементы управления в коллекцию или массив
  • Как обрабатывать элементы управления из коллекции или массива
  • Как изменить размер формы, чтобы она выглядела аккуратно, когда вы изначально этого не сделали знать, сколько элементов управления будет в форме.

В некоторых из этих шагов вы можете столкнуться с проблемами кодирования - если вы не можете найти ответ через поиск (ваш любимый поисковик или здесь, в Stack Exchange), то откройте новый вопрос с этими конкретными проблемами. Здесь много людей с опытом, готовых помочь.

...