Errore VBA: spazio stack insufficiente


0

Ho una macro molto semplice in un foglio Excel, per consentire agli utenti di ricalcolare.

Non ho altre macro / codice nella cartella di lavoro e solo questa cartella di lavoro è aperta

Sub Calculate()
    Calculate
End Sub

Questo è attivato da un pulsante.

Tuttavia, quando premuto ottengo due caselle di errore, vedere l'immagine.

Cosa fa Out of stack space mean? E come posso risolvere questo problema? inserisci qui la descrizione dell'immagine

Ho cercato su questo sito Web:

https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/out-of-stack-space-error-28

Dice che potrei divertirmi troppo ?? Questa macro funzionava bene e difficilmente sta facendo molto, quindi non riesco a capire il problema.

Sono in grado di calcolare il foglio utilizzando l'opzione nella scheda formule.


È stata scritta una funzione di rientro che si chiama incondizionatamente senza condizioni restrittive, quindi riempirà lo stack con le chiamate ripetute. Cosa speri di ottenere?
AFH,

@AFH tutto ciò che la macro dovrebbe fare è calcolare il foglio, un utente inserisce una nuova data e quindi preme il pulsante di aggiornamento per ricalcolare. l'utente potrebbe non essere esperto di Excel, quindi ho usato il pulsante macro / poiché non puoi perderlo.
PeterH,

Senza vedere il codice sottostante sarebbe difficile fornire una risposta definitiva sulla causa diretta in quanto possono esserci alcuni motivi: funzione ricorsiva, variabili che consumano troppa memoria. Come per il tuo link, lo stack è un'area di memoria di lavoro allocata e quando esegui la tua macro, le variabili e le chiamate che fa vengono "inserite" nello stack. Quando una funzione o una variabile non è più necessaria, viene rimossa dallo stack, liberando memoria. L'errore suggerisce che la macro potrebbe superare la memoria allocata per lo stack.
Enigman,

@Enigman l'unico codice utilizzato nel documento è mostrato nella domanda, non ho altre macro, ecco perché sono così sconcertato da questo.
PeterH,

Risposte:


3

La funzione che hai definito è ricorsiva, chiamandosi incondizionatamente fino a quando lo stack è pieno di tutte le chiamate.

È necessario modificare il nome della subroutine, ad esempio: -

Sub Calc()
    Calculate
End Sub

Se si collega Calc()al pulsante, si evita qualsiasi ricorsione.


questo ha risolto il problema grazie!, comunque un po 'sconcertato da esso, poiché il problema è iniziato solo oggi e ha funzionato bene nelle ultime settimane.
PeterH,

Non posso spiegare come ha funzionato prima, a meno che un'altra revisione non abbia gestito le chiamate in modo diverso.
AFH,

Ho lavorato con compilatori [mono] che separerebbero due comandi visivamente identici in un ambito per essere entità separate allo script compilato, anche se condividono un nome in chiaro. idk VBA, ma potrebbe aver fatto qualcosa di simile ... ma non lo fa più. In realtà potrebbe essere un bug se in queste circostanze è pensato per essere "intelligente".
Tetsujin,

@ Tetsujin - Avevo supposto che dovesse essere qualcosa del genere. Forse ha a che fare con la definizione della funzione. Se è sconosciuto come nome di una funzione fino al completamento della definizione, durante la definizione la Calculatechiamata deve essere collegata alla funzione di sistema. Il metodo di collegamento potrebbe essere cambiato, ma questa è solo una speculazione.
AFH,

2

Stai chiamando Calculate all'interno di Calculate. Ogni chiamata a Calcola provoca un'altra chiamata a Calcola, che poi chiamerà Calcola ... Alla fine si ottiene quell'errore quando lo stack si riempie.


quindi la funzione di calcolo nel codice, fa ricalcolare anche la mia macro? Uso questa stessa identica macro in altre cartelle di lavoro senza alcun problema
PeterH,

@PeterH Potresti essere stato fortunato fino ad ora che non si era manifestato prima. Forse c'era più spazio nello stack in altre occasioni - questa volta avrebbero potuto essere in esecuzione più app sulla workstation o era stato un tempo più lungo tra i riavvii della workstation. È per questo che dobbiamo stare attenti quando usiamo nomi per moduli e funzioni poiché l'uso di una parola riservata o di un nome di funzione integrato può morderci in seguito, come è avvenuto in questa situazione.
Enigman,

Bene, grazie per l'aiuto comunque, non mi ero reso conto che il nome di una funzione fosse davvero importante
PeterH,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.