Класс VB.NET с COM Interop, при использовании VBA (Access) отсутствует большинство свойств. - PullRequest
0 голосов
/ 03 марта 2019

Я написал класс VB.NET с включенным COM-взаимодействием, чтобы его можно было использовать в VBA, в частности, MS Access.

Класс отлично работает в VB.NET.С помощью Accees я могу добавить ссылку на него, создать экземпляр основного объекта, установить и вернуть некоторые свойства.

Но Access не распознает ничего, относящегося к подклассам под основным классом.VB.NET не имеет проблем с отображением этих классов, но не VBA.

Это просто ограничение COM Interop и / или VBA?

Есть ли обходной путь?

1 Ответ

0 голосов
/ 03 марта 2019

Нет, вы не можете получить взаимодействие для генерации подклассов для вас (для отображения в 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

Обратите внимание, что подкласс 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

Обратите внимание, что class2 ДОЛЖЕН появиться как подкласс

И если я нажму «точку» в редакторе VBA, тометоды подкласса выглядят так:

enter image description here

Так что вы можете быть уверены, что вышеприведенный вариант - единственный способ заставить подклассы работать с COM-взаимодействием

...