Создание UDF с использованием VSTO и без VBA - PullRequest
4 голосов
/ 12 февраля 2009

Аналогично этому вопросу (но в моем случае это не VSTO SE), однако я просто хочу подтвердить, что невозможно создать UDF с использованием чистого VSTO в Visual Studio 2005 и Excel 2003 - Итак, чтобы прояснить, мой вопрос:

Можно ли создать UDF для Excel 2003 с использованием Visual Studio 2005 и решения VSTO без использования каких-либо VBA или других приемов?

Я знаю о ManagedXLL, ExcelDNA, Excel4Net и т. Д., Но пока не хочу их рассматривать.

Спасибо

Ответы [ 5 ]

8 голосов
/ 18 февраля 2009

Относительно того, есть ли способ обойти COM или VBA, я не думаю, что это возможно (по крайней мере, без каких-либо очень грязных уловок). Причина в том, что Office может выполнять внешний код (то есть, надстройку) только через COM. Даже VSTO все еще использует старый COM-интерфейс IDTExtensibility2. IDTExtensibility2 - это интерфейс COM, который должны быть реализованы всеми надстройками для приложений Microsoft Office.

До появления VSTO надстройкам Office приходилось самостоятельно реализовывать этот интерфейс IDTExtensibility2. В такой надстройке на основе COM (или управляемой надстройке, видимой для COM) вы можете просто добавить свой UDF, как описано здесь .

Однако теперь с VSTO существует дополнительный уровень абстракции: VSTO использует так называемый Solution Loader , реализующий IDTExtensibility2, который является dll, предоставляемым средой выполнения VSTO. Это означает, что ваша надстройка больше не видна COM. Следовательно, если вы добавили UDF в свою надстройку VSTO, она не будет видна Office.

Пол Стаббс объясняет в своем блоге, как делать с VSTO и VBA: Как создавать UDF Excel в управляемом коде VSTO

  1. Создайте класс со своими функциями в VSTO

    <System.Runtime.InteropServices.ComVisible(True)>
    Public Class MyManagedFunctions
        Public Function GetNumber() As Integer
            Return 42
        End Function 
    End Class
    
  2. Подключите свой класс к VBA во ВСТО

    Private Sub ThisWorkbook_Open() Handles Me.Open
        Me.Application.Run("RegisterCallback", New MyManagedFunctions)
    End Sub
    
  3. Создание хука для управляемого кода и оболочки для функций в 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.

2 голосов
/ 31 июля 2009

Я не понимаю, почему вы хотите это сделать?

VSTO и предоставление UDF через COM-взаимодействие (из .NET) - две разные задачи. Почему вы хотите разместить метод UDF внутри проекта VSTO?

То, как вы регистрируете сборку .net UDF, означает, что она должна быть в отдельном проекте для проекта VSTO. Однако, если вы хотите обмениваться данными между двумя приложениями, у вас есть множество собственных методов .net для этого или просто «вызов» функции UDF из соответствующего объекта диапазона в вашем проекте VSTO.

Есть ли причина, по которой вы считаете необходимым иметь UDF во ВСТО?

1 голос
/ 24 октября 2010

Создайте UDF, как объяснил Эрик Картер, и передайте в качестве параметра в UDF диапазон Excel. Вы можете получить доступ к объектной модели Excel через VSTO, используя указанный диапазон: Excel.Range rg = param1 as Excel.Range; Excel.Workbook wb = rg1.Worksheet.Application.ActiveWorkbook;

1 голос
/ 18 февраля 2009

В этой статье Эрик Картер продолжает объяснять, как делать то, что вы просите. В верхней части он даже ссылается на обновление вышеупомянутого сообщения в блоге.

0 голосов
/ 17 февраля 2009

Я не знаком с методом создания UDF в Excel 2003 с использованием VS2005 и VSTO, не имея хотя бы немного VBA. Вот 2 ссылки, которые обсуждают это немного дальше:

http://geekswithblogs.net/Denis/archive/2007/01/03/102623.aspx

http://blogs.msdn.com/pstubbs/archive/2004/12/31/344964.aspx

...