当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
答案 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