catia vba Do Until .saved 和 DoEvents,如何重新获得 CATIA 的控制权?

catia vba Do Until .saved and DoEvents, how to regain control of CATIA?

此代码允许我使用键盘快捷方式快速关闭并在必要时保存文档。

Sub CATMain()

Dim doc As Document
Set doc = CATIA.ActiveDocument

Dim MsgBoxRes As String

If doc.Saved Then
    doc.Close
Else
    MsgBoxRes = MsgBox("Document has changes, save & close?", vbOKCancel)
    If MsgBoxRes = "1" Then
        If Left(doc.FullName, 1) <> "Y" Then
            CATIA.StartCommand "save as"
            doc.Close
        Else
            doc.Save
            doc.Close
        End If
    Else
        Exit Sub
    End If
End If

End Sub

当我使用“另存为”对话框并保存我的文档时,代码 并不总是 正确恢复或跳过下一个命令,我不确定这是怎么回事。 (实际上这意味着我的文档不会关闭)
因此,我尝试插入一个睡眠时间,这并没有改变任何东西,所以我还尝试添加一个带有 DoEvents 方法的 Do Until 循环,这完全破坏了宏。 在这里查看我解决问题的失败尝试:

Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub CATMain()

Dim doc As Document
Set doc = CATIA.ActiveDocument

Dim MsgBoxRes As String

If doc.Saved Then
    doc.Close
Else
    MsgBoxRes = MsgBox("Document has changes, save & close?", vbOKCancel)
    If MsgBoxRes = "1" Then
        If Left(doc.FullName, 1) <> "Y" Then
            CATIA.StartCommand "save as"
            DoEvents
            Do Until doc.Saved
                DoEvents
                If doc.Saved Then doc.Close
                DoEvents
                Sleep 100
            Loop
        Else
            doc.Save
            doc.Close
        End If
    Else
        Exit Sub
    End If
End If

End Sub

我的问题现在变得更糟了;而在 Do 循环中 VB 不允许 CATIA 或用户做任何事情,我需要使用 Ctrl+Break 来摆脱困境。

有没有办法在仍然使用 catia.startcommand "save as" 的同时使此代码正常工作?

我知道应该可以通过制作我自己的对话框来完成同样的事情,用户可以在该对话框中浏览并选择正确的保存位置,但如果可能的话,我宁愿只使用 catia.startcommand .

经过一段时间的测试和实验,我终于找到了一种使用 startcommand "save as" 方法并使我的代码行为一致的方法。

问题中发布的代码的第一部分只是偶尔表现不稳定,但是即使用户在另存为对话框中选择 "cancel",这段代码也会关闭文档,完全放弃在自上次保存后的文档。这当然是不可接受的行为。
因此,必须在另存为命令后执行 .saved 检查,如下所示:

Sub CATMain()

Dim doc As Document
Dim MsgBoxRes As String

Set doc = CATIA.ActiveDocument

If doc.Saved Then
    doc.Close
Else
    MsgBoxRes = MsgBox("Document has changes, save & close?", vbOKCancel)
    If MsgBoxRes = "1" Then
        If Left(doc.FullName, 1) <> "Y" Then
            CATIA.StartCommand "save as"
            If doc.Saved Then doc.Close
        Else
            doc.Save
            doc.Close
        End If
    End If
End If

End Sub

然而,当 运行 这段代码时,宏跳过 code/completely 停止的原始问题(仍然不确定这里的情况)现在将 100% 发生。
我终于找到了一个简单的解决方法,它似乎在 100% 的时间内都按预期运行;另存为命令后的一个简单的 .activate 似乎可以解决所有问题,如下所示:

Sub CATMain()

Dim doc As Document
Dim MsgBoxRes As String

Set doc = CATIA.ActiveDocument

If doc.Saved Then
    doc.Close
Else
    MsgBoxRes = MsgBox("Document has changes, save & close?", vbOKCancel)
    If MsgBoxRes = "1" Then
        If Left(doc.FullName, 1) <> "Y" Then
            CATIA.StartCommand "save as"
            doc.Activate
            If doc.Saved Then doc.Close
        Else
            doc.Save
            doc.Close
        End If
    End If
End If

End Sub