Impedisci che la funzione venga chiamata ripetutamente


1

Ho scritto una funzione personalizzata per concatenare un intervallo, utilizzando un concatenatore personalizzato.

Public Function mikeConcat(rng As Range, concatenator As Variant) As String
     if left(selection.value,1)="'" then goto end1
     toReturn = "'"
     For Each cel In rng
         toReturn = toReturn & cel & CStr(concatenator)
     Next cel
    mikeConcat = Left(toReturn, Len(toReturn) - 1)
end1: End Function

Funziona benissimo, ma sembra che le celle in cui lo uso lo chiamino costantemente. Senza disabilitare l'aggiornamento della formula del foglio di lavoro, come posso assicurarmi che venga chiamato una sola volta per cella?

Edit1: domanda per riflettere il cambiamento raccomandato da FreeMan. Modifica2: viene visualizzato un errore di riferimento circolare e non funziona.


1
Non sono un esperto, ma credo che Worksheet.Calculate, sia chiamato nel codice VBA che Excel stesso, ricalcolerà tutte le formule delle celle, inclusi gli UDF. Ciò significa che la tua funzione verrà chiamata. Periodo. È possibile collegarlo mettendo un carattere ASCII non stampabile alla fine della post-concenuazione, quindi verificare l'esistenza di quel carattere prima di iniziare la concatenazione.
FreeMan,

Ma allora Excel non sarebbe normalmente gravato da tutte le formule nella cartella di lavoro? Questo è utile, ridurrebbe il calcolo preformato ogni volta che vengono eseguiti i calcoli. Pubblicalo come risposta in modo che io possa votare :)
wizlog del

Per favore, non modificare il codice originale, è molto confuso per coloro che arrivano dopo aver apportato la modifica. Se vuoi pubblicare un codice modificato, fallo come un elenco di codici separato
FreeMan,

Sì, Excel è gravato da tutte le formule della cartella di lavoro: ho un paio di wkbs molto pesanti di formula che richiedono fino a un minuto per il calcolo e non usano UDF.
FreeMan,

Risposte:


1

Puoi fare in modo che la tua funzione disabiliti i calcoli del foglio di lavoro prima che finisca.


ma non lo disabiliterebbe per il mio foglio di lavoro? Ho richiesto specificamente una risposta che non interferisse con le mie altre formule.
wizlog,

@wizlog L'idea è di riattivare i calcoli automatici al termine della funzione. Ciò non dovrebbe interrompere o interferire con qualsiasi altra cosa accada sul foglio.
Eccellente il

@wizlog Questa è la risposta corretta. Application.Calculation = xlCalculationManualall'inizio della tua funzione e Application.Calculation = xlCalculationAutomaticalla fine.
FreeMan,

Non credo che un UDF sia (o dovrebbe essere ) autorizzato a fare simili cambiamenti allo Applicationstato.
Mathieu Guindon,

@ Mat'sMug cosa mi consigliate?
wizlog,
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.