Catia VBA-自动化错误获取对象

时间:2018-07-06 07:09:20

标签: excel vba automation catia

当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

2 个答案:

答案 0 :(得分:1)

您似乎没有设置Option Explicit-将其放在第一行,它将帮助您避免错误。 (有了它,编译器将强制您声明所有变量。这也意味着,当您将其放入时,除非声明所有变量,否则代码将无法工作。)


第一个问题:

Set xlApp = CreateObject("Excel.Application")

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

您首先使用CreateObject创建一个新的Excel实例,并将对它的引用存储在xlApp中(随后您将不使用它)。然后尝试使用GetObject获取对现有 Excel实例的引用,并将其引用存储在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

如果您可以在Catia VBA项目中添加对Excel对象模型的引用(对此不确定),则可以注释掉后期绑定的行,而改用早期绑定的行。这样,您就可以为Excel对象获得非常有用的IntelliSense。这使编写代码变得如此容易。

答案 1 :(得分:0)

谢谢你们!我只需添加代码即可解决问题:

Workbook.Close SaveChanges:=True