繁体   English   中英

catia vba在直到.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直到循环,这完全破坏了宏。 请参阅此处我为解决问题而失败的尝试:

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.start命令。

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

问题中发布的第一部分代码仅偶尔出现异常行为,但是,即使用户在“另存为”对话框中选择“取消”,此代码也会关闭文档,从而完全丢弃自上次操作以来对文档所做的任何工作。已保存。 这当然是不可接受的行为。
因此,必须在save as命令之后实施.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

但是,在运行此代码时,宏跳过代码/完全停止运行的原始问题(仍然不确定情况是什么)现在将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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM