2013-06-11 12 views
7

Qualcuno là fuori sa come eseguire una traccia stack in . Sto cercando di fare qualcosa di simile:Quale SUB sta chiamando questo SUB

Public Sub a() 
    Call c  
End Sub  

Public Sub b()  
    Call c  
End Sub 

Public Sub c()  
    Debug.Print "Which sub has called me ?"  
End Sub 

Quello che voglio fare in Sub c è quello di mostrare se che è stato chiamato da Sub a o Sub b senza passare alcun argomento. In vorrei semplicemente mostrare lo stack ma non ho idea se questo sia possibile anche in VBA - qualche idea?

+0

puoi spiegare perché hai bisogno di questo ...? –

+0

Ho un codice in una forma che chiama una funzione. All'inizio della funzione scrivo in un file di registro per dire che la funzione è iniziata. Da uno dei miei utenti posso vedere chiamata questa funzione mentre è già in esecuzione. Quello che sto cercando di vedere è se questo è davvero il caso o se la registrazione non funziona. –

+0

luogo loggando in SUB a, b e c ... –

risposta

0

L'unico modo che si potrebbe dire sarebbe quello di ottenere il puntatore dell'indirizzo di ritorno della subroutine chiamante dallo stack. VBA non lo farebbe direttamente, avresti dovuto scrivere la tua biblioteca o avere una libreria da qualcun altro che aveva bisogno di sapere queste cose. Ciò potrebbe essere utile se le routine di chiamata provengono da un programma che non è possibile aggiornare, tuttavia se questo viene solo dal proprio codice, è molto più facile riscrivere il codice per identificare il chiamante.

10

È possibile accedere al stack di chiamate durante il runtime sotto il menu View ->Call Stack

In alternativa è possibile utilizzare la scorciatoia da tastiera CTRL + L durante il runtime.

enter image description here

+1

Non lo avevo notato.Questo aiuta, ma non ho idea di come faccio a fare lo stack di chiamate in codice? –

2

È possibile utilizzare Mztools componenti aggiuntivi, che ha un'opzione per visualizzare la procedura chiamante. Download Mztools

enter image description here

+1

Non sono sicuro che questa utility risolva il problema dell'OP, ma questo è uno strumento eccezionale che ho scoperto dalla tua risposta. –

+0

@hungryhippo Sì, in realtà è il mio addin preferito per VBA, – Santosh

0

Il mio modo di fare questo è di avere un ProcedureEnter e call ProcedureExit all'inizio e alla fine di ogni routine VBA che ho. La routine ProcedureEnter ha un argomento per il nome di Sub/Function, che viene archiviato in una raccolta di stack di chiamate globale. ProcedureExit apre semplicemente l'ultima voce fuori dallo stack.

Quindi, per ottenere il nome di routine chiamante, si sarebbe solo ottenere l'oggetto presso la Collezione Stack .count - 1

io personalmente uso MZTools per impostare un valore predefinito VBA routine di intestazione/piè di pagina, in modo che ho appena digitare

Function fnname(arg as whatever) as boolean 
End Function 

e fare clic sul pulsante Add Handler Errore in MZTools e si aggiunge il ProcedureEnter e ProcedureExit chiama per me. Ciò rende molto meno ingombrante aggiungere il codice di tracciabilità dello stack.