2009-02-20 19 views
4

我已經使用C++創建了一個ActiveX控件。我使用Visual Basic代碼實例化Excel工作表中的控件。我只能運行VB腳本一次,後續運行導致當試圖訪問「ActiveSheet」變量以下運行時錯誤:當ActiveX控件已實例化時,Excel中導致Visual Basic運行時錯誤-2147319765(8002802b)的原因是什麼?

Microsoft Visual Basic 

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

Automation error 
Element not found 

我試圖找出是什麼原因導致這個錯誤,我怎麼能解決這個問題?

作爲一個實驗,我嘗試創建一個由Visual Studio嚮導生成的簡單ActiveX控件(在VS 2005 & 2008中)。我沒有在這個測試用例中添加或修改任何代碼。簡單的測試用例仍然會導致此錯誤。

系統中的其他ActiveX控件不會導致此錯誤(例如,我嘗試從VB代碼實例化'位圖圖像')。

這是VB代碼(即我錄,但手工編碼VB有同樣的問題宏):

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

誰能給我這個答案嗎?或者任何指向可能有用的資源的指針都將被讚賞。

謝謝

回答

2

與微軟交談後,我發現了我遇到的問題的原因。

使用VS 2005/2008嚮導創建ActiveX控件時,您需要選中「選項」頁面中的「連接點」複選框。除此之外,這增加了IConnectionPointContainerImpl作爲ATL類的基類,後者又實現了IConnectionPointContainer。

不這樣做意味着您不能通過Visual Basic多次將ActiveX控件插入到Excel文檔中。第二次執行該腳本時,您將開始出現「自動化錯誤」。

問題的答案很簡單,它的工作原理雖然我仍然不確定它是如何與'自動化錯誤'相關的,並且讓我想知道爲什麼錯誤信息沒有更多的信息。

0

我收到了不同的信息,但行爲很奇怪,就像這個問題一樣。看看我的問題here。就我而言,VBA CodeCleaner就是這樣做的。

0

從錯誤描述和猜測有點我建議你嘗試以下。

  • 確保您可以在別處實例化您的ActiveX控件而不會出現任何問題。這可能只是實例化ActiveX而不是Excel問題的一個問題。

此外,現在你應該使用一般的「test.test_control」而不是「test.test_control.1」,但這不是你的問題在這裏。

3

您已經創建了一個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

有關此問題的微軟文檔,請參見:

Excel自動化失敗,第二次代碼運行(MSKB 178510) (http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/q178/5/10.asp

錯誤或意外在Visual Basic中使用早期綁定時的辦公自動化行爲(MSKB 319832) (http://support.microsoft.com/default.aspx?scid=KB;EN-US;Q319832&

編輯請注意,由於某些原因,使用html'a'標記不適用於這些鏈接。有人可能需要查看解析器?

+0

嗨邁克,感謝您的迴應。儘管它非常有用,而且您提供的鏈接非常豐富,但我仍然會遇到同樣的錯誤。請注意,我無法完全使用您的代碼示例,因爲它會創建一個新的Excel應用程序對象,我想重新使用當前的應用程序對象。以下是我的新測試代碼。 – 2009-02-23 11:12:24

0

我有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 
} 
相關問題