在VBA(Excel)中使用.NET DLL

3

我花了最近的两天时间尝试让一个基本的VB.NET DLL在VBA中运行。我已经阅读了这个网站上的每一篇帖子,但我仍然得到相同的错误。

  1. 我创建了一个VB.NET类(我以管理员身份运行Visual Studio)。

我的类:

Imports System
Imports System.Collections.Generic
Imports System.Text  
Imports System.Runtime.Interposervices
Imports System.Linq

Public Class TestClass
Function TestMethod(ByVal input as String)
    Return "Hello" & input
End Function
End Class
  1. 我设置了"让程序集可见"
  2. 我设置了"注册COM互操作性"
  3. 我构建并发布了dll

  4. 我打开Excel并添加了对dll的引用。

到目前为止,一切都运行良好。

  1. In a sheet I add the below code

    Public Sub test()
        Dim a As TestClass 'Note: Auto fills in once i start typing it in so i know that the DLL there 
        Set a = New TestClass  
        MsgBox (a.TestMethod("World")
    End Sub
    

当我尝试运行代码时,出现以下错误:

"ActiveX组件无法创建对象"

我已经尝试了在两台电脑上进行此操作:Win7 64位,Excel 2010 64位,VS 2010和Win7 64位,Excel 2013,VS 2010 64位,但是没有成功。我读到有人收到相同的错误信息,但是似乎没有什么方法可以解决。

是否有人发现我的方法有任何错误?


应该是Namespace.ClassName,否则您必须使用REGASM.EXE DLLNAME.dll注册程序集并使用DIM objNAME as CLASSNAME。 - Paresh J
抱歉,我漏掉了那部分,因为我随意取了一个类名。我确实使用了你描述的正确语法。我已经使用了REGASM.EXE并且成功了。但是我仍然得到相同的错误。 - Chipper14
你没有正确地进行注册。当你什么也不说的时候,没有人能猜到它出了什么问题。 - Hans Passant
当我构建发布时,引用被添加。我还尝试直接引用.TLB文件。引用已经检查过了,我能在下拉菜单中看到我的类。所以引用似乎是有效的。但是,我不确定为什么会出现错误。 - Chipper14
2个回答

3

-在您的代码中添加命名空间。
-将函数设置为public
-将其设置为com可用,并按照您所提到的方式设置“注册COM互操作性”。
-您的代码应该像这样:

Namespace X
    Public Class TestClass
        Public Function TestMethod(ByVal input As String)
            Return "Hello" & input
        End Function
    End Class
End Namespace

-在构建项目后,您会在\bin\debug或\bin\release中找到一个yourProjName.tlb文件。
-打开Excel并添加对yourProjName.tlb的引用,而不是dll。
-修改您的代码如下:

Sub test()
    Dim testObj As New TestClass
    Dim myStr As String
    myStr = testObj.TestMethod("ssssss")
    MsgBox myStr
End Sub

这对我很有用。
编辑 #1
-我正在使用 Windows 7 32位,Office 2010专业版32位带SP2,Visual Studio 2010和框架4。
-配置您的项目为x64:从Visual Studio ->转到“生成”菜单 ->单击“配置管理器” ->在活动解决方案平台下,单击“新建”,然后添加一个x64作为平台。使用此平台编译x64,链接
-最好签署您的程序集(非常容易):项目属性 >签名 >签署程序集 >新建 ->将文件名输入为myKey.snk,无需密码。
-构建您的项目。
-如果您正在与运行Visual Studio的同一台计算机上工作,则无需注册程序集,因为我们设置了“为COM互操作注册”。
-对于其他客户端机器,其中未运行VS,则必须注册程序集,仅使用DLL文件,以管理员身份运行cmd,运行以下命令:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm /codebase /tlb "D:\out\VB_DLL_001.dll"

请注意,此命令将在同一文件夹中为您生成*.tlb文件。
通过在以管理员身份运行的cmd中运行以下命令,将您的dll添加到全局程序集缓存中:
"c:\Program Files\Microsoft SDKs\Windows\v7.0A\bin\gacutil.exe" /i "d:\out\VB_DLL_001.dll"

-从Excel中添加对生成的tlb文件的引用:VBA编辑器 -> 工具 -> 引用 -> 浏览 -> 选择tlb文件 -> 确定。然后运行之前的代码,希望它能够成功运行。

编辑 #2
根据评论,它通过为x64架构构建DLL来工作,因此不需要进行编辑#1中的其他步骤。


感谢您提供的信息,我已经添加了您的所有评论,但仍然出现相同的错误。当我循环遍历代码时,错误会出现在“myStr = testObj.TestMethod(“ssss”)运行时错误429 Activex组件无法创建对象”。有没有可能您可以创建自己的代码并查看结果是否正确呢? - Chipper14
可能是使用了64位版本的Excel有关吗? - Chipper14
@Chipper14:我修改了答案。你能看一下吗? - houssam
谢谢,我会尝试的。感谢你抽出时间写下这些内容。 - Chipper14
非常感谢你!!!使用x64构建成功了!!!!我被告知任何CPU都可以,但我猜这是错误的,可能是Excel 2013的问题。再次感谢,你太棒了。 - Chipper14
@Chipper14:不客气,感谢您反馈问题的意见(我已修改答案,第二次编辑)。 - houssam

0

我曾经多次进行这个确切的战斗,但仍然不完全确定需要做什么才能使其工作,但我会传递我的最近的经验。

按照您描述构建我的dll后,它在同一台机器上的vba上运行良好...似乎是因为Visual Studio非常准确地注册了dll。当我将它复制到c:/windows/system32目录并使用Microsoft.net中framework64目录中的Regam.exe时,它也可以工作。 然而,当我尝试在另一台机器上执行相同的操作时,看起来它成功注册了,但当vba代码执行时,它说无法创建ActiveX对象。我将dll移动到syswow64目录中,并使用framework目录中的reasm.exe而不是framework64目录,然后它就可以工作了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接