您可以使用 运行 时间 window 而不是 MsgBox 来输出吗?

Can you have a run-time window instead of a MsgBox for output?

我目前的代码如下:我输入一个 UID,然后一个消息框显示任务的松弛度。但是,当消息框打开时无法编辑 Microsoft Project 文件。

我可以在 VBA 中使用另一个对象来显示相同​​的输出,但允许我在输出输出的同时处理项目文件吗?而且,是否可以实时输出?换句话说,如果我更改了我的日程安排,如果在我进行更改时松弛发生变化,我是否可以看到输出不断变化,而无需再次 运行 应用程序?

Sub SlackFinder()
    Dim User_UID, User_ID As Integer
    Dim Slack As Variant
    Dim NewSlack As Variant

    User_UID = InputBox("Enter UID for slack:")
    If User_UID = "" Then Exit Sub
    On Error GoTo Error_Not_Found
    User_ID = ActiveProject.Tasks.UniqueID(User_UID).ID
    On Error GoTo Error_Collapsed
    Slack = ActiveProject.Tasks.UniqueID(User_UID).TotalSlack
    NewSlack = Slack / 480
    MsgBox "Total Slack: " & NewSlack
    Exit Sub

Error_Not_Found:
    MsgBox "UID " & User_UID & " not found in " & ActiveProject.Name
    Exit Sub

Error_Collapsed:
    MsgBox "UID is present but cannot be selected.  Perhaps it is collapsed?", vbOKOnly, "COLLAPSED UID?"
    Exit Sub
End Sub

您可以使用无模式用户窗体显示实时松弛。在 VBA 中创建一个用户窗体,例如具有用于输入任务 UID 的文本框和用于显示 Total Slack 值的标签的东西:

然后将此代码添加到用户窗体模块:

Private Sub UID_Change()
    UpdateTotalSlack
End Sub

Sub UpdateTotalSlack()
    On Error Resume Next
    Me.TSlack = "Total Slack = " & ActiveProject.Tasks.UniqueID(Me.UID).TotalSlack / 480
End Sub

将此添加到项目模块:

Sub ShowSlack()
    UserForm1.Show False
End Sub

Private Sub Project_Change(ByVal pj As Project)
    UserForm1.UpdateTotalSlack
End Sub

首先,调用 ShowSlack 过程。这将无模式地显示用户表单(例如,它漂浮在 MS 项目 window 上方,允许您在日程表中进行更改)。在文本框中输入任务 UID,总时差将立即显示并在计划发生更改时更新(感谢 Change 事件代码)。

项目模块:

Private Sub Project_Change(ByVal pj As Project)
MsgBox "hi"
UserForm10.UpdateTotalSlack
End Sub

第 29 单元:

Sub ShowSlack()
    UserForm10.Show False
End Sub

用户表单 10:

Dim User_UID As Variant
Dim TSlack As Variant


Private Sub TextBox3_Change()
    User_UID = UserForm10.TextBox3.Value
    UpdateTotalSlack
End Sub

Sub UpdateTotalSlack()
    On Error Resume Next
    If Not User_UID = "" Then
        TSlack = ActiveProject.Tasks.UniqueID(User_UID).TotalSlack / 480
    Else
        TSlack = ""
    End If
    UserForm10.Label1.Caption = TSlack
End Sub