eroare bruscă „apel de procedură nevalidă sau argument” în Vba

de Philipp Stiefel, publicat inițial pe 15 August 2019, Ultima actualizare pe 2 septembrie 2019

înainte de a începe, să punem lucrurile în perspectivă: „apel de procedură nevalid sau argument” este o eroare destul de comună. Dacă întâmpinați această eroare în timp ce scrieți un cod nou, este cel mai probabil o eroare reală în codul dvs. și nu are legătură cu subiectul acestui text.

dacă codul aplicației dvs. rulează perfect, dar acum eșuează brusc cu o eroare de execuție ‘5’-„apel sau argument de procedură nevalid”, este probabil o problemă cauzată de actualizările Windows din 13 August 2019 pentru toate versiunile curente de Windows.

Acest lucru afectează toate versiunile curente de Office / VBA pe Windows 10, Windows 8.1 și Windows 7 la fel de bine ca toate sistemele de operare Windows Server de la Windows Server 2008 până la Windows Server 2019.

Microsoft însuși a adăugat deja acest avertisment la lista „Probleme cunoscute în această actualizare”.

„după instalarea acestei actualizări, aplicațiile care au fost realizate folosind Visual Basic 6 (VB6), macrocomenzile care utilizează Visual Basic pentru aplicații (VBA) și scripturile sau aplicațiile care utilizează Visual Basic Scripting Edition (VBScript) pot să nu mai răspundă și este posibil să primiți o „eroare de apelare a procedurii nevalide.”

Microsoft investighează în prezent această problemă și va oferi o actualizare atunci când este disponibilă.”

(Sursa: oricare dintre articolele KB enumerate mai jos)

Iată o listă a actualizărilor care cauzează problema (fără nicio pretenție de exhaustivitate):

  • Windows 10, versiunea 1903 – 13 August 2019—kb4512508 (OS Build 18362.295)
  • Windows 10, versiunea 1809 – 13 August 2019—KB4511553 (OS Build 17763.678)
  • Windows 10, versiunea 1803 – 13 August 2019—kb4512501 (OS Build 17134.950)
  • Windows 10, versiunea 1709 – 13 august 2019—KB4512516 (OS Build 16299.1331)
  • Windows 10, versiunea 1703 – 13 august 2019—KB4512507 (OS Build 15063.1988)
  • Windows 8.1 – 13 august 2019—kb4512489 (actualizare numai pentru securitate)
  • Windows 8.1-13 August 2019-KB4512488 (Rollup lunar)

unele scenarii de eroare reproductibile cauzate de Windows Update

am întâlnit două scenarii diferite, deși legate, au fost eroarea „apel de procedură nevalid sau argument” apare din cauza actualizării instalate. Ambele sunt legate de matrice goale.

proceduri imbricate cu argumente ParamArray

dacă codul dvs. conține mai multe proceduri în care argumentele paramarray variabile sunt transmise de la o procedură la alta, aceasta va cauza eroarea dacă matricea param de nivel superior a fost goală.

Iată un mic exemplu de cod VBA care reproduce eroarea.

Public Sub StartParamArrayTest() TestArray1End SubPrivate sub TestArray1(ParamArray params() ca variantă) TestArray2 paramsEnd Subprivate sub TestArray2(ParamArray params() ca variantă) TestArray3 params ‘ linia anterioară va ridica eroarea 5 – „Apel de procedură nevalid sau argument”End Subprivate sub TestArray3(ParamArray params() ca variantă)’ StubOnly, apelarea acestui lucru va eroarea alreadyend sub

nu am găsit încă nicio soluție pentru acest scenariu de eroare.

trecerea unei matrice goale ByVal

dacă treceți o matrice goală la o procedură care așteaptă un argument de tip variantă ByVal, apelul de procedură va eșua cu mesajul de eroare. Acest lucru este probabil cauzat de aceeași mecanică internă ca și situația de eroare anterioară.

Iată un mic exemplu care reproduce eroarea.

Public Sub StartVarArrayTest() dim testArray() as Object TestArrayProc testArray ‘ linia anterioară va ridica eroarea 5 – „apel de procedură nevalid sau argument”End Subprivate sub TestArrayProc(Byval varArray ca variantă)’ StubOnly, apelând acest lucru va ridica eroarea alreadyEnd Sub

În acest caz, eroarea poate fi împiedicată să apară trecând în matricea goală ByRef la procedură.

private sub TestArrayProc(ByRef varArray ca variantă) ‘ StubOnly, apelarea acestui lucru nu va ridica eroarea sub

aceasta ar trebui să fie o soluție fezabilă în majoritatea scenariilor.

utilizarea funcției Array pentru a șterge o casetă combo cu mai multe valori

Dacă utilizați funcția Array fără argumente pentru a atribui o matrice goală unei variabile, veți vedea din nou eroarea „apel de procedură nevalid”. Dar dacă utilizați funcția Array fără argumente pentru a șterge o casetă combo cu mai multe valori din codul VBA, veți vedea o eroare de execuție 2004 „nu există suficientă memorie pentru a efectua această operație. Închideți programele care nu sunt necesare și încercați din nou operația.”

sub Command3_Click privat() mă.ctomultivalue.Value = Array () End Sub

nu am întâlnit această variație a problemei mine, dar a fost raportat într-un fir de pe forumul access MDSN.

considerații suplimentare – „… poate să nu mai răspundă…”

scenariile menționate mai sus sunt destul de ușor de diagnosticat, odată ce știți despre cauza erorii. Cu toate acestea, sunt mai îngrijorat de partea „poate să nu mai răspundă” din descrierea problemei know. Acest lucru este mult mai greu de urmărit și diagnosticat. Acum că știm despre această eroare, probabil că putem diagnostica și o astfel de situație, dar fără aceste cunoștințe găsirea cauzei ar fi fost aproape imposibilă.

soluție generală / soluție temporară

atâta timp cât Microsoft nu a lansat o altă actualizare care să abordeze și să remedieze această problemă, singura „soluție” reală este dezinstalarea actualizărilor Windows din 13 August 2019. După ce ați dezinstalat actualizarea, codul dvs. va rula ca înainte. Nu mai sunt necesare alte acțiuni.

evident, dezinstalarea și amânarea unei actualizări de securitate Pentru Windows nu este ideală. Ar trebui să cântăriți dacă efectul acestei actualizări asupra aplicațiilor VBA este suficient de sever pentru a justifica acest lucru.

Din câte știu, nu există încă o exploatare existentă pentru problemele de securitate rezolvate cu acea actualizare. (Disclaimer: eu nu sunt un expert de securitate!) Deci, având în vedere mai multe aplicații grav afectate de problemele descrise mai sus, am recomandat clienților mei să amâne actualizarea până la o notificare ulterioară.

actualizare 2019-08-18: o remediere pare să fie în curs de desfășurare …

în orele târzii ale 16 August Microsoft a lansat actualizarea 16 August 2019—KB4512494 (OS Build 16299.1365) la Windows 10, Versiunea 1709 (numai!).

lista „îmbunătățiri și remedieri” pentru această actualizare include acest element:

  • abordează o problemă care poate cauza oprirea răspunsului următoarelor:
    • aplicații care au fost realizate folosind Visual Basic 6 (VB6).
    • macro-uri care utilizează Visual Basic pentru aplicații (VBA).
    • script-uri sau aplicații care utilizează Visual Basic Scripting Edition (VBScript).

    De asemenea, este posibil să primiți o eroare „apel de procedură nevalid”.

deci, Microsoft pare să facă într-adevăr un efort pentru a rezolva rapid această mizerie. Până în prezent, există doar remedierea pentru versiunea particulară 1709 a Windows 10. Nu există nicio remediere disponibilă pentru versiunile mai noi de Windows 10, darămite Windows 7 sau 8. Cu toate acestea, aceasta este o linie de argint la orizont, și se pare că este probabil ca alte actualizări de stabilire a problemei pe alte versiuni de văduve vor urma în săptămâna viitoare.

actualizare: există o soluție disponibilă și pentru Windows 8.1 / Windows Server 2012 R2. Această actualizare nu este listată în pagina Istoricul actualizărilor pentru fereastra 8.1 de pe site-ul Microsoft și nu este disponibilă prin Windows Update. Îl puteți instala prin catalogul Microsoft Update. – Tocmai l-am instalat pe computerul meu principal de dezvoltare și se pare că rezolvă toate variațiile reproductibile ale acestei erori menționate mai sus.

actualizare 2019-09-02 – patch-uri disponibile pentru toate sistemele de operare

săptămâna următoare actualizării Windows originale, problematice, Microsoft a lansat câteva patch-uri pentru a curăța problemele VBA. Din păcate, patch-ul pentru cea mai actualizată versiune de Windows 10 lipsește de ceva timp. În cele din urmă, pe 30 August, Microsoft a lansat și calea Pentru Windows 10, V1903.

este ușor enervant faptul că Microsoft încurajează utilizatorii Windows 10 să actualizeze la cea mai recentă versiune tot timpul, dar apoi eliberează patch-ul important pentru a rezolva această problemă serioasă VBA săptămâni mai târziu decât patch-urile corespunzătoare pentru toate celelalte sisteme de operare.

Iată o listă cu toate patch – urile care remediază problema VBA:

  • Windows 10, versiunea 1903—30 August 2019 – KB4512941 (OS Build 18362.329)
  • Windows 10, versiunea 1809 + Windows Server 2019—17 August 2019-KB4512534 (OS Build 17763.720)
  • Windows 10, versiunea 1803 – 19 August 2019—kb4512509 (OS Build 17134.984)
  • Windows 10, versiunea 1709 – 16 August 2019—KB4512494 (OS Build 16299.1365)
  • Windows 10, versiunea 1703 – 17 August 2019—kb4512474 (sistem de operare build 15063.2021)
  • Windows 10, versiunea 1607 + Windows Server 2016 – 17 august 2019—kb4512495 (sistem de operare build 14393.3181)
  • Windows 8.1 Windows Server 2012 R2 – actualizare kb4517298 16 august 2019
  • Windows 7 SP1 și Windows Server 2008 R2 SP1: actualizare kb4517297 16 august 2019
    (link de descărcare incorect. Iată linkul de descărcare corect către Catalogul Microsoft Update)

Lasă un răspuns

Adresa ta de email nu va fi publicată.