3

所以这是我在这个伟大社区的第一篇文章,我是一个绝对的初学者,我相信我会从这里得到很好的建议。

我在 Visual Studio 2017 中为这个简单的 VB 类库疯狂

Public Class Addition
    Public Function Add(No1 As Long, No2 As Long) As Long
        Return No1 + No2
    End Function
End Class

我让它 COM 可见并检查了 Register for COM interop。并构建项目。

在我的访问 VBA 项目中,我毫无问题地添加了对我的 Dll 的引用,并将以下代码放在按钮的单击事件后面。

Private Sub Command0_Click()
Dim myCalc As ShwDolphin.Addition
Set myCalc = New ShwDolphin.Addition
Dim Num As Long
Num = myCalc.Add(2, 5)
Debug.Print Num
End Sub

“ShwDolphin”是 VB 程序集名称。

但我总是收到此错误消息“运行时错误 429 Active X 组件无法创建对象”

你能告诉我我在这里做错了什么吗?这真让我抓狂。

非常感谢你。

4

3 回答 3

2

阅读评论,我猜你对我所说的“bitness”有所不同。Visual Studio 中的默认项目通常是 32 位的。如果构建 32 位 COM DLL,则只能由 32 位进程加载。如果您的 Office 安装是 64 位,它将永远无法工作。您需要做的是为 64 位构建/注册它。

现在,如果您为 MSIL 而不是任何特定处理器(x86 或 x64)构建,您不必真正为 64 位重新构建。只需注册 64 位。(默认构建配置是 MSIL。)

所以需要在 C:\windows\Microsoft.NET\Framework64\v4.0.30319\regasm.exe 中使用 64 位 regasm

使用带有 /tlb /codebase "thenameofyour.dll" 选项的 regasm

如果您构建 x64 并且 Office 是 32 位的,则执行相反的操作:使用 32 位 regasm,但很可能您使用的是 32 位的默认值。

你也可以看看这个答案:activex can't create object by vbs but can by classic asp

于 2018-07-19T14:13:10.337 回答
1

因此,在经历了很多挫折之后,我能够通过执行以下操作使其工作:

1- 使用相同的代码创建一个新项目(这比删除以前的 dll 更容易)。

2- 在 Visual Studio 的项目属性中禁用“注册 COM 互操作”选项。

3-构建项目。

4- 使用 C:\windows\Microsoft.NET\Framework64\v4.0.30319\regasm.exe 中的 64 位 regasm 注册我的程序集。

5- 在 VBA 编辑器中添加对生成的 tlb 文件的引用。

感谢大家的慷慨帮助,感谢这个社区。我不知道为什么我必须这样做,但我使用的是 64 位 windows 和 64 位 office。也像@dee 说添加接口不是必需的,它只是工作。

于 2018-07-20T09:55:41.177 回答
0

为了能够在 VBA 中使用自定义 .NET 类,*.dll 必须向 COM 自动化公开方法(和属性)。这对你意味着什么?您必须创建一个接口。

Public Interface IAddition
    Function Add(No1 As Long, No2 As Long) As Long
End Interface

Public Class Addition
    Implements IAddition
    Public Function Add(No1 As Long, No2 As Long) As Long Implements IAddition.Add
        Return No1 + No2
    End Function
End Class

用法:

Private Sub Command0_Click()
Dim myCalc As ShwDolphin.IAddition
Set myCalc = New ShwDolphin.Addition
Dim Num As Long
Num = myCalc.Add(2, 5)
Debug.Print Num
End Sub

有关更多详细信息,请按照我过去的答案中提供的说明进行操作:Generics and Com Visible .NET library

您可能也对这篇文章感兴趣:使用 C#、VB.NET 或 C++/CLI 扩展您的 VBA 代码

祝你好运!

于 2018-07-18T11:13:36.407 回答