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

Excel Catia VBA-自动错误获取对象,excel,vba,automation,catia,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-

当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(“选择要将值放入“,”*.xlsx“,CatFileSelectionModeOpen”的Excel文件)
如果FPath=”“,则
出口接头
如果结束
设置xlApp=CreateObject(“Excel.Application”)
设置MyXL=GetObject(,“Excel.Application”)
设置MyXL=GetObject(FPath)
MyXL.Application.Visible=True
MyXL.Parent.Windows(1).Visible=True
作为选择的模糊选择
设置oSelection=CATIA.ActiveDocument.Selection
将oProduct设置为AnyObject
出错时继续下一步
Set-opproduct=oSelection.FindObject(“CATIAProduct”)
如果(错误编号0),则
MsgBox“未选择任何产品”
其他的
错误转到0
Dim oInertia作为任何对象
设置oInertia=opproduct.GetTechnologicalObject(“惯性”)
将dMass设置为双精度
dMass=惯性质量
双色
dDen=惯性密度
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“Excel电子表格中的Werte wurden”
如果结束
端接头

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

Workbook.Close SaveChanges:=True

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


第一个问题:

Set xlApp = CreateObject("Excel.Application")

Set MyXL = GetObject(, "Excel.Application")
首先使用
CreateObject
创建一个新的Excel实例,并在
xlApp
中存储对该实例的引用(随后不再使用)。然后尝试使用
GetObject
获取对现有Excel实例的引用,并将其引用存储在
MyXL
中。这只能可靠地工作,因为您首先创建了一个新实例。否则,您无法保证始终存在可用的Excel实例

一个相关的问题是,您没有释放/关闭这些实例。如果创建Excel实例,则需要使用
xlApp将其关闭。使用完后请退出
,否则它将继续存在。
但是,对于使用
GetObject
接管的实例,请小心-调用
MyXL。退出
将关闭该实例,而不管当时打开了哪些其他工作簿

类似地,如果以这种方式打开文件,则需要确保随后将其关闭。否则,您将遇到您遇到的问题:写入受保护的文件


因此,要解决您的问题:关闭所有打开的Excel实例(最好通过任务管理器完成,因为其中一些可能不可见)。然后将代码调整为只使用一个对
Excel.Application
的引用。最后,确保
。保存工作簿后关闭它并
。退出你的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对象获得非常有用的智能感知。这使得编写代码变得更加容易。

您能分享“自动化错误”的完整错误消息吗?是否有FPath的Dim语句?运行时错误“-2147417846(8001010a)”:自动化错误,消息筛选器指示应用程序为busyno,这里没有暗号@Solar MikeI我想问题是,当我第一次使用宏时,它会打开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