[英]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.