Создайте UDF с использованием VSTO и без VBA

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

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

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

Спасибо


person ng5000    schedule 12.02.2009    source источник


Ответы (5)


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

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

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

Пол Стаббс объясняет в своем блоге, как работать с VSTO и VBA: < strong>Как создавать пользовательские функции 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 в VSTO

    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.

person Dirk Vollmar    schedule 18.02.2009
comment
Привет спасибо. Да, я знаю, что, используя некоторые VBA и COM, украшающие мой класс, я могу это сделать, но это не отвечает на вопрос, учитывая оговорки вопроса. - person ng5000; 19.02.2009
comment
Я отредактировал свой ответ, чтобы объяснить, почему я думаю, что нет никакого способа обойти COM или VBA. - person Dirk Vollmar; 19.02.2009

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

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

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

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

person Anonymous Type    schedule 31.07.2009

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

person Thedric Walker    schedule 18.02.2009
comment
Спасибо, но это связанное решение не использует VSTO, оно просто предоставляет типы сборки .Net для COM. - person ng5000; 18.02.2009
comment
Вы все еще говорите о двух функционально разных концепциях и не изменили свой вопрос, чтобы указать, почему так важно разместить UDF в том же проекте, что и проект VSTO. - person Anonymous Type; 19.07.2010

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

person T.Molnar    schedule 23.10.2010

Я не знаком с методом создания 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

person Jon Tackabury    schedule 17.02.2009
comment
Спасибо, но на вопрос, есть ли способ сделать это без VBA? Кажется, что это можно сделать с помощью VSTO SE, но можно ли это сделать только с чистым VSTO? - person ng5000; 18.02.2009
comment
Извините, я не знаю никакого чистого способа VSTO, только комбинацию VBA/VSTO. - person Jon Tackabury; 18.02.2009