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.

Foi útil?

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!

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