Нет, вы не можете получить взаимодействие для генерации подклассов для вас (для отображения в VBA)
Однако имейте в виду, что вложенные классы действительно такие же, как и не вложенные.Этот экземпляр подкласса ДОЛЖЕН быть так или иначе инициализирован.И нет ничего, что вы не можете сделать, если классы должны быть разделены.И вы можете легко разместить много классов в одном модуле кода.
Так что это чисто синтаксическое предпочтение, которое вы ищете.
Однако вы можете объявить открытый экземпляр любого подкласса.в основном классе (область переменных как public).
Возьмем этот простой пример.
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
ПРИМЕЧАНИЕ над вложенным классом «class2» выше.
Хорошо, так что проверьте сборку make com visible = True, а для тестирования проверьте «регистр для com interop»
Скомпилируйте выше, установите ссылку в Access.(Обратите внимание, что вам также не нужно создавать собственный интерфейс !!!).
Теперь в VBA вы получаете это в интеллектуальном смысле.
![enter image description here](https://i.stack.imgur.com/d0ZxZ.png)
Обратите внимание, что подкласс Class2 не отображается.
Если вы действительно хотите, чтобы intel-sense и подкласс появлялись, то к приведенному выше классу vb.net просто добавьтеthis;
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» в имени, к сожалению, вы не можете использовать то же имя, что и вложенный класс.(либо поместите что-нибудь перед вложенным классом, либо что-то перед общедоступным экземпляром этого класса (это то, что я делал выше).
Теперь, если мы скомпилируем, то в VBA вы получите это:
![enter image description here](https://i.stack.imgur.com/NggBX.png)
Обратите внимание, что class2 ДОЛЖЕН появиться как подкласс
И если я нажму «точку» в редакторе VBA, тометоды подкласса выглядят так:
![enter image description here](https://i.stack.imgur.com/9VuFe.png)
Так что вы можете быть уверены, что вышеприведенный вариант - единственный способ заставить подклассы работать с COM-взаимодействием