Improvvisa “chiamata di routine non Valido o argomento” errore in VBA

da Philipp Stiefel, originariamente pubblicato il 15 agosto, 2019, ultimo aggiornamento: settembre 2nd, 2019

Prima di iniziare, cerchiamo di mettere le cose in prospettiva: “chiamata di routine non Valido o argomento” è un errore comune. Se si verifica questo errore durante la scrittura di un nuovo codice, è molto probabile che si tratti di un errore effettivo nel codice e non correlato all’argomento di questo testo.

Se il codice dell’applicazione era in esecuzione senza problemi, ma ora improvvisamente fallisce con un errore di runtime ‘5’-“Chiamata o argomento di procedura non valida”, è probabilmente un problema causato dagli aggiornamenti di Windows del 13 agosto 2019 per tutte le versioni correnti di Windows.

Ciò riguarda tutte le versioni correnti di Office / VBA su Windows 10, Windows 8.1 e Windows 7, nonché tutti i sistemi operativi Windows Server da Windows Server 2008 a Windows Server 2019.

Microsoft stessa ha già aggiunto questo avviso all’elenco “Problemi noti in questo aggiornamento”.

“Dopo l’installazione di questo aggiornamento, le applicazioni create utilizzando Visual Basic 6 (VB6), le macro che utilizzano Visual Basic for Applications (VBA) e gli script o le app che utilizzano Visual Basic Scripting Edition (VBScript) potrebbero non rispondere e si potrebbe ricevere un “errore di chiamata alla procedura non valido.”

Microsoft sta attualmente indagando su questo problema e fornirà un aggiornamento quando disponibile.”

(Fonte: Uno qualsiasi degli articoli KB elencati di seguito)

Ecco un elenco degli aggiornamenti che causano il problema (senza pretese di completezza):

  • Windows 10, la Versione 1903 – 13 agosto, 2019—KB4512508 (OS Costruire 18362.295)
  • Windows 10, la Versione 1809 – 13 agosto, 2019—KB4511553 (OS Costruire 17763.678)
  • Windows 10, la Versione 1803 – 13 agosto, 2019—KB4512501 (OS Costruire 17134.950)
  • Windows 10, la Versione 1709 – 13 agosto, 2019—KB4512516 (OS Costruire 16299.1331)
  • Windows 10, la Versione 1703 – 13 agosto, 2019—KB4512507 (OS Costruire 15063.1988)
  • Windows 8.1 – 13 agosto, 2019—KB4512489 di Sicurezza (solo aggiornamento)
  • Windows 8.1-13 Agosto 2019-KB4512488 (Monthly Rollup)

Alcuni scenari di errore riproducibili causati dall’aggiornamento di Windows

Ho riscontrato due diversi scenari, sebbene correlati, in cui si verifica l’errore “Chiamata o argomento di procedura non valida” a causa dell’aggiornamento installato. Entrambi sono correlati a array vuoti.

Procedure annidate con argomenti ParamArray

Se il codice contiene diverse procedure in cui gli argomenti ParamArray variabili vengono passati da una procedura all’altra, ciò causerà l’errore se l’array param di livello superiore era vuoto.

Ecco un piccolo esempio di codice VBA che riproduce l’errore.

Public Sub StartParamArrayTest() TestArray1End SubPrivate Sub TestArray1(ParamArray params() As Variant) TestArray2 paramsEnd SubPrivate Sub TestArray2(ParamArray params() As Variant) TestArray3 params ‘ Precedente linea di alzare errore 5 – “chiamata di routine non Valido o argomento”Fine SubPrivate Sub TestArray3(ParamArray params() As Variant)’ StubOnly, chiamando questo genererà l’errore alreadyEnd Sub

non ho trovato nessuna soluzione per questo particolare scenario di errore di sicurezza.

Passaggio di un array vuoto ByVal

Se si passa un array vuoto a una procedura che prevede un argomento di tipo Variante ByVal, la chiamata alla procedura fallirà con il messaggio di errore. Questo è probabilmente causato dalla stessa meccanica interna della precedente situazione di errore.

Ecco un piccolo esempio che riproduce l’errore.

Public Sub StartVarArrayTest() Dim testArray() Come Oggetto TestArrayProc testArray ‘ Precedente linea di alzare errore 5 – “chiamata di routine non Valido o argomento”Fine SubPrivate Sub TestArrayProc(ByVal varArray Come Variante)’ StubOnly, chiamando questo genererà l’errore alreadyEnd Sub

In questo caso l’errore può essere impedito di apparire passando l’array vuoto ByRef per la procedura.

Sub privato TestArrayProc(ByRef varArray come variante) ‘ StubOnly, chiamando questo NON solleverà il Sub errorEnd

Questo dovrebbe essere una soluzione fattibile nella maggior parte degli scenari.

Utilizzo della funzione Array per cancellare una casella combinata multi-valore

Se si utilizza la funzione Array senza argomenti per assegnare un array vuoto a una variabile, si vedrà ancora una volta l’errore “Chiamata di procedura non valida”. Ma se si utilizza la funzione Array senza argomenti per cancellare una casella combinata multi-valore dal codice VBA, verrà visualizzato un errore di runtime 2004 ” Non c’è abbastanza memoria per eseguire questa operazione. Chiudere i programmi non necessari e riprovare l’operazione.”

Sotto comando Privato3_Click () Me.cboMultiValue.Value = Array () End Sub

Non ho riscontrato questa variazione del problema da solo, ma è stata riportata in una discussione sul forum di Access MDSN.

Ulteriori considerazioni – ” may può smettere di rispondere … “

Gli scenari sopra menzionati sono abbastanza facili da diagnosticare, una volta che si conosce la causa dell’errore. Tuttavia, sono più preoccupato per la parte “può smettere di rispondere” dalla descrizione del problema know. Questo è qualcosa che è molto più difficile da rintracciare e diagnosticare. Ora che sappiamo di questo errore, probabilmente possiamo diagnosticare anche una situazione del genere, ma senza questa conoscenza trovare la causa sarebbe stato quasi impossibile.

Soluzione generale/Soluzione temporanea

Finché Microsoft non ha rilasciato un altro aggiornamento per risolvere e risolvere questo problema, l’unica vera “soluzione” è disinstallare gli aggiornamenti di Windows del 13 agosto 2019. Una volta disinstallato l’aggiornamento, il codice verrà eseguito come prima. Non sono necessarie ulteriori azioni.

Ovviamente, disinstallare e rinviare un aggiornamento di sicurezza per Windows non è l’ideale. Si dovrebbe valutare se l’effetto di questo aggiornamento sulle applicazioni VBA è abbastanza grave da giustificare questo.

A mia conoscenza non esiste ancora un exploit esistente per i problemi di sicurezza risolti con quell’aggiornamento. (Disclaimer: non sono un esperto di sicurezza! Quindi, considerando diverse applicazioni gravemente colpite dai problemi sopra descritti, ho consigliato ai miei clienti di rinviare l’aggiornamento fino a nuovo avviso.

Aggiornamento 2019-08-18: una correzione sembra essere in corso

Nelle ultime ore del 16 agosto Microsoft ha rilasciato l’aggiornamento 16 agosto 2019—KB4512494 (OS Build 16299.1365) a Windows 10, Versione 1709 (solo!).

L’elenco “Miglioramenti e correzioni” per questo aggiornamento include questo elemento:

  • Risolve un problema che potrebbe causare il blocco delle seguenti risposte:
    • Applicazioni create utilizzando Visual Basic 6 (VB6).
    • Macro che utilizzano Visual Basic for Applications (VBA).
    • Script o applicazioni che utilizzano Visual Basic Scripting Edition (VBScript).

    È inoltre possibile ricevere un errore di “Chiamata di procedura non valida”.

Così, Microsoft sembra essere davvero facendo uno sforzo per ottenere questo pasticcio risolto rapidamente. Finora c’è solo la correzione per la particolare versione 1709 di Windows 10. Non v’è alcuna correzione disponibile per le versioni più recenti di Windows 10, per non parlare di Windows 7 o 8, ancora. Tuttavia, questo è un rivestimento d’argento all’orizzonte, e sembra essere probabile che altri aggiornamenti che risolvono il problema su altre versioni di Widows seguiranno nella prossima settimana.

Aggiornamento: C’è una correzione disponibile per Windows 8.1/Windows Server 2012 R2 troppo. Questo aggiornamento non è elencato nella pagina Cronologia aggiornamenti per la finestra 8.1 del sito Web Microsoft e non è disponibile tramite Windows Update. È possibile installarlo tramite il catalogo Microsoft Update. – L’ho appena installato sul mio computer di sviluppo principale e sembra correggere tutte le variazioni riproducibili di questo errore sopra menzionato.

Update 2019-09-02-Patch disponibili per tutti i sistemi operativi

La settimana successiva all’originale, problematico aggiornamento di Windows, Microsoft ha rilasciato un paio di patch per ripulire i problemi VBA. Purtroppo, la patch per la versione più up-to-date di Windows 10 è mancava da qualche tempo. Infine, il 30 agosto, Microsoft ha anche rilasciato il percorso per Windows 10, V1903.

È un po ‘ fastidioso che Microsoft incoraggi gli utenti di Windows 10 ad aggiornare alla versione più recente tutto il tempo, ma poi rilascia la patch importante per risolvere questo grave problema VBA settimane più tardi rispetto alle patch corrispondenti per tutti gli altri sistemi operativi.

Ecco un elenco di tutte le patch che risolvono il problema VBA:

  • Windows 10, versione 1903 – 30 agosto 2019—KB4512941 (OS Build 18362.329)
  • Windows 10, versione 1809 + Windows Server 2019 – 17 agosto 2019—KB4512534 (OS Build 17763.720)
  • Windows 10, la versione 1803 – 19 agosto, 2019—KB4512509 (OS Costruire 17134.984)
  • Windows 10, la versione 1709 – 16 agosto, 2019—KB4512494 (OS Costruire 16299.1365)
  • Windows 10, la versione 1703 – 17 agosto, 2019—KB4512474 (OS Costruire 15063.2021)
  • Windows 10, la versione 1607 + Windows Server 2016 – agosto 17, 2019—KB4512495 (OS Costruire 14393.3181)
  • Windows 8.1 E Windows Server 2012 R2 – Aggiornamento KB4517298 16 agosto, 2019
  • Windows 7 SP1 e Windows Server 2008 R2 SP1: Aggiornamento KB4517297 16 agosto, 2019
    (Corretto link per il download. Ecco il link di download corretto per il catalogo degli aggiornamenti di Microsoft)

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.