2017-12-03 53 views
-1

VB.NET 2017で単純なdllを作成しました。 VBA(Excel 2016)から呼び出そうとしています。私はStack OverflowとMSDNを検索しましたが、このVBAエラーの多くのヒットにもかかわらず、この特定の問題を解決するユーザー定義のDLLに関連する情報は見つかりません。vba実行時エラー '429':ユーザー定義のvb.net dll(VB.NET 2017、Excel 2016)でActiveXがオブジェクトを作成できない

dllをコンパイルするときにCOM Interopに登録オプションのボックスをチェックしました。また、アセンブリのCOM-Visibleを作成するボックスもチェックされていることを確認しました。

コンパイルに成功し、VBAエディタ内の参考文献でライブラリ(TestLibrary2)を見つけることができました。私が作成したクラスは、TestVBNETと呼ばれています。私はVBAでそれを含めることTestLibrary2を確認して、VBAに次のコードを実行しようとしました:実行時エラー:

Public Sub mySub() 
    Dim myTest2 As TestLibrary2.TestVBNet 
    Set myTest2 = New TestLibrary2.TestVBNet 
End Sub 

私はサブを実行したとき、私はメッセージでポップアップダイアログを得ました「429」:ActiveXは私はMSDNや他のサイトで読んだものに基づいてオブジェクト

を作成することはできません、期待される結果はTestLibrary2.TestVBNetオブジェクトが正常にインスタンス化されなければならないということです。

以下のコードは、私がdllにコンパイルしたVB.NETコードです。 GUIDは、Windows 10コマンドプロンプトでguidgenを使用して生成されました。

Imports System.Runtime.InteropServices 
    <Guid("2CEBF80D-D5FC-4C52-BCF1-E2F076318240")> 
    Public Interface ITestVBNet 
     Function addTrig(x As Double, y As Double) As Double 
    End Interface 

    <Guid("60983277-A724-4CDD-8ACE-B94CF9546F43")> 
    <ClassInterface(ClassInterfaceType.None)> 
    Public Class TestVBNet 
     Function addTrig(x As Double, y As Double) As Double 
      Return Math.Sin(x) + Math.Cos(x) 
     End Function 

    End Class 

ご意見やご要望があれば幸いです。前もって感謝します。

EDIT(以下のコメント):実際にRegister for COM Interopオプションを実行するには、管理者としてdllをコンパイルしました。また、管理者として - - 私はまたします。regasmを使用してみました、次のように、コンパイルされたDLLと同じディレクトリに:

regasm /codebase /tlb TestLibrary2.dll 

以下が返されました:私はここに初心者くさいことをお詫び申し上げます

RegAsm : warning RA0000 : Registering an unsigned assembly with /codebase can cause your assembly to interfere with other applications that may be installed on the same computer. The /codebase switch is intended to be used only with signed assemblies. Please give your assembly a strong name and re-register it. 
Types registered successfully 
RegAsm : error RA0000 : An error occurred while saving the exported type library: Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED)) 

をCOMライブラリの登録に関しては、dllが正常に登録されたがGACに転送できなかったことを示すように見えた。それを転送しないことが私の意図でした。 VBAでロードしようとすると、上記と同じエラーが発生しました。

+0

現在のユーザーの特権によっては、アクセス権の問題が考えられます。その理由を除外できるように、管理者としてコードを実行してみてください。 – peakpeak

+1

dllのビット数とExcelのビット数が一致していることを確認してください。 regasm.exeでアセンブリを再登録してみてください –

+0

単純なVB.NETクライアントでDLLをロードしようとしましたか?これはあなたにヒントを与えるかもしれません –

答えて

0

上記のコードは、C#クライアントから実際に呼び出し可能なdllにコンパイルされていることが判明しました。しかし、VBAの問題は、派生クラス宣言の後にITestVBNetを実装するのをやめたことでした。しかし、VB.NETでは、これに加えて、派生関数宣言で関数のオーバーライドも明示的に指定する必要があります。すなわち(行全体を参照する権利のすべての方法をスクロール)、

Public Function addTrig(x As Double, y As Double) As Double Implements ITestVBNet.addTrig 

次して上記派生クラスを置き換えることにより、私はVBAでTestVBNetオブジェクトのインスタンスを作成することができたとaddTrigを呼び出します(。)メソッドが成功しました:

<Guid("60983277-A724-4CDD-8ACE-B94CF9546F43")> 
<ClassInterface(ClassInterfaceType.None)> 
Public Class TestVBNet 
    Implements ITestVBNet 

    Public Function addTrig(x As Double, y As Double) As Double Implements ITestVBNet.addTrig 
     Return Math.Sin(x) + Math.Cos(x) 
    End Function 
End Class 
関連する問題