Estoy usando Excel 2007. Tengo el código C# escrito en un binario por separado. El código usa clases estáticas y métodos estáticos en las clases. Tengo una referencia a la DLL en mi proyecto VSTO Excel Worksheet. ¿Qué debo agregar o modificar para que esto funcione?Métodos de llamada escritos en C# en Excel 2007 a partir de las fórmulas de celda
Mi C# código es el siguiente:
using System;
using System.Collections.Generic;
using Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;
namespace FooStatistics
{
[ComVisible(true)]
public static class Statistics
{
public static int Count(Range range)
{
return range.Count;
}
Quiero ser capaz de poner una fórmula en una celda de Excel que tiene este aspecto:
=FooStatistic.Statistic.Count(A1:A10)
O lo que sea.
He visto this pero parece ser para clases no estáticas en Excel 2003. No puedo creer que la integración no sea mejor ahora.
He visto muchas preguntas de StackOverflow sobre esto. No parecen proporcionar integración nativa (muchos dicen, "Usar X biblioteca de código abierto") y, siniestramente, muchos no son aceptados por el OP. No estoy buscando, "Convertirlo en un objeto COM y llamarlo desde VBA".
Así que estoy buscando:
- Excel código 2007
- en C# DLL
- llamada de celda de Excel como UDF
- integración nativa
Así que aquí es another StackOverflow link, en el que dos respondedores dicen:
- Hasta donde yo sé, no puede crear UDF directamente en VSTO.
- VSTO no tiene soporte para crear UDF de Excel. Los complementos de automatización se pueden crear en .Net, y parecen ser la forma aprobada por Microsoft de hacerlo.
Esta es una pregunta de junio de 2009. ¿Es esto cierto - en el año 2009 tiene que exponer a sus componentes .NET como servidores COM para obtener UDF que se puede llamar para Excel?
Huh. Estoy pasando por todas las etapas del desarrollo de software: ira, negación, negociación, depresión y aceptación. – hughdbrown
Entonces, cuando hago todo esto, recibo una advertencia en tiempo de compilación "... no contiene ningún tipo que pueda registrarse para COM Interop". Sospecho que esto es porque he usado una clase estática con métodos estáticos. ¿* Necesito * tener una clase pública no estática? O se trata de otra cosa? – hughdbrown
Así puedo hacer que esto funcione, siempre que no utilice clases estáticas ni métodos estáticos. Termino con un objeto falso que no tiene propiedades o métodos reales pero al que puedo llamar. Suspiro. – hughdbrown