Подтвердить что ты не робот

Добавить функцию, определенную пользователем, в Visual Studio Excel Add-in

В visual studio у меня есть надстройка Excel 2010. Как я могу создать этот проект для следующего модуля:

enter image description here

Я знаю, что я могу сохранить эту книгу с этим модулем, а затем использовать ее с моим добавлением. Будет хорошо, если я смогу, чтобы моя надстройка создала этот модуль...

4b9b3361

Ответ 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;
    }
}