É possível saber qual pasta de trabalho chamou uma função em um suplemento do Excel (xla)
-
29-10-2019 - |
Pergunta
Quero escrever uma pequena função de registro em um suplemento do Excel que chamarei de muitas pastas de trabalho diferentes.Eu gostaria de poder chamá-lo passando apenas o texto do log, e a própria função de log poderia lidar com o carimbo de data/hora, nome da pasta de trabalho, etc.
No entanto, não posso usar ThisWorkbook ou ActiveWorkbook para determinar qual pasta de trabalho foi responsável por fazer a chamada, pois Thisworkbook retornará uma referência ao próprio suplemento, enquanto o código VBA executado em uma pasta de trabalho diferente da pasta de trabalho com foco ativo no Excel poderia faça a chamada, mas o ActiveWorkbook retornará aquele que está em foco na janela.
Application.Caller parecia uma solução possível, mas parece funcionar apenas quando a função é chamada de uma célula, não do VBA.
O que estou tentando fazer é impossível?
Atualizar
De acordo com > 1 pessoa, isso é de fato impossível.Se alguém souber alguma solução alternativa inteligente, fale.
Solução
Ok, depois de ler a pergunta corretamente, tentarei novamente ...
Então, para expor o problema:
você quer uma rotina escrita em um addin, que quando chamada do vba em outra pasta de trabalho possa descobrir (entre outras coisas) qual pasta de trabalho contém o vba que fez a chamada, sem ter que passar essa informação explicitamente.
Conforme declarado, isso não é possível (esta é uma questão semelhante ao acesso à pilha de chamadas a partir do código:algo que eu saiba não é possível)
No entanto, você quase pode conseguir o que deseja assim
Declare sua função de log assim:
Sub MyLogger(wb as Workbook, LogText as String)
Dim CallerName as String
CallerName = wb.name
' your code...
End Sub
Então, onde quer que você chame o sub, use
MyLogger ThisWorkbook, "Log Text"
Não é tão bom quanto não passar nada, mas pelo menos é sempre a mesma coisa
Outras dicas
Para obter o nome da pasta de trabalho de chamada, use
Application.Caller.Worksheet.Parent.Name
Application.Caller retorna informações sobre como o Visual Basic foi chamado.Se chamado de uma função personalizada inserida em uma única célula, um objeto Range especificando essa célula é retornado
Tendo obtido uma referência à célula, .Worksheet.Parent.Name fornece o nome da pasta de trabalho
Observe que Application.Caller retornará outras coisas, dependendo de como sua função é chamada (consulte a ajuda do VBA para obter detalhes)
Em uma função de suplemento chamada por uma chamada de função de planilha do Excel inserida chamada, acho que "application.caller.parent.name" dá o nome da folha (nome da guia, não o número da folha).
Tive o mesmo problema ao codificar uma função personalizada.A função funciona bem, mas sempre que outra pasta de trabalho é calculada ou ativada, todas as células que usam essa função são revertidas para #valor.Pode ser muito frustrante trabalhar com vários arquivos usando esta fórmula.
Para obter a apostila que usei:
Dim CallingWb As Workbook
Set CallingWb = Application.Caller.Parent.Parent
Isso deve funcionar se sua função estiver em uma célula.
Tarde demais para a postagem original, mas pode ajudar outras pessoas!