Pergunta

Qual seria a melhor maneira de expor certas funcionalidades em um Dotnet VSTO Excel add-in para VBA, sem exigir que o usuário seja um administrador local (ou seja, sem COM registo, nenhum HttpListener )? Seria possível usar o Microsoft filas de mensagens de VBA?

Foi útil?

Solução

Se eu pode interpretar a sua pergunta tão amplamente como "Como faço para expor a funcionalidade em um .NET assembly para o Excel sem registro COM", em seguida, uma excelente solução é usar a relação XLL do Excel. Basicamente um implanta um calço xll e um associado DLL .NET. Quando o XLL é carregado, ele reflete sobre a dll e expõe as funções nele para o Excel.

Uma implementação de código aberto pode ser encontrada aqui http: //exceldna.typepad .com / blog / 2006/01 / introducing_exc.html

A, de código fechado comercial, mas mais rico em recursos um aqui http://www.managedxll.com/

Outras dicas

Você não pode simplesmente instanciar-los como objetos COM, como VSTO não será executado no domínio do aplicativo padrão.

Aqui está como eu fiz isso, que é reconhecidamente um pouco complicado. Este foi com uma VSTO livro guardado como um arquivo XLA, que em alguns aspectos é mais flexível do que um VSTO puro add-in.

  • Você precisa gerar uma biblioteca de tipos usando regasm.exe que será referenciado pelo seu código VBA.

  • Crie uma classe de fábrica de raiz em seu modelo de objeto .NET, que é capaz de instanciar qualquer uma das classes que você deseja consumir em VBA (algo como a classe "Aplicação" nos modelos de objeto do Office).

  • Em seguida, você precisa encontrar uma maneira de passar uma referência a uma instância desta classe de fábrica para VBA. Uma vez VBA tem uma referência a uma instância desta classe de fábrica, ele pode chamar seus métodos para instanciar quaisquer outros objetos em seu modelo de objeto .NET.

  • Para passar uma instância para VBA, definir uma macro em seu código VBA o seguinte

código Exemplo:

Private m_objMyFactory As Object

Public Sub RegisterFactory(MyFactory As Object)

    On Error GoTo ErrHandler
    Set m_objMyFactory = MyFactory
    Exit Sub
ErrHandler:
    MsgBox "An unexpected error occurred when registering the Factory component: " & Err.Description
    Exit Sub
End Sub
  • Agora adicione código para o manipulador de eventos VSTO ThisWorkbook_Open, que instancia seu objeto de fábrica e chama a macro acima passando uma referência para o objeto de fábrica.

código Exemplo:

void ThisWorkbook_Open()
{
     try
     {
         ThisApplication.Run("RegisterFactory",
             new MyNamespace.MyFactory(),
             Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
             Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
             Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
             Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
             Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
             Type.Missing, Type.Missing, Type.Missing, Type.Missing);
     }
     catch (Exception ex)
     {
         MessageBox.Show("Load error: " + ex.ToString());
     }
}

Existem mais algumas questões a considerar para começar este trabalho com firmeza -. Se você estiver interessado em seguir esta se deixe-me saber e eu vou postar mais detalhes

Você pode estar interessado em Excel4Net (é semelhante ao ExcelDNA e ManagedXll, mas mais fácil de usar):

site: http://www.excel4net.com

blog: http://excel4net.blogspot.com

Apenas para referência para futuros leitores: Você também pode querer ter um olhar para esta pergunta:

acessar um VSTO aplicação addin tipos de VBA (Excel )

e, em particular, para o blog que é referenciado lá:

VSTO add-ins, COMAddIns e RequestComAddInAutomationService

Por substituindo RequestComAddInAutomationService () você pode expor qualquer funcionalidade que você quer, através da definição de uma classe fachada que fornece pontos de entrada para todas essas características, e expondo essa classe para VBA.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top