Я не думаю, что инструменты VSTO действительно стоят того, и, кроме того, если вы создадите «надстройку», то такая надстройка будет загружаться при запуске Access для ВСЕХ приложений Access, а неограничено вашим одним приложением.А необходимость регистрации надстройки в офисе OFTEN приведет к проблемам при запуске в Access.Таким образом, ваша надстройка должна будет загружаться и загружаться для ЛЮБОГО и ВСЕХ случаев, когда Access по какой-либо причине просто запускается.
Все инструменты VSTO действительно настраивают com-интерфейс для офиса, и на самом деле гораздо проще создать «простой» класс в .net, а затем использовать его с помощью кнопки VBA при доступе.
Таким образом, простой подход состоит в том, чтобы «просто» использовать класс .net из кода VBA / office.Взаимодействие с VSTO на самом деле не очень помогает, и к тому времени, когда вы получите все, что работает с VSTO, вы уже давно закончите, просто написав простой класс в .net.
Несколько советов: убедитесь, что вы проверилиполе в .net «регистр» для COM-взаимодействия.Имейте в виду, что эта опция ТОЛЬКО выполняет регазм для вашего удобства во время процесса разработки на вашем компьютере разработчика.
Другая опция (которая по умолчанию установлена по умолчанию !!!) находится в области сборки, и вы простодолжны убедиться, что «сделать сборку видимой для COM).
Для распространения вам нужно будет включить небольшой пакетный файл или использовать установщик.Этот простой пакетный файл или установщик должен выполнить «regasm» на целевых машинах (вы не компьютер dev).
И убедитесь, что вы форсируете проект на x86 (при условии, что вы используете Office x32, что, безусловно, имеет место).Поэтому НЕ используйте «любой» процессор, но принудительно применяйте проект к процессору x86.
Кроме того, вот и все.
Вот простой класс .net.Предполагая .net 4.5 или новее, это позволяет вам создавать zip-файлы из Access VBA.
(вам нужны как system.IO.Compression, так и system.io.compression.Filesystem в качестве ссылок в вашем проекте .net.Результатом является архивирование файлов из Access без каких-либо сторонних инструментов.
Таким образом, класс в .net выглядит так:
Imports System.Runtime.InteropServices
Imports System.IO.Compression
Imports System.IO
<ClassInterface(ClassInterfaceType.AutoDual)>
Public Class AlbertCom1
Private m_Times2 As Integer
Public Sub MsgHello()
MsgBox("Hello world", MsgBoxStyle.Information, "VB.net example")
End Sub
Public Sub MyZipper(strFileName As String, strZipFile As String)
Using archive As ZipArchive = ZipFile.Open(strZipFile, ZipArchiveMode.Update)
archive.CreateEntryFromFile(strFileName, Path.GetFileName(strFileName), CompressionLevel.Fastest)
End Using
End Sub
Public Function GetConValue(strSetting As String) As String
' read a simple value from config file
Return My.Settings(strSetting).ToString
End Function
Public Property Times2 As Integer
Get
Return m_Times2
End Get
Set(value As Integer)
m_Times2 = value * 2
End Set
End Property
End Class
Таким образом, вышеприведенный текст довольно прост и короток.
В Access VBA за нашей кнопкой мы можем использовать следующий код:
Вызовите / используйте метод окна сообщения Hello сверху:
Sub TestCOMHello()
Dim mycom As Object
Set mycom = CreateObject("AlbertCom1.AlbertCom1")
mycom.MsgHello
End Sub
Обратите внимание, как указано выше привязка LATE -это будет работать без ссылки в VBA на объект. (поэтому требуется createObject ()).
Однако в следующих примерах используется раннее связывание, но все будет работать, как описано выше, для создания объекта.
Zip-файл из VBA:
Sub TestCOMZip()
Dim strFromFile As String
Dim strToFile As String
Dim mycom As New AlbertCom1.AlbertCom1
strFromFile = "c:\test\data.txt"
strToFile = "c:\test\data.zip"
mycom.MyZipper strFromFile, strToFile
End Sub
Еще несколько советов:
Вам не нужно создавать пользовательский интерфейс в своем классе, и многие "хмурились"«При использовании AutoDual, я думаю, что такой подход очень хорош.«Примеры» в Интернете, которые тратят все это время на создание пользовательского интерфейса, на самом деле являются лишь оправданием мировой бедности.
Последний большой совет: НЕ выставляйте в своем классе несовместимые типы данных.Если вы выставите (случайно или преднамеренно) какой-либо .NET-объект TYPE, который не совместим со стандартными объектами «com», тогда ваш .net-класс будет хорошо скомпилирован, но Access не будет правильно видеть или потреблять объект.Поэтому сохраняйте (объявляйте) эти переменные и процедуры как частные в фактическом классе.(Другой код и части не имеют значения - я говорю только об одном классе).
Так что, например, не раскрывайте тип данных .net long.Если вы придерживаетесь строк, стандартных коллекций, массивов и т. Д., То все будет в порядке.И вы на самом деле «можете» выставлять несовместимые типы объектов как «объект» из .net.(Intel Access в Access не будет показывать методы объектов, но вы все равно можете их использовать).
И хотя публичные функции и даже публичные переменные наиболее просты для ваших методов объекта, здесь используетсяполучить / установить в соответствии со «стандартным» подходом к тому, как создаются методы класса.
Итак, в .net у нас есть:
Public Property Times2 As Integer
Get
Return m_Times2
End Get
Set(value As Integer)
m_Times2 = value * 2
End Set
End Property
А в вашем VBA-коде мы имеем:
Sub TestTimes()
Dim mycom As New AlbertCom1.AlbertCom1
mycom.Times2 = 40
Debug.Print mycom.Times2
End Sub
output: 80
NОтметьте для раннего связывания, тогда редактор Access VBA «выплюнет» свойства и методы класса:
Например:
В целом использование VSTO - это ОГРОМНОЕ излишество.Просто создайте простой класс .net, чтобы показать, что вам нужно использовать / вызывать из VBA, и вы отправляетесь в гонки.И еще одно БОЛЬШОЕ преимущество - это то, что этот COM-объект можно использовать из сценариев Windows, VB6, FoxPro, Excel, Word, Power-Point и т. Д. Другими словами, вы не ограничены какой-либо одной платформой или JUST Access для использования + использования вашего простого класса.Вы выставляете как COM-объект.В большинстве случаев мне трудно представить аргументы в пользу ВСТО.Таким образом, этот объект теперь может быть легко использован из ЛЮБОГО офисного приложения (код VBA).