VB.NET Class 与 COM 互操作,从 VBA (Access) 使用时缺少大多数属性

VB.NET Class with COM Interop, missing most properties when used from VBA (Access)

我写了一个 VB.NET class,它启用了 COM Interop,所以它可以在 VBA 中使用 - 特别是 MS Access。

class 在 VB.NET 中工作正常。 使用 Accees,我可以添加对它的引用,实例化主要对象并设置 return 一些属性。

但是 Access 无法识别与主 class 下的子 class 相关的任何内容。 VB.NET 公开这些 class 没有问题,但 VBA.

这仅仅是 COM Interop 的限制吗and/orVBA?

有解决办法吗?

不,你无法获得互操作来为你生成子 classes(出现在 VBA)

但是,请记住,嵌套 class 与非嵌套实际上是一样的。该子 class 实例无论如何都必须初始化。如果要将 classes 分开,您将无所不能。而且您可以在一个代码模块中放置许多 classes。

所以这纯粹是您正在寻找的语法偏好。

但是,您可以在主 class(变量区域为 public)中声明任何子 class 的公共实例。

举这个简单的例子。

Imports System.Runtime.InteropServices

<ClassInterface(ClassInterfaceType.AutoDual)>
Public Class Class1

   Private m_Company As String = ""

   Public Function MyHello()
       MsgBox("Hello world")
   End Function

   Public Property Company As String
       Get
           Return m_Company
       End Get
       Set(value As String)
           m_Company = value
       End Set
   End Property

   <ClassInterface(ClassInterfaceType.AutoDual)>
   Public Class Class2
       Private m_FirstValue As Integer = 2

       Public Property V1 As Integer
           Get
               Return m_FirstValue
           End Get
           Set(value As Integer)
               m_FirstValue = value
           End Set
       End Property

       Public Function MyTimes2() As Integer
           Return m_FirstValue * 2
       End Function

   End Class

End Class

注意上面嵌套的 class “class2”。

好的,所以检查 make com assembly visible = True,并检查“register for com interop”

编译以上,在Access中设置引用。 (请注意,您也不必构建自定义界面!!!)。

现在,在 VBA 中,您可以通过智能感知得到它。

注意子 class Class2 是如何不出现的。

如果你真的想要intel-sense和subclass出现,那么对上面的vb.netclass,简单的加上这个;

Public Class Class1

   Private m_Company As String = ""

   Public SClass2 As New Class2  <--- add this line to expose as public
   Private m_Company As String = ""

.etc. etc. etc.

现在我在名字的开头加上了一个“S”——不幸的是你不能使用与嵌套 class 相同的名字。 (所以要么在嵌套 class 前面放一些东西,要么在那个 class 的 public 实例前面放一些东西(这就是我在上面所做的)。

现在如果我们编译,那么在 VBA 你会得到这个:

请注意 class2 确实显示为子 class

如果我在 VBA 编辑器中点击一个“点”,那么子 class 方法显示如下:

所以很确定以上是让子classes与COM互操作

一起工作的唯一方法