最近请朋友用VB.net开发了一个控制仪器的动态链接库,他生成了PM317.dll和PM317.tlb两个文件交给我。我把这两个文件拷贝到本地硬盘,在VBA中可以引用PM317.tlb。
他给我的VB.net引用例程如下(其中标红的是创建对象的关键语句):
我在VBA中的引用代码如下:
其中,对象InstrPM无法列出其成员。用VBA的对象浏览器浏览,发现Instrument的成员是空的
我的朋友无法解决这个问题,请大家指教。
在 VBA 中引用 DLL:在 VBA 中打开引用对话框,然后选择刚才生成的 DLL,即可在 VBA 中使用该 DLL。
使用 DLL:您现在可以在 VBA 代码中调用 .NET 代码,以使用您实现的功能。
请注意,要在 VBA 中使用 .NET DLL,该 DLL 必须是基于 .NET Framework,而不是 .NET Core。另外,请确保您在 VBA 中使用的版本与您开发的 .NET 版本相匹配。
我简单你可以尝试使用反射来访问PM317.dll中的类和成员,这样子可以在VBA中访问它们。
举个栗子:可以使用VBA的CreateObject函数来创建一个反射对象,然后使用它来访问PM317.dll中的类和成员。
具体步骤如下:
1、在Visual Studio中创建一个Class Library项目。
2、使用以下属性将该项目设置为Com可见:
3、在项目中定义需要导出的类,并使用System.Runtime.InteropServices命名空间中的ComVisible属性标识该类是Com可见的。
4、编译项目,生成.tlb文件。
5、在VBA代码中引用该类型库,并使用CreateObject函数创建一个对象实例。
6、使用该对象实例调用项目中定义的方法,从而实现与.NET代码的交互。
希望这个方法能帮助您在.NET环境中开发可以在VBA中引用的动态链接库。
在vb.net当中定义一个接口,并定义这个接口的方法和属性,然和在vba当中creatObject一个对象,调用它的属性,即类的属性,并和vb.net定义的接口方法一致,这样可以调用vb.net 中对象并方法。
你这个看似是com组件,需要注册的。另外看是否还有依赖的动态库不能缺的。很简单的,如果真搞不定可以远程协助。
1.打开VBA编辑器,点"工具"菜单下的"引用"命令,在引用对话框中引用该动态链接库。
调用代码如下:
Dim VBACls As New VBAPrj.VBACls
VBACls.Test(ThisDocument)
2.如果知道该动态链接库文件的位置,可以在ThisDocument代码窗口以代码形式引用,
代码如下:
Private Sub Document_Open()
On Error
Resume Next
Me.VBProject.References.AddFromFile
"D:\VBAPrj.dll"
End
Sub
3.将动态链接库文件拷贝到文档同一目录下,可在ThisDocument代码窗口中建立如下引用函数:
Private Function GetProjectDoc() As Object
On Error Resume
Next
Dim VBACls As Object
Set VBACls =
CreateObject("VBAPrj.VBACls")
If VBACls Is Nothing
Then
MsgBox "VBAPrj.dll必须和文档在同一目录下!"
Exit
Function
End If
Set GetProjectDoc =
VBACls
End Function
然后以以下代码形式调用Test:
Dim
objPrjDoc As Object
Set objPrjDoc = GetProjectDoc
Call
objPrjDoc.Test(ThisDocument)
Set objPrjDoc =
Nothing
=====
使用第一种方法调试提示找不到类库,第二种方法我没试过,用了第三种方法调试成功。我也觉得第三种还是蛮好的,除了多几行代码。成功调用DLL后原来很多在VB下写的东东简单改一下就可以在VBA下用了,效率又高,保密性又好
从您提供的信息看,可能出现问题的地方在于您在VBA中创建COM对象时的 ProgID 名称。在VB.net的例程中,对象创建的代码如下:
Dim Instrument As New PM317
其中 PM317 是 COM 对象的名称。而在您的 VBA 代码中,您创建 COM 对象的代码如下:
Dim InstrPM As Object
Set InstrPM = CreateObject("PM317")
其中 PM317 是 ProgID 名称,也就是 COM 对象在注册表中的名称。如果该名称不正确,那么 VBA 就无法正确创建该 COM 对象。
请尝试使用以下代码创建 COM 对象,看是否可以成功:
Dim InstrPM As Object
Set InstrPM = CreateObject("PM317.PM317")
其中 PM317.PM317 是 COM 对象的名称和命名空间。如果名称不正确,您可以尝试在命令行中执行 regedit 命令打开注册表,搜索 PM317,看是否可以找到正确的 ProgID。
可能是由于在 .NET 环境中生成的 DLL 文件不能直接在 VBA 中引用。要解决这个问题,可以通过以下步骤解决:
1.使用 Regasm.exe 工具注册 DLL 文件。这将生成一个 type library 文件,该文件定义了 DLL 中所有可供 VBA 调用的类型。
2.使用 Tlbexp.exe 工具生成类型库文件。
3.在 VBA 中引用生成的类型库文件。
具体的命令如下:
regasm PM317.dll /tlb:PM317.tlb
tlbexp PM317.dll /out:PM317.tlb
在执行这些命令之后,您可以再次在 VBA 中尝试引用生成的类型库文件,如果成功,则可以在 VBA 中看到控制仪器的所有可供调用的类型。