A busca pela dica de função personalizada do Excel

100

Esta pergunta já foi feita antes , mas cada vez que a resposta aceita é simplesmente uma renúncia para fornecer descrições de função usando Application.MacroOptions( VBA6 ) ( VBA7 ), mas essa informação não aparece realmente como uma dica de ferramenta, então não resolve meu problema.

O objetivo

O que todos desejamos é ser capaz de definir funções personalizadas por qualquer meio (VBA, VSTO ou suplemento COM) e dar ao usuário o benefício de uma descrição pop-up / dica de ferramenta da função e seus parâmetros, como aparece para todas as funções integradas do Excel, inline ou na barra de fórmulas:

insira a descrição da imagem aqui

insira a descrição da imagem aqui

A resposta amplamente aceita para essa necessidade é que não é possível para funções personalizadas, mas desejo desafiar essa crença.

O problema

Atualmente, o melhor que já vi alguém fazer é definir funções (geralmente usando a chamada MacroOptions acima) para que, ao abrir a caixa de diálogo da função (o botão fx na barra de fórmulas), suas descrições de função e parâmetro apareçam como abaixo:

insira a descrição da imagem aqui

Como você pode ver, esta é uma função complicada com muitos parâmetros. Se o usuário não estiver ciente dessa caixa de diálogo de "argumentos de função" e como abri-la e, em vez disso, estiver familiarizado apenas com a dica de ferramenta padrão do Excel, verá apenas o nome da fórmula e nenhuma ajuda adicional:

insira a descrição da imagem aqui

Com o qual eles não têm chance de fornecer corretamente os parâmetros necessários. (Sem ler a documentação, o que, claro, nenhum usuário faz.)

Agora, um usuário avançado pode saber que, digitando Ctrl+ Shift+ A, ele receberá uma lista auto-completada de parâmetros de função como:

insira a descrição da imagem aqui

Mas é claro, temos o mesmo problema acima, que é que os usuários padrão do Excel só estarão acostumados com o comportamento padrão da primeira imagem e provavelmente nunca terão aprendido esse recurso.

Deve estar claro neste ponto porque isso não é suficiente e queremos o que cada função integrada tem - a dica de ferramenta em linha que informa ao usuário como usar a função.

A provocação

No começo, eu poderia estar convencido de que isso simplesmente não é possível, exceto com as funções nativas do aplicativo Excel. Suplementos e VBA são recursos de extensibilidade e esta dica de ferramenta pode simplesmente não ser extensível. Mas essa teoria é desafiada pela existência do suplemento Analysis Toolpak. Claro, ele é construído na Microsoft, mas ANALYS32.xll é um suplemento XLL autônomo, assim como aqueles que podem ser produzidos em VB, C, C ++ e C #. Com certeza, quando este XLL é carregado no aplicativo, as funções que ele disponibiliza têm as mesmas dicas de ferramentas das funções nativas do Excel:

insira a descrição da imagem aqui

Certamente, se essa informação for de alguma forma codificada neste arquivo XLL e passada para o Excel, há uma maneira de replicá-la com nossos próprios suplementos. Estou no ponto agora em que vou começar a me ensinar um pouco sobre descompilar e ver se consigo fazer a engenharia reversa de tudo o que está acontecendo no conjunto de ferramentas de análise.

Como você pode ajudar

Tenho quase certeza de que pesquisei todas as informações disponíveis publicamente sobre esse problema. Se alguém souber de algo que eu não sei que possa ajudar com isso, sinta-se à vontade para intervir. Não estou muito familiarizado com dlls / xlls compilados por engenharia reversa, então se alguém quiser abrir sua cópia local de Analysis32.xll e descobrir o que está acontecendo com suas definições de funções personalizadas, eu ficaria muito grato. Do contrário, continuarei investigando sozinho até chegar a todos os becos sem saída e relatar o que encontrar.

Alain
fonte
4
Não é possível criar ou mostrar dicas de ferramentas para argumentos UDF nas versões atuais do Excel usando qualquer uma das tecnologias disponíveis. Fonte por MVP: answers.microsoft.com/en-us/office/forum/office_2007-customize/…
silkfire
O .NET Reflector não pôde abrir ANALYS32.xll, concluindo que não é um .NET Assembly. Isso me surpreende. Parece que vou ter que tentar descompilar para a linguagem assembly?
Alain
5
Parece interessante, mas no passado (Office 97) fiz dicas que usam o winapi. E dessa forma você pode fazer isso. Se isso for interessante, posso desenterrar as informações e tentar fazer uma resposta a partir delas.
Archlight
1
Eu vou pegar também, vai demorar um pouco para desenterrar isso. Mas deve subir aqui para outros usarem. Sua combinação baixa e maligna de winapi / vba / e eu acho que fiz isso como vb.dll, mas não é difícil elevá-lo para .net
Archlight
1
Aparentemente, a equipe de desenvolvimento do Excel está votando
Alain

Respostas:

40

Publiquei um projeto de prova de conceito no GitHub como o projeto Excel-DNA IntelliSense , implementando isso.

Usando as classes UI Automation para monitorar os eventos apropriados da interface do usuário do Excel, um formulário é exibido quando apropriado.

O código é empacotado como um suplemento do Excel-DNA e funciona na minha máquina Excel 2013 / Windows 8. Eu testei em outra configuração (Excel 2010 de 64 bits no Windows Server 2008) e tive problemas sérios.

Para uma função C # definida com os atributos Excel-DNA como este:

[ExcelFunction(Description = 
    "A useful test function that adds two numbers, and returns the sum.")]
public static double AddThem(
    [ExcelArgument(Name = "Augend", 
                   Description = "is the first number, to which will be added")] 
    double v1,
    [ExcelArgument(Name = "Addend", 
                   Description = "is the second number that will be added")]     
    double v2)
{
    return v1 + v2;
}

obtemos a descrição da função

Descrição da função

e ao selecionar a função, obtemos ajuda do argumento

Ajuda do argumento

Parece bom, mas ainda é muito instável, só funciona na minha máquina e às vezes trava o Excel. Pode ser um começo, porém ...


Atualização 9 de maio de 2014:

Fiz alguns progressos descobrindo como fazer o argumento help funcionar em versões mais antigas do Excel e do Windows. No entanto, ainda é necessário muito trabalho para que tudo seja confiável. Qualquer pessoa que desejar ajudar com isso deve entrar em contato comigo diretamente.


Atualização de 18 de junho de 2016:

O suporte do Excel UDF IntelliSense para suplementos do Excel-DNA e funções VBA agora está sendo testado. Consulte a página de primeiros passos no GitHub para obter instruções.

Govert
fonte
Infelizmente, parece que o Excel 2013 ou Windows 8 ou ambos são necessários para o suporte de UI Automation TextRange que o argumento help usa. Eu adoraria ouvir de qualquer pessoa que tenha alguma experiência em Automação de IU do Windows ...
Govert
Você tentou fazer referência a assemblies Excel mais antigos antes de compilar para máquinas mais antigas?
Daniel Möller
1
As referências ao modelo de objeto do Excel não estão realmente envolvidas nisso. Mas certamente existem diferentes versões de UI Automation que podem afetar as coisas ...
Govert
1
São ruas à frente de qualquer coisa lá fora até agora, então você tem meu voto para a recompensa. Pretendo ver se posso contribuir com essa solução em um futuro próximo, então fique de olho na minha solicitação de pull!
Alain de
@Alain Bom trabalho para Govert! & Alain Eu adoraria ver você dominar isso.
CodeCamper
1

E se

  1. Capture a entrada de texto no evento de pressionamento de tecla da célula. como isso
  2. Verifique se o texto corresponde às funções personalizadas.
  3. Se corresponder, mostre algo como rótulo ou forma para fingir ser uma dica de ferramenta. como isso

Isso é aceitável?

É um pouco feio, mas mais fácil.

Clxy
fonte
Este é um ponto de partida interessante que considerei, mas encontrei complicações quando formas mais avançadas de edição de uma fórmula são encontradas (como clicar em algum lugar no meio e excluir / adicionar caracteres, ou destacar e sobrescrever uma parte da fórmula, ou usar uma fórmula customizada no meio de alguma outra fórmula.) Isso requer mais do que verificar o pressionamento de teclas, precisaríamos examinar o conteúdo atual da barra de fórmula ou célula no meio da edição. Isso também pode ser feito com algumas bibliotecas dll importadas e lidar com a obtenção de hackery. Certamente vale a pena explorar.
Alain
-1

O que é XLL?

Um XLL é uma DLL que exporta vários procedimentos chamados pelo Excel ou pelo Excel Add-in Manager. http://msdn.microsoft.com/en-us/library/office/bb687861.aspx

Como você desenvolve o XLL?

Excel XLL SDK com Visual C ++ (ou qualquer coisa que possa compilar uma DLL e chamar os procedimentos do SDK)

Onde posso encontrar um guia rápido para criar um XLL simples?

http://support.microsoft.com/kb/178474

Como obtenho dicas?

  1. Implementar sua função como um procedimento e exportá-la
  2. Implementar e exportar o procedimento xlAutoOpen (void) - http://msdn.microsoft.com/en-us/library/office/bb687860.aspx
  3. xlAutoOpen só precisa chamar xlfRegister - http://msdn.microsoft.com/en-us/library/office/bb687900.aspx
  4. Para dicas de ferramentas, atenção especial para: pxArgumentText, pxFunctionHelp, pxArgumentHelp1

Infelizmente, o suplemento Analysis Toolpak também não tem dicas de ferramentas.

Minha solução estava errada, mas com informações erradas postadas pelo autor original. Mostrando uma imagem com DISTRBINOM, se seu link mostrar claramente que esta não é uma função de ANALYS32.xll.

Isso significa que eu estava tentando resolver uma questão impossível. Porque não existe um XLL que faça o que o autor solicitou. Se você encontrar uma versão do Excel que mostre dicas de ferramentas de XLLs, entre em contato.

Sobre o que o autor da postagem perguntou, tentando imitar o comportamento do XLL, tenho certeza que minha resposta foi a mais correta em relação ao que o ANALYS32.xll faz.

Marcos Zolnowski
fonte
3
Infelizmente, registrar uma UDF com xlfRegister não faz com que o Excel exiba essas informações como dicas de ferramentas do Intellisense na planilha. As descrições, etc. registradas lá são mostradas apenas na caixa de diálogo Argumentos da função, que aparece quando você pressiona o botão fx. Mas não é sobre isso que o autor original está perguntando.
Govert de
@Govert ainda é assim em 2016?
beppe9000
@ beppe9000 Sim. Você pode obter dicas de ferramentas IntelliSense in-sheet para UDFs (definido em um XLL ou VBA) usando a extensão Excel-DNA IntelliSense: github.com/Excel-DNA/IntelliSense
Govert