Excel-DNA имеет возможность напрямую выставлять ваши классы .NET в COM, поэтому вы можете использовать их непосредственно из VBA в качестве обычных классов COM.
Чтобы сделать это ваш класс должен быть ComVisible (или вся сборка должна быть ComVisible), и вы должны пометить ExternalLibrary как COMSERVER = «истинный» в файле .dna, что-то вроде:
<DnaLibrary RuntimeVersion='v4.0' />
<ExternalLibrary Path='MyAddIn.dll' ComServer='true' />
</DnaLibrary>
Тогда у вас есть несколько вариантов для регистрации: вызывайте «Regsvr32.exe MyAddInDna.xll» или в AutoOpen вашей надстройки, вызовите ExcelDna.Integration.ComServer.RegisterServer()
Оба эти настройки реестра чтобы файл .xll стал COM-сервером для ваших классов. Затем вы можете получить к ним доступ по поздней ссылке из VBA с помощью CreateObject («MyNameSpace.MyClass»).
Вам нужно еще один шаг, чтобы настроить библиотеку типов (чтобы дать вам intellisense в VBA). Для этого вы создаете библиотеку типов с помощью tlbexp.exe. Вызов regsvr32/ComServer.RegisterServer найдет библиотеку типов и зарегистрирует ее.
Вы также можете упаковать DLL-файл в ваш .xll-файл (добавив атрибут pack = 'true' к тегу ExternalLibrary), а библиотека типов также будет упакована, если она есть, и зарегистрирована на ресурсе в .xll файл, когда вы вызываете Regsvr32.exe
Таким образом, конечным результатом может быть один файл .xll надстройка, которая является надстройкой Excel с UDF, лентами, RTD-серверами, а также COM-сервером, к которому вы можете получить доступ из VBA.
Дополнительная информация в обсуждениях здесь: http://exceldna.codeplex.com/discussions/252721 и здесь: http://groups.google.com/group/exceldna/browse_frm/thread/4c5a71efbe96d885.
Удивительный! Я подумал, что есть лучший способ сделать это, чем то, что я пытался. И @Govert, это отличное программное обеспечение, которое вы написали. Продолжайте в том же духе! – mwolfe02
Можно ли использовать ту же функцию как UDF в Excel и VBA через COM, или мне нужно написать функции оболочки в .NET? – mwolfe02
Функции, экспортируемые как UDF, должны быть «статическими», тогда как методы, видимые в COM, должны быть методами экземпляра.Таким образом, чтобы иметь те же функции, что и функции рабочего листа и вызываемые из COM-объекта, вам понадобится некоторая упаковка. Возможно, вам придется иметь дело с некоторыми параметрами и переназначением возвращаемого значения, слишком - значения ошибок, отсутствующие аргументы и диапазоны становятся раздельно распределенными в вызовах UDF Excel и вызовах VBA/COM. – Govert