Pregunta

Tengo un complemento de automatización basado en RTDServer en funcionamiento:
¿Cómo creo un complemento de automatización de Excel en tiempo real en C# usando RTDServer?.

Crear un envoltorio VBA es trivial:

Function RtdWrapper(start)
    RtdWrapper = Excel.Application.WorksheetFunction.RTD("StackOverflow.RtdServer.ProgId", "", start)
End Function

Esto funciona. He intentado crear un envoltorio C# de la siguiente manera:

[ClassInterface(ClassInterfaceType.AutoDual)]
public class RtdWrappers
{
    private readonly Microsoft.Office.Interop.Excel.Application _application = new Application();

    public object Countdown(object startingCount)
    {
        var start = Convert.ToInt32(startingCount.ToString());
        return _application.WorksheetFunction.RTD("StackOverflow.RtdServer.ProgId", string.Empty, start);
    }

    [ComRegisterFunctionAttribute]
    public static void RegisterFunction(Type t)
    {
        Microsoft.Win32.Registry.ClassesRoot.CreateSubKey("CLSID\\{" + t.GUID.ToString().ToUpper() + "}\\Programmable");
    }

    [ComUnregisterFunctionAttribute]
    public static void UnregisterFunction(Type t)
    {
        Microsoft.Win32.Registry.ClassesRoot.DeleteSubKey("CLSID\\{" + t.GUID.ToString().ToUpper() + "}\\Programmable");
    }
}

Cuando ingreso "= Countdown (150)" en una celda en Excel, muestra el valor inicial de 150 que es devuelto por ConnectData pero que nunca se actualiza. ¿Hay alguna devolución de llamada que deba registrar? ¿Estoy instanciando el objeto de aplicación correctamente? ¿Qué me estoy perdiendo?

Gracias,

Franco

¿Fue útil?

Solución

De hecho, no está obteniendo el objeto de aplicación correcto. Una solución es implementar el Idtextensibility2 interfaz en su complemento. Esta interfaz tiene un método de OnConnection que Excel llamará al cargar su complemento. En este método, se le pasa el objeto de aplicación que puede mantener en una variable local para su uso posterior.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top