【问题标题】:Catia VBA - Automation Error Get ObjectCatia VBA - 自动化错误获取对象
【发布时间】:2018-07-06 07:09:20
【问题描述】:

当 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

【问题讨论】:

  • 您能否分享“自动化错误”的完整错误消息?
  • FPath 是否有 Dim 语句?
  • 运行时错误'-2147417846 (8001010a)':自动化错误,消息过滤器指示应用程序正忙
  • 不,它没有暗淡@Solar Mike
  • 我认为问题是当我第一次使用宏时,它打开了 Excel,但它不再关闭它,我该如何关闭它?

标签: excel vba automation catia


【解决方案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。这使得编码变得更加容易。

【讨论】:

    【解决方案2】:

    谢谢你们!我通过简单地添加代码解决了这个问题:

    Workbook.Close SaveChanges:=True
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-18
      相关资源
      最近更新 更多