Я видел статью о создании Excel UDF в управляемом коде VSTO с использованием VBA: http://blogs.msdn.com/pstubbs/archive/2004/12/31/344964.aspx.
Однако я хочу, чтобы это работало в надстройке C# Excel с использованием VSTO 2005 SE, может ли кто-нибудь помочь?
Я попробовал технику, указанную Роменом, но при попытке загрузить Excel получаю следующее исключение:
The customization assembly could not be found or could not be loaded. You can still edit and save the document.....
Подробности:
Type mismatch. (Exception from HRESULT: 0x80020005 (DISP_E_TYPEMISMATCH))
************** Exception Text **************
System.Runtime.InteropServices.COMException (0x80020005): Type mismatch. (Exception from HRESULT: 0x80020005 (DISP_E_TYPEMISMATCH))
at Microsoft.Office.Interop.Excel._Application.Run(Object Macro, Object Arg1, Object Arg2, Object Arg3, Object Arg4, Object Arg5, Object Arg6, Object Arg7, Object Arg8, Object Arg9, Object Arg10, Object Arg11, Object Arg12, Object Arg13, Object Arg14, Object Arg15, Object Arg16, Object Arg17, Object Arg18, Object Arg19, Object Arg20, Object Arg21, Object Arg22, Object Arg23, Object Arg24, Object Arg25, Object Arg26, Object Arg27, Object Arg28, Object Arg29, Object Arg30)
at ExcelWorkbook4.ThisWorkbook.ThisWorkbook_Startup(Object sender, EventArgs e) in C:\projects\ExcelWorkbook4\ExcelWorkbook4\ThisWorkbook.cs:line 42
at Microsoft.Office.Tools.Excel.Workbook.OnStartup()
at ExcelWorkbook4.ThisWorkbook.FinishInitialization() in C:\projects\ExcelWorkbook4\ExcelWorkbook4\ThisWorkbook.Designer.cs:line 66
at Microsoft.VisualStudio.Tools.Applications.Runtime.AppDomainManagerInternal.ExecutePhase(String methodName)
at Microsoft.VisualStudio.Tools.Applications.Runtime.AppDomainManagerInternal.ExecuteCustomizationStartupCode()
at Microsoft.VisualStudio.Tools.Applications.Runtime.AppDomainManagerInternal.ExecuteCustomization(IHostServiceProvider serviceProvider)
************** Loaded Assemblies **************





Создать UDF с помощью простой надстройки автоматизации довольно просто. Вам нужно будет создать специальную сборку и сделать ее видимой из COM. К сожалению, вы не можете определить UDF в управляемом надстройке VSTO Excel.
В любом случае, есть обходной путь, который я считаю очень ограничивающим. Описывается в этом обсуждении. По сути, вашему надстройке необходимо ввести некоторый код VB в каждую книгу, чтобы зарегистрировать UDF, который она содержит.
Вам также стоит взглянуть на ExcelDna - http://www.codeplex.com/exceldna. ExcelDna позволяет управляемым сборкам предоставлять в Excel определяемые пользователем функции (UDF) и макросы через собственный интерфейс .xll. У проекта открытый исходный код, и его можно свободно использовать в коммерческих целях.
Пользовательские функции могут быть написаны на C#, Visual Basic, F#, Java (с использованием IKVM.NET) и могут быть скомпилированы в .dll или представлены через текстовый файл сценария. Поддерживаются версии Excel от Excel 97 до Excel 2007.
Некоторые преимущества использования интерфейса .xll по сравнению с надстройками автоматизации: