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
我想让弹出窗口 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