Catia VBA - Ошибка автоматизации при получении объекта - PullRequest
0 голосов
/ 06 июля 2018

Я получаю сообщение об ошибке автоматизации, когда 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 голосов
/ 06 июля 2018

Похоже, вы не установили 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 в своем проекте VBA на Catia (не уверены в этом), вы можете закомментировать строки с поздними границами и использовать вместо них строки с ранними границами. Таким образом, вы получаете очень полезный IntelliSense для объектов Excel. Что делает код намного проще.

0 голосов
/ 06 июля 2018

Спасибо, ребята! Я решил проблему с помощью простого добавления кода:

Workbook.Close SaveChanges:=True
...