Добавить функцию, определенную пользователем, в Visual Studio Excel Add-in
В visual studio у меня есть надстройка Excel 2010. Как я могу создать этот проект для следующего модуля:
![enter image description here]()
Я знаю, что я могу сохранить эту книгу с этим модулем, а затем использовать ее с моим добавлением. Будет хорошо, если я смогу, чтобы моя надстройка создала этот модуль...
Ответы
Ответ 1
Можно создать модуль. Однако для этого в Excel необходимо выбрать параметр "Доверять доступ к модели проекта VB". Он выдает сообщение об ошибке, когда доступ запрещен, если параметр доверия не выбран.
using Excel = Microsoft.Office.Interop.Excel;
using VB = Microsoft.Vbe.Interop;
Excel.Application eApp = new Excel.Application();
eApp.Visible = true;
Excel.Workbook eBook = eApp.Workbooks.Add();
VB.VBProject eVBProj = (VB.VBProject)eBook.VBProject;
VB._VBComponent vbModule = eVBProj.VBE.ActiveVBProject.VBComponents.Add(VB.vbext_ComponentType.vbext_ct_StdModule);
String functionText = "Function MyTest()\n";
functionText += "MsgBox \"Hello World\"\n";
functionText += "End Function";
vbModule.CodeModule.AddFromString(functionText);
Ответ 2
Я не думаю, что VSTO поддерживает Excel UDF, общая рекомендация - использовать надстройку автоматизации (как предполагает ссылка Sid).
Другой вариант - вызвать управляемую функцию VSTO из VBA. Еще раз это не рекомендуется, но возможно.
(Рекомендация по ссылке из ссылки)
Вот простой способ вызова управляемых функций из VBA.
Создайте класс с вашими функциями в VSTO
<System.Runtime.InteropServices.ComVisible(True)> _
Public Class MyManagedFunctions
Public Function GetNumber() As Integer
Return 42
End Function
End Class
Подключите свой класс к VBA в VSTO
Private Sub ThisWorkbook_Open() Handles Me.Open
Me.Application.Run("RegisterCallback", New MyManagedFunctions)
End Sub
Создать Hook для управляемого кода и обертки для функций в VBA
В модуле VBA в вашей электронной таблице или документе
Dim managedObject As Object
Public Sub RegisterCallback(callback As Object)
Set managedObject = callback
End Sub
Public Function GetNumberFromVSTO() As Integer
GetNumberFromVSTO = managedObject.GetNumber()
End Function
Теперь вы можете ввести = GetNumberFromVSTO() в ячейке, когда excel начинает значение ячейки, должно быть 42.
http://blogs.msdn.com/b/pstubbs/archive/2004/12/31/344964.aspx
Ответ 3
Если то, что вы действительно хотите сделать, это написать .NET UDF или комбинированную команду уровня .NET и добавление UDF, тогда использование VSTO в настоящее время не является хорошим решением:
Я бы рекомендовал использовать либо Addin Express (затраты) или Excel DNA (бесплатно). из них позволяют создавать как дополнения .NET XLL UDF, так и дополнения к UDF для автоматизации (дополнения XLL UDF предлагают значительные преимущества в производительности, но с чуть более ограниченным доступом к объектной модели Excel)
Ответ 4
Приложение VSTO не может создавать UDF, поэтому вам нужно создать отдельное дополнение для функций. Хотя это дополнение может быть в той же DLL, что и добавление VSTO, вы не можете связываться между VSTO и UDF без особых обманщиков.
У меня есть сообщение в блоге об этом. Он дает вам полный пример проекта, который включает VSTO и UDF.
Вот основная структура самого UDF.
[Guid("3B81B6B7-3AF9-454F-AADF-FAF06E5A98F2")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
[ComVisible(true)]
public interface IFunctions
{
int MYINT();
}
[Guid("F58C591D-A22F-49AD-BC21-A086097DC26B")]
[ClassInterface(ClassInterfaceType.None)]
[ComVisible(true)]
public class Functions : IFunctions
{
public int MYINT()
{
return 42;
}
}