2009-02-12 5 views
4

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

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

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

Благодаря

ответ

8

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

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

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

Пол Стаббс объясняет в своем блоге, как это сделать с VSTO и VBA: How to create Excel UDFs in VSTO managed code

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

    <System.Runtime.InteropServices.ComVisible(True)> 
    Public Class MyManagedFunctions 
        Public Function GetNumber() As Integer 
         Return 42 
        End Function 
    End Class 
    
  2. Wire вверх ваш класс 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() в клетке, когда первенствовать начинается ячейка значение должно быть 42.

+0

Привет - спасибо. Да, я знаю, что, используя некоторые VBA и COM, украшающие мой класс, я могу это сделать, но это не отвечает на вопрос, учитывая предостережения этого вопроса. – ng5000

+0

Я отредактировал свой ответ, чтобы объяснить, почему я думаю, что вокруг COM или VBA нет никакого пути. –

0

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

+0

Спасибо, но в соответствии с вопросом есть ли способ сделать это без каких-либо VBA? Похоже, это можно сделать с VSTO SE, но можно ли это сделать только с * чистым VSTO *? – ng5000

+0

Извините, я не знаю ни одного чистого пути VSTO, просто комбинация VBA/VSTO. –

1

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

+0

Спасибо, но это связанное решение не использует VSTO, оно просто предоставляет типы сборки .NET для COM. – ng5000

+0

Вы все еще говорите о двух функционально разных концепциях и не изменили свой вопрос, чтобы указать, почему так важно размещать UDF в том же проекте, что и проект VSTO. –

2

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

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

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

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

1

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