我花了最近两天的时间试图获得一个基本的VB.NET dll,它可以在VBA中运行。我已经看过这个视线上的每一个帖子,但我一直得到同样的错误。
我的班级
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
我构建并发布了dll
我打开Excel并添加对dll的引用。
到目前为止,一切都很有效
在表格中添加以下代码
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组件无法创建对象"
我尝试使用2台计算机:Win7 64位,Excel 2010 64位,VS 2010和Win7 64位,Excel 2013,VS 2010 64位,运气良好。我看过人们收到同样的错误,但似乎没什么用。
有没有人在我的方法中看到任何错误?
答案 0 :(得分:3)
- 为您的代码添加命名空间
- 将函数设为public
。
- 使其可见并设置'注册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 - >转到构建菜单 - >单击配置管理器 - >在Active solution platform下,单击New,然后添加一个x64作为平台。使用此平台编译x64,link。
- 首选签名程序集(非常简单):项目属性>签名>签署组件>新 - >输入文件名称为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添加到Global Assembly缓存中:
"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中的其他步骤。