excel - VBA (Excel) 中的 .NET DLL

标签 excel vba vb.net

在过去的 2 天里,我一直在尝试获得一个在 VBA 中创建的基本 VB.NET dll。我已经阅读了关于这个视线的每一篇文章,但我总是遇到同样的错误。

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

我的类(class)

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. 在工作表中添加以下代码

    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 component can't create object"

我已经使用 2 台计算机尝试过此操作:Win7 64 位、Excel 2010 64 位、VS 2010 和 Win7 64 位、Excel 2013、VS 2010 64 位,运气不错。我读过有人收到同样的错误,但我似乎没有任何效果。

有人看到我的方法有什么错误吗?

最佳答案

-为您的代码添加命名空间。
- 将函数设置为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 位、带有 SP2 的 Office 2010 专业版 32 位、带有框架 4 的 Visual Studio 2010。
-为 x64 配置项目:从 Visual Studio -> 转到构建菜单 -> 单击配置管理器 -> 在事件解决方案平台下,单击新建,然后添加一个 x64 作为平台。使用此平台为 x64 编译,link .
-最好对程序集进行签名(非常简单):项目属性>签名>对程序集进行签名>新建->输入文件名myKey.snk,不需要密码。
-构建你的项目。
- 如果您在运行 visual studio 的同一台机器上工作,则无需注册您的程序集,因为 VS 会注册,因为我们设置了“注册 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 中的其他步骤。

关于excel - VBA (Excel) 中的 .NET DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27587765/

相关文章:

excel - 查找对象库vba的VBIDE.Reference.Name

vba - 无法从 VBA 函数返回值

vb.net - 从 VB.Net 中的数据表填充组合框的最快方法

vba - 使用 VBA if 语句通过按钮隐藏/取消隐藏列

Excel VBA : Scripting. 字典计算

excel - 我的 vlookup 代码块的更快替代方案?

java - 如何以编程方式定义虚拟 IP?

.net - 在多个项目中使用相同的模块

excel - 使用密码保护关闭的工作簿

mysql - 如何将相同的 IF 语句应用于同一列中的多个单元格? (Excel)