Вот ответ canonical на 3 основных метода вызова .Net из Excel (или VBA).
Все три способа работы в .Net 4.0.
1. XLLs
3-й поставщик партия Надстройка Экспресс функциональность предложение XLL, однако его легко и свободно использовать Excel-ДНК автор здесьhttps://stackoverflow.com/users/44264
Вот выдержка со страницы Excel-ДНК: https://excel-dna.net/
Введение
Excel-DNA - это независимый проект по интеграции .NET в Excel. С помощью Excel-DNA вы можете создавать собственные (.xll) надстройки для Excel с помощью C#, Visual Basic.NET или F #, предоставляя высокопроизводительные пользовательские функции (UDF), настраиваемые ленточные интерфейсы и многое другое. Вся ваша надстройка может быть упакована в один .xll-файл, не требующий установки или регистрации.
Начало работы
Если вы используете версию Visual Studio, который поддерживает менеджер NuGet пакетов (включая Visual Studio 2012 Express, для рабочего стола Windows), самый простой способ сделать Excel-ДНК надстройка is to:
Создайте новый проект библиотеки классов в Visual Basic, C# или F #. Используйте Управление NuGet пакетов диалоговой или Package Manager Console для установки пакета Excel-ДНК:
PM> Install-Package Excel-DNA
Добавьте свой код (C#, Visual Basic.NET или F #):
using ExcelDna.Integration;
public static class MyFunctions
{
[ExcelFunction(Description = "My first .NET function")]
public static string SayHello(string name)
{
return "Hello " + name;
}
}
Compile, загружать и использовать функцию в Excel:
=SayHello("World!")
2. автоматизации AddIns
Эта статья Эрик Картер показывает, как d o это, в статье отсутствуют кучи изображений, поэтому я копирую/вставляя всю статью и воссоздавая изображения для сохранения.
REF: https://blogs.msdn.microsoft.com/eric_carter/2004/12/01/writing-user-defined-functions-for-excel-in-net/
Excel позволяет создавать определяемые пользователем функции, которые могут быть использованы в формулах Excel. Разработчик должен создать специальный вид DLL, называемый XLL. Excel также позволяет писать пользовательские функции в VBA, которые можно использовать в формулах Excel. К сожалению, Excel не поддерживает или не рекомендует писать XLL, который использует управляемый код. Если вы готовы принять ваши шансы на то, что ваш XLL не будет работать в текущих или будущих версиях Excel, есть доступные решения, которые позволяют этот сценарий искать в Интернете «управляемый XLL».
К счастью, существует более простой способ создания пользовательской функции, которая не требует создания библиотеки XLL. Excel XP, Excel 2003 и Excel 2007 поддерживают что-то, называемое надстройкой автоматизации. Надстройка автоматизации может быть создана довольно просто на C# или VB.NET. Я приведу вам пример на C#.
Сначала запустите Visual Studio и создайте новый проект библиотеки классов C# под названием AutomationAddin для этого примера.
Затем в файле Class1.cs введите код, показанный ниже. Замените GUID своим собственным GUID, который вы создаете, используя Generate GUID в меню «Инструменты» Visual Studio.
using System;
using System.Runtime.InteropServices;
using Microsoft.Win32;
namespace AutomationAddin
{
// Replace the Guid below with your own guid that
// you generate using Create GUID from the Tools menu
[Guid("A33BF1F2-483F-48F9-8A2D-4DA68C53C13B")]
[ClassInterface(ClassInterfaceType.AutoDual)]
[ComVisible(true)]
public class MyFunctions
{
public MyFunctions()
{
}
public double MultiplyNTimes(double number1, double number2, double timesToMultiply)
{
double result = number1;
for (double i = 0; i < timesToMultiply; i++)
{
result = result * number2;
}
return result;
}
[ComRegisterFunctionAttribute]
public static void RegisterFunction(Type type)
{
Registry.ClassesRoot.CreateSubKey(GetSubKeyName(type, "Programmable"));
RegistryKey key = Registry.ClassesRoot.OpenSubKey(GetSubKeyName(type, "InprocServer32"), true);
key.SetValue("", System.Environment.SystemDirectory + @"\mscoree.dll",RegistryValueKind.String);
}
[ComUnregisterFunctionAttribute]
public static void UnregisterFunction(Type type)
{
Registry.ClassesRoot.DeleteSubKey(GetSubKeyName(type, "Programmable"), false);
}
private static string GetSubKeyName(Type type, string subKeyName)
{
System.Text.StringBuilder s = new System.Text.StringBuilder();
s.Append(@"CLSID\{");
s.Append(type.GUID.ToString().ToUpper());
s.Append(@"}\");
s.Append(subKeyName);
return s.ToString();
}
}
}
С помощью этого кода, написанного, показывают свойства проекта, дважды щелкнув на узле свойств в рамках проекта в обозревателе решений. Перейдите на вкладку «Сборка» и установите флажок «Регистрация для COM-взаимодействия». На этом этапе у вас есть дополнительный шаг, если вы работаете в Windows Vista или выше. Visual Studio должен запускаться с правами администратора для регистрации для COM-взаимодействия. Сохраните проект и выйдите из Visual Studio. Затем найдите Visual Studio в меню «Пуск» и щелкните правой кнопкой мыши по нему и выберите «Запуск от имени администратора». Повторно запустите проект в Visual Studio. Затем выберите «Build», чтобы создать надстройку.
Теперь запустите Excel и попасть в диалог серверов автоматизации, выполнив следующие действия:
Запуск Excel и нажмите кнопку Microsoft Office в левом верхнем углу окна.
Выберите опции Excel.
Перейдите на вкладку надстроек в диалоговом окне «Параметры Excel».
Выберите «Надстройки Excel» из поля со списком «Управление». Затем нажмите кнопку «Перейти».
Нажмите кнопку «Автоматизация» в диалоговом окне «Надстройки».
Вы можете найти класс, созданный с помощью поиска AutomationAddin.MyFunctions в списке автоматизации надстроек:
Теперь давайте попробуем использовать функция MultiplyNTimes внутри Excel. Сначала создайте простую таблицу, в которой есть число, второе число и несколько первого, а третье число - сколько раз вы хотите умножить первое число на второе число. Пример таблицы показано здесь:
Нажмите на пустую ячейку, в книге под номерами, а затем нажмите на кнопку Insert Function в строке формул. В диалоговом окне доступных формул снимите раскрывающийся список «Или выберите категорию» и выберите «AutomationAddin.MyFunctions.
Затем нажмите на функцию MultiplyNTimes, как показано здесь:
При нажатии на кнопку OK, Excel всплывает диалоговое окно, чтобы помочь вы извлекаете аргументы функции из таблицы, как показано здесь:
Наконец, нажмите кнопку OK, чтобы увидеть окончательную таблицу, как показано здесь с пользовательской формулой в ячейке C3.
3. Вызов .Net из Excel VBA
REF: Calling a .net library method from vba
Использование кода из проекта Automation.AddIn можно легко вызвать функцию MultiplyNTimes из Excel VBA.
Сначала добавьте ссылку на DLL из Excel, для этого вам нужно будет находиться в редакторе VB.Нажмите Alt + F11, затем выберите меню Инструменты и Ссылки:
Выберите AutomationAddIn DLL:
Добавить VBA код для вызова .Net DLL:
Sub Test()
Dim dotNetClass As AutomationAddIn.MyFunctions
Set dotNetClass = New AutomationAddIn.MyFunctions
Dim dbl As Double
dbl = dotNetClass.MultiplyNTimes(3, 2, 5)
End Sub
И эй престо!
Наконец, есть несколько отличных статей MSDN о Excel и .Net на «Эндрю Whitechapel» - google them
Установили ли вы [Visual Studio Tools for Office Runtime] (https://msdn.microsoft.com/en-us/library/ee712596.aspx)? – Tim
TLB все еще существуют с CLR4 (в C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319). в чем именно проблема?: –
Я считаю, что это связано с регистрацией dll. Взглянуть. Надеюсь, поможет. http://www.geeksengine.com/article/register-dll.html – sam