Вызвать незарегистрированную .NET dll из Excel VBA

Мне нужно написать .NET dll, которая может быть вызвана непосредственно из модуля VBA Excel, так что dll и .xls просто развертываются в том же каталоге без регистрации COM.

Цель dll – запустить алгоритмы, реализованные в C.

Как мне продолжить? Это вообще возможно?

Вы не объясните, какая роль .NET будет в вашем сценарии. Вы действительно можете вызывать множество библиотек C непосредственно из VBA, используя «Объявить функцию».

Если вы считаете, что .NET полезен и хотите вызывать функции библиотеки .NET как пользовательские функции (UDF) из Excel, вы можете использовать Excel-DNA . Он предоставляет библиотеку дополнений .xll, которая интегрирует вашу библиотеку .NET в Excel. Вам все равно нужно открыть надстройку .xll – либо через File -> Open, добавив ее как надстройку Excel, либо автоматически из некоторого VBA в вашей книге. Но он не нуждается в другой регистрации.

Из библиотеки .NET вы можете вызывать функции C .dll с помощью P / Invoke, добавлять категории, описания функций и аргументов для интеграции в мастер функций и т. Д.

(Отказ от ответственности: я разработчик Excel-DNA.)

Вы видели эту статью MSDN ? В основном вы регистрируете функции из DLL, а не самой DLL. Я не знаю, ясно ли это в статье, но синтаксис:

[Public | Private] Declare Function name Lib "libname" [Alias "aliasname"] [([arglist])] [As type] 

где «libname» может содержать полный путь, например «C: \ tmp \ algo.dll» или только имя, например «algo.dll». Во втором случае локальный путь будет искать соответствующий двоичный файл.

Если DLL содержит функции C, вам следует избегать .net и CLR. Это лишние накладные расходы.

Вместо этого используйте компилятор C, например, MSVC, чтобы создать DLL и экспортировать нужные функции из этой DLL. Затем импортируйте DLL-функции в VBA с помощью операторов Declare .

Когда вы создаете функции C в DLL, убедитесь, что вы используете __stdcall вызове __stdcall поскольку это единственный вариант с Declare . Вам также может потребоваться использовать файл .def при создании библиотеки DLL, чтобы избежать украшения имени.

Очень простой пример:

С

 int __stdcall add(int a, int b) { return a+b; } 

VBA

 Public Declare Function add Lib "mylib.dll" (ByVal a As Long, ByVal b As Long) As Long 
  • Открытие защищенного паролем файла Excel в запросах C ++ или C # для пароля, хотя я передал аргумент для пароля
  • Могу ли я читать файлы Excel с помощью драйвера ACE OleDbConnection Excel из файла System.IO.Stream, который нельзя найти, а не файла?
  • Прочитать excel через ADO.NET с помощью команд SQL Server?
  • Как экспортировать DataTable в Excel, но сохранить форматирование
  • C #, разрешающая имена столбцов таблицы Excel, некоторые из которых являются датами
  • Программно экспортировать файлы Excel в XML с помощью xmlMaps
  • Межпроцессная связь между приложением Excel & C #?
  • Ресурсы для обучения c # Excel interop
  • Добавление меток в маркеры в Excel из столбца в C #
  • Планировщик заданий не запускает Excel в приложении
  • Почему класс читателя excel читает каждое поле правильно, за исключением поля даты?
  • Interesting Posts

    Как я могу конкатенировать строки, только если значение еще не существует

    Получить список пользовательских функций в Excel с помощью C #

    pandas redefine isnull игнорировать 'NA'

    Необработанное исключение: System.Runtime.InteropServices.COMException (0x800A03EC)

    Декодирование пользовательского времени Excel в PHP

    Графический цвет графика Excel 2010 без VBA-соединения с кубом (SSAS)

    Excel 2016 Сортировка по дате сортировки по алфавиту

    VBA находит ряд одинаковых значений в столбце и вычисляет среднее значение

    Изменение цвета ячеек в зависимости от дня недели

    Есть ли способ для VBA (в Office 2011 для Mac) запускать AppleScript?

    График графика графики от Matlab, как изменить цвета?

    Дифференцировать числа и дату в MSExcel

    Excel VBA – как ввести порядковый номер страницы

    Ошибка Invalid Argument с командой DoCmd.TransferSpreadhseet?

    Как я могу использовать excel для подсчета количества ячеек, которые ovelarp в заданном диапазоне?

    Давайте будем гением компьютера.