È possibile stabilire quale cartella di lavoro ha chiamato una funzione in un componente aggiuntivo di Excel (xla)

StackOverflow https://stackoverflow.com/questions/4901148

Domanda

Voglio scrivere una piccola funzione di registrazione in un componente aggiuntivo di Excel che chiamerò da molte cartelle di lavoro diverse.Mi piacerebbe poterlo chiamare semplicemente passando solo il testo del registro e la funzione di registro stessa potrebbe gestire il timestamp, nome cartella di lavoro , ecc.

Tuttavia, non posso utilizzare ThisWorkbook o ActiveWorkbook per determinare quale cartella di lavoro è stata responsabile per effettuare la chiamata, poiché Thisworkbook restituirà un riferimento al componente aggiuntivo stesso, mentre il codice VBA in esecuzione in una cartella di lavoro diversa dalla cartella di lavoro con focus attivoin Excel potrebbe effettuare la chiamata, ma l'ActiveWorkbook restituirà quello che ha il focus nella finestra.

Application.Caller sembrava una possibile soluzione, ma sembra funzionare solo quando la funzione viene chiamata da una cella, non da VBA.

Quello che sto cercando di fare è impossibile?

Aggiorna

Secondo> 1 persona, questo è in effetti impossibile.Se qualcuno è a conoscenza di una soluzione alternativa intelligente, parlane.

È stato utile?

Soluzione

OK, quindi avendo letto la domanda correttamente proverò di nuovo ...

Quindi, per dichiarare il problema:

Volete una routine scritta in un addin, che quando viene chiamato da VBA in un'altra cartella di lavoro può funzionare (tra le altre cose) quale cartella di lavoro contiene il VBA che ha effettuato la chiamata, senza dover passare in modo esplicito questa informazione.

Come affermato che questo non è possibile (questa è una domanda simile per accedere allo stack di chiamata dal codice: qualcosa che è a mia conoscenza non è possibile)

Comunque puoi quasi ottenere quello che vuoi come questo

Dichiarare la funzione log come questa:

Sub MyLogger(wb as Workbook, LogText as String)
    Dim CallerName as String
    CallerName = wb.name
    ' your code...
End Sub
.

Allora ovunque tu chiami il sottogruppo

MyLogger ThisWorkbook, "Log Text"
.

Non abbastanza buono come non passando nulla, ma almeno è sempre lo stesso

Altri suggerimenti

Per ottenere il nome della cartella di lavoro chiamante, utilizzare

Application.Caller.Worksheet.Parent.Name
.

Application.Caller restituisce le informazioni su come è stato chiamato Visual Basic.Se chiamato da una funzione personalizzata immessa in una singola cella, un oggetto range specificando che la cella viene restituita

Avendo ricevuto un riferimento alla cella, .worksheet.parent.name ti dà il nome della cartella di lavoro

Nota che l'applicazione.Caller restituirà altre cose a seconda di come viene chiamata la tua funzione (vedere Guida VBA per i dettagli)

In una funzione aggiuntiva chiamata da una chiamata di funzione inserita in un array di fogli di lavoro Excel, ho riscontrato che "Application.Caller.Parent.name" fornisce il nome del foglio (nome scheda, non numero foglio).

Ho riscontrato lo stesso problema durante la codifica di una funzione personalizzata.La funzione funziona bene, ma ogni volta che viene calcolata o attivata un'altra cartella di lavoro, tutte le celle che utilizzano quella funzione tornano a #value.Può essere molto frustrante lavorare con più file utilizzando questa formula.

Per ottenere la cartella di lavoro che ho usato:

Dim CallingWb As Workbook
Set CallingWb = Application.Caller.Parent.Parent

Dovrebbe funzionare se la tua funzione è in una cella.

Troppo tardi per il post originale, ma potrebbe aiutare gli altri!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top