CATIA VBA - 自动化错误找对象(Catia VBA - Automation Error

2019-09-28 16:15发布

我收到一个自动化错误,当CATIA是试图写在选定的Excel工作表中的值。 这是一个有点混乱,因为在第一次尝试的代码没有错误和值在Excel工作表。

我没有改变的代码,但在第二次尝试,我得到:

Run-time error '-2147417846 (8001010a)':  Automation error
"The Message filter indicated that the application is busy."

就行: Set MyXL = GetObject(FPath)

Sub CATMain()
FPath = CATIA.FileSelectionBox("Select the Excel file you wish to put the value in", "*.xlsx", CatFileSelectionModeOpen)

If FPath = "" Then
Exit Sub
End If

Set xlApp = CreateObject("Excel.Application")

Set MyXL = GetObject(, "Excel.Application")
Set MyXL = GetObject(FPath)
MyXL.Application.Visible = True
MyXL.Parent.Windows(1).Visible = True
        Dim oSelection As Selection
        Set oSelection = CATIA.ActiveDocument.Selection
        Dim oProduct As AnyObject

    On Error Resume Next
        Set oProduct = oSelection.FindObject("CATIAProduct")

            If (Err.Number <> 0) Then
                MsgBox "No selected product"
            Else

    On Error GoTo 0

        Dim oInertia As AnyObject
        Set oInertia = oProduct.GetTechnologicalObject("Inertia")

        Dim dMass As Double
        dMass = oInertia.Mass

        Dim dDen As Double
        dDen = oInertia.Density

    MsgBox oProduct.Name & ": Masse = " & CStr(dMass) & " KG" & ": Dichte = " & (CStr(dDen) / 1000) & " "

        MyXL.Application.Cells(1, 1).Value = "Masse"
        MyXL.Application.Cells(2, 1).Value = dMass
        MyXL.Application.Cells(1, 2).Value = "Dichte"
        MyXL.Application.Cells(2, 2).Value = "dDen"

MsgBox "Werte wurden in Excel eingetragen"
  End If
   End Sub

Answer 1:

看来你没有设置Option Explicit -把它放在第一行,它会帮助你避免错误。 (有了它,编译器会强迫你声明所有的变量。这也意味着,当你把它在,你的代码不会,除非你声明的所有变量的工作。)


第一个问题:

Set xlApp = CreateObject("Excel.Application")

Set MyXL = GetObject(, "Excel.Application")

首先创建Excel的一个新的实例CreateObject并存储在它的参考xlApp (你后来不使用)。 然后,你试图去与现有的 Excel实例的引用GetObject和存储的参考MyXL 。 这只是工作可靠,因为你首先要创建一个新的实例。 否则,你不能保证始终有一个可用的Excel实例。

一个相关的问题是,你不放开/关闭这些实例。 如果你创建一个Excel实例,您需要与关闭xlApp.Quit你使用它完成后,否则会萦绕。
不过要小心与实例你接手GetObject -调用MyXL.Quit将关闭实例,而不管什么其他工作簿是在那个时候开放。

同样,如果您打开一个文件这种方式,你需要确保事后关闭它。 否则,你会遇到你遇到的问题:写保护的文件。


因此,修补你的问题:关闭Excel的所有打开的实例(通过任务管理器中最好的,因为一些人可能是无形的)。 然后调整你的代码只使用一个参考的Excel.Application 。 最后确保.Close工作簿您在保存后和.Quit您的Excel实例。 这样应该可以防止错误再次出现。

'Dim xlApp As Excel.Application    ' early-bound declaration
'Set xlApp = New Excel.Application    ' early-bound assignment
Dim xlApp As Object    ' late-bound declaration
Set xlApp = CreateObject("Excel.Application")    ' late-bound assignment

'Dim wb As Workbook    ' early-bound declaration
Dim wb as Object
Set wb = xlApp.Workbooks.Open(FPath)

' stuff you want to do with the workbook

wb.Close SaveChanges:=True
xlApp.Quit

如果你可以添加到您在Excel对象模型的Catia VBA项目(不知道这一点)的引用,你可以注释掉后期绑定线和使用早期绑定线来代替。 这样,你得到的Excel对象非常有用的智能感知。 这使得这么多的代码更容易。



Answer 2:

感谢大伙们! 我已经解决了这个问题用简单的添加代码:

Workbook.Close SaveChanges:=True


文章来源: Catia VBA - Automation Error Get Object