Что вызывает ошибку времени выполнения Visual Basic -2147319765 (8002802b) в Excel при создании экземпляра элемента управления ActiveX? - PullRequest
4 голосов
/ 20 февраля 2009

Я создал элемент управления ActiveX, используя C ++. Я использую код Visual Basic для создания экземпляра элемента управления на листе Excel. Я могу запустить скрипт VB только один раз, последующие запуски вызывают следующую ошибку времени выполнения при попытке доступа к переменной ActiveSheet:

Microsoft Visual Basic

Run-time error '-2147319765 (8002802b)':

Automation error
Element not found

Я пытаюсь выяснить, что вызывает эту ошибку и как я могу ее исправить?

В качестве эксперимента я попытался создать простой элемент управления ActiveX, созданный мастерами Visual Studio (как в VS 2005, так и в 2008 году). Я не добавил или изменил какой-либо код в этом тестовом примере. Простой тестовый пример все еще вызывает эту ошибку.

Другие элементы управления ActiveX в системе не вызывают эту ошибку (например, я пытался создать 'Bitmap Image') из кода VB.

Это код VB (макрос, который я записал, но VB с ручным кодированием имеет ту же проблему):

Sub Macro1()
    ActiveSheet.OLEObjects.Add(ClassType:="test.test_control.1" _
        , Link:=False, DisplayAsIcon:=False).Select
End Sub

Может кто-нибудь дать мне ответ на этот вопрос? Кроме того, любые указатели на ресурсы, которые могут помочь, будут оценены.

Спасибо

Ответы [ 5 ]

3 голосов
/ 22 февраля 2009

Вы создали «неквалифицированную» ссылку на приложение Excel, которую нельзя освободить с помощью глобальной переменной, предназначенной для VBA, которая не должна использоваться в VB 6.0.

Это неприятный побочный эффект от использования VB 6.0, но это единственная проблема, которую я знаю об использовании VB6, и это легко исправить.

Проблема в вашем случае связана с использованием глобальной переменной ActiveSheet. При использовании VBA это нормально, но при использовании VB 6.0 этого следует избегать, иначе вы создадите приложение Excel, которое не сможете выпустить. Этот подход будет работать нормально с первого раза, но будет вызывать все виды неопределенного поведения в секунду время вашей подпрограммы.

В вашем примере код должен сделать что-то вроде этого:

Sub Macro1()
    Dim xlApp As Excel.Application
    Set xlApp = New Excel.Application

    xlApp.ActiveSheet.OLEObjects.Add(ClassType:="test.test_control.1" _
        , Link:=False, DisplayAsIcon:=False).Select

    ' Then when done:
    xlApp.Quit()
    xlApp = Nothing
End Sub

Подробное обсуждение того, как с этим обращаться в целом, см .:

Учебник по VB 6.0 - Поиск и восстановление неквалифицированных ссылок (http://www.xtremevbtalk.com/showthread.php?p=900556#post900556)

Для документации Microsoft по этому вопросу см .:

Сбой автоматизации Excel при повторном запуске кода времени (MSKB 178510) (http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/q178/5/10.asp)

Ошибка или непредвиденное поведение с Office Automation при использовании раннего связывания в Visual Basic (MSKB 319832) (http://support.microsoft.com/default.aspx?scid=KB;EN-US;Q319832&)

Редактировать : Обратите внимание, что использование тегов html 'a' по каким-то причинам не работало с этими ссылками. Кому-то может понадобиться заглянуть в парсер?

2 голосов
/ 26 февраля 2009

После разговора с Microsoft я выяснил причину возникшей проблемы.

При создании элемента управления ActiveX с помощью мастера VS 2005/2008 необходимо установить флажок «Точки подключения» на странице «Параметры». Это добавляет, среди прочего, IConnectionPointContainerImpl в качестве базового класса для вашего класса ATL, который, в свою очередь, реализует IConnectionPointContainer.

Невыполнение этого условия означает, что вы не можете вставить свой элемент ActiveX в документ Excel через Visual Basic более одного раза. При втором запуске скрипта вы начинаете получать «ошибки автоматизации».

Ответ на проблему был достаточно простым, и он работал, хотя я до сих пор не уверен, как это на самом деле относится к «ошибке автоматизации» и заставляет задуматься, почему сообщения об ошибках не являются более информативными.

0 голосов
/ 05 июля 2010

У меня была эта ошибка с классами UserControl, которые реализовывали интерфейсы вручную, но без событий. Решением в этом случае было объявить пустой интерфейс для атрибута ComSourceInterfaces:

[ComVisible( true )]
[Guid( "your-guid-here" )]
[ProgId( "progid-here" )]
[ComDefaultInterface( typeof( IMyClass ) )]
[ComSourceInterfaces( typeof( IMyClassEvents ) )]
[ClassInterface( ClassInterfaceType.None )]
public partial class ExcelMap : UserControl, IMyClass
{
    //implementation here
}

[ComVisible( true )]
[Guid( "your-2nd-guid" )]
[InterfaceType( ComInterfaceType.InterfaceIsDual )]
public interface IMyClass
{
     //whatever things you need to define here
}

[ComVisible( true )]
[Guid( "your-3rd-guid" )]
[InterfaceType( ComInterfaceType.InterfaceIsDual )]
public interface IMyClassEvents
{
    //empty interface to avoid Automation errors
    //you can define events here in the normal way, but it's not necessary
}
0 голосов
/ 21 февраля 2009

Исходя из описания ошибки и немного угадав, я бы предложил вам попробовать следующее.

  • Убедитесь, что вы можете создать экземпляр элемента управления ActiveX в другом месте без проблем. Это может быть просто проблема с созданием экземпляра ActiveX, а не проблема Excel.

Также в отношении связанных сейчас вы должны использовать общий "test.test_control" вместо "test.test_control.1", но это не ваша проблема здесь.

0 голосов
/ 20 февраля 2009

Я получал другое сообщение, но поведение было странным, как эта проблема. Посмотрите на мой вопрос здесь . В моем случае VBA CodeCleaner добился цели.

...