无法在 VBA 中使用我的简单 VB class 库
Not able to use my simple VB class library in VBA
所以这是我第一次 post 在这个伟大的社区,我是一个绝对的初学者,我相信我会从这里得到很好的建议。
我在 Visual Studio 2017 年 VB class 这个简单的图书馆发疯
Public Class Addition
Public Function Add(No1 As Long, No2 As Long) As Long
Return No1 + No2
End Function
End Class
我使其 COM 可见并检查了 COM 互操作的注册。并构建项目。
在我访问VB一个项目中,我已经毫无问题地添加了对我的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 程序集名称。
但我总是收到此错误消息
"Runtime error 429 Active X component can't create an object"
你能告诉我我做错了什么吗?
这让我发疯。
非常感谢。
为了能够在 VBA 中使用自定义 .NET class,*.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
有关详细信息,请按照我过去的回答中提供的说明进行操作:
您可能也对这篇文章感兴趣:Extend your VBA code with C#, VB.NET, or C++/CLI
祝你好运!
阅读评论,我猜你对我所说的有所不同"bitness"。 Visual Studio 中的默认项目通常为 32 位。如果构建 32 位 COM DLL,它只能由 32 位进程加载。如果您的 Office 安装是 64 位的,它将永远无法运行。您需要做的是 build/register 它用于 64 位。
现在,如果您为 MSIL 而不是任何特定处理器(x86 或 x64)构建,则不必真正为 64 位重建。所需要做的就是注册 64 位。 (默认构建配置是 MSIL。)
所以你需要在C:\windows\Microsoft.NET\Framework64\v4.0.30319\regasm.exe
中使用64位regasm
使用选项为 /tlb /codebase 的 regasm "thenameofyour.dll"
如果您构建的是 x64 而 Office 是 32 位的,则执行相反的操作:使用 32 位 regasm,但很可能您使用的是 32 位的默认值。
你也可以看看这个回答:activex can't create object by vbs but can by classic asp
所以在经历了很多挫折之后,我能够通过执行以下操作使其工作:
1- 使用相同的代码创建一个新项目(这比删除以前的 dll 更容易)。
2- 在 Visual Studio 的项目属性中禁用 "Register for COM interop" 选项。
3- 构建项目。
4- 使用 C:\windows\Microsoft.NET\Framework64\v4.0.30319\regasm.exe 中的 64 位 regasm 来注册我的程序集。
5- 在 VBA 编辑器中添加对生成的 tlb 文件的引用。
感谢大家的慷慨帮助,感谢这个社区。
我不知道为什么我必须这样做,但我使用的是 64 位 windows 和 64 位办公室。
也像@dee 说的那样,添加接口不是必需的,它只是起作用了。
所以这是我第一次 post 在这个伟大的社区,我是一个绝对的初学者,我相信我会从这里得到很好的建议。
我在 Visual Studio 2017 年 VB class 这个简单的图书馆发疯
Public Class Addition
Public Function Add(No1 As Long, No2 As Long) As Long
Return No1 + No2
End Function
End Class
我使其 COM 可见并检查了 COM 互操作的注册。并构建项目。
在我访问VB一个项目中,我已经毫无问题地添加了对我的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 程序集名称。
但我总是收到此错误消息 "Runtime error 429 Active X component can't create an object"
你能告诉我我做错了什么吗? 这让我发疯。
非常感谢。
为了能够在 VBA 中使用自定义 .NET class,*.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
有关详细信息,请按照我过去的回答中提供的说明进行操作:
您可能也对这篇文章感兴趣:Extend your VBA code with C#, VB.NET, or C++/CLI
祝你好运!
阅读评论,我猜你对我所说的有所不同"bitness"。 Visual Studio 中的默认项目通常为 32 位。如果构建 32 位 COM DLL,它只能由 32 位进程加载。如果您的 Office 安装是 64 位的,它将永远无法运行。您需要做的是 build/register 它用于 64 位。
现在,如果您为 MSIL 而不是任何特定处理器(x86 或 x64)构建,则不必真正为 64 位重建。所需要做的就是注册 64 位。 (默认构建配置是 MSIL。)
所以你需要在C:\windows\Microsoft.NET\Framework64\v4.0.30319\regasm.exe
中使用64位regasm使用选项为 /tlb /codebase 的 regasm "thenameofyour.dll"
如果您构建的是 x64 而 Office 是 32 位的,则执行相反的操作:使用 32 位 regasm,但很可能您使用的是 32 位的默认值。
你也可以看看这个回答:activex can't create object by vbs but can by classic asp
所以在经历了很多挫折之后,我能够通过执行以下操作使其工作:
1- 使用相同的代码创建一个新项目(这比删除以前的 dll 更容易)。
2- 在 Visual Studio 的项目属性中禁用 "Register for COM interop" 选项。
3- 构建项目。
4- 使用 C:\windows\Microsoft.NET\Framework64\v4.0.30319\regasm.exe 中的 64 位 regasm 来注册我的程序集。
5- 在 VBA 编辑器中添加对生成的 tlb 文件的引用。
感谢大家的慷慨帮助,感谢这个社区。 我不知道为什么我必须这样做,但我使用的是 64 位 windows 和 64 位办公室。 也像@dee 说的那样,添加接口不是必需的,它只是起作用了。