pludselig “ugyldig procedure opkald eller argument” fejl i VBA

af Philipp Stiefel, oprindeligt offentliggjort 15.August 2019, sidst opdateret 2. September 2019

før vi starter, lad os sætte tingene i perspektiv: “ugyldigt procedureopkald eller argument” er en ret almindelig fejl. Hvis du støder på denne fejl, mens du skriver ny kode, er det højst sandsynligt en faktisk fejl i din kode og ikke relateret til emnet for denne tekst.

Hvis din applikations kode kørte fejlfrit, men nu pludselig mislykkes med en Kørselstidsfejl ‘5’-“ugyldigt procedureopkald eller argument”, er det sandsynligvis et problem forårsaget af vinduerne 13.August 2019 opdateringer til alle aktuelle versioner af vinduer.

dette påvirker alle aktuelle versioner af Office / VBA På Vinduer 10, Vinduer 8.1 og Vinduer 7 såvel som alle vinduer server operativsystem fra vinduer Server 2008 til vinduer Server 2019.

Microsoft har allerede tilføjet denne advarsel til listen” kendte problemer i denne opdatering”.

“efter installation af denne opdatering kan applikationer, der blev lavet ved hjælp af Visual Basic 6 (VB6), makroer, der bruger Visual Basic for Applications (VBA), og scripts eller apps, der bruger Visual Basic Scripting Edition (VBScript), stoppe med at svare, og du kan modtage en “ugyldig procedureopkaldsfejl.”

Microsoft undersøger i øjeblikket dette problem og vil give en opdatering, når den er tilgængelig.”

(Kilde: en af KB-artiklerne nedenfor)

Her er en liste over de opdateringer, der forårsager problemet (uden krav på fuldstændighed):

  • vinduer 10, Version 1903 – August 13, 2019—KB4512508 (OS Build 18362.295)
  • vinduer 10, Version 1809 – August 13, 2019—KB4511553 (OS Build 17763.678)
  • vinduer 10, Version 1803 – August 13, 2019—KB4511553 (OS Build 17763.678)
  • vinduer 10, Version 1803 – August 13, 2019—kb4512501 (OS build 17134.950)
  • vinduer 10, version 1709 – 13.August 2019—kb4512516 (OS build 16299.1331)
  • vinduer 10, Version 1703 – 13. August 2019—kb4512507 (OS build 15063.1988)
  • vinduer 8.1-August 13, 2019-Kb4512489 (opdatering kun sikkerhed)
  • vinduer 8.1-August 13, 2019-KB4512488 (Månedlig Rollup)

nogle reproducerbare fejlscenarier forårsaget af vinduerne opdatering

jeg stødte på to forskellige, selvom relaterede scenarier var fejlen “Ugyldig procedure opkald eller argument” opstår på grund af den installerede opdatering. Begge er relateret til tomme arrays.

indlejrede procedurer med ParamArray-argumenter

Hvis din kode indeholder flere procedurer, hvor variable ParamArray-argumenter overføres fra den ene procedure til den anden, vil dette forårsage fejlen, hvis det øverste niveau param-array var tomt.

Her er et lille VBA-kodeeksempel, der gengiver fejlen.

Offentlig Sub StartParamArrayTest() TestArray1End SubPrivate Sub TestArray1(ParamArray params() som Variant) TestArray2 paramsEnd SubPrivate Sub TestArray2(ParamArray params() som Variant) TestArray3 params ‘ tidligere linje vil hæve fejl 5 – “ugyldigt procedureopkald eller argument”slut SubPrivate Sub TestArray3(ParamArray params() som Variant)’ StubOnly, kalder dette vil hæve fejlen alleredeend sub

Jeg har endnu ikke fundet nogen løsning på dette særlige Fejlscenarie.

videregivelse af et tomt array ByVal

Hvis du videregiver et tomt array til en procedure, der forventer et Varianttypeargument ByVal, mislykkes procedureopkaldet med fejlmeddelelsen. Dette skyldes sandsynligvis den samme interne mekanik som den tidligere fejlsituation.

Her er et lille eksempel, der gengiver fejlen.

Offentlig Sub StartVarArrayTest() Dim testArray () som objekt TestArrayProc testArray ‘ forrige linje vil hæve fejl 5 – “ugyldigt procedureopkald eller argument”slut SubPrivate Sub TestArrayProc (ByVal varArray som Variant)’ StubOnly, kalder dette vil hæve fejlen alleredeend Sub

i dette tilfælde kan fejlen forhindres i at blive vist ved at passere i det tomme array ByRef til proceduren.

privat Sub TestArrayProc(ByRef varArray som Variant) ‘ StubOnly, kalder dette vil ikke hæve errorEnd Sub

dette bør være en gennemførlig løsning i de fleste scenarier.

brug af Array-funktionen til at rydde en kombinationsboks med flere værdier

Hvis du bruger Array-funktionen uden argumenter til at tildele et tomt array til en variabel, vil du igen se fejlen “ugyldigt procedureopkald”. Men hvis du bruger Array-funktionen uden argumenter til at rydde en kombinationsboks med flere værdier fra VBA-kode, vil du se en kørselstidsfejl 2004 “der er ikke nok hukommelse til at udføre denne handling. Luk unødvendige programmer, og prøv operationen igen.”

privat Sub Command3_Click() mig.cboMultiValue.Værdi = Array () End Sub

Jeg stødte ikke på denne variation af problemet selv, men det blev rapporteret i en tråd på Access MDSN Forum.

yderligere overvejelser – “… kan stoppe med at svare…”

de ovennævnte scenarier er ret nemme at diagnosticere, når du først ved årsagen til fejlen. Jeg er dog mere bekymret for” kan stoppe med at svare ” – delen fra beskrivelsen af kendeproblemet. Dette er noget, der er meget sværere at spore og diagnosticere. Nu hvor vi ved om denne fejl, kan vi sandsynligvis også diagnosticere en sådan situation, men uden denne viden ville det have været næsten umuligt at finde årsagen.

generel løsning/midlertidig løsning

så længe Microsoft ikke har frigivet en anden opdatering, der adresserer og løser dette problem, er den eneste rigtige “løsning” at afinstallere vinduerne 13.August 2019 opdateringer. Når du har afinstalleret opdateringen, kører din kode som før. Ingen yderligere handling nødvendig.

det er klart, at afinstallation og udsættelse af en sikkerhedsopdatering til vinduer ikke er ideel. Du bør afveje, om effekten af denne opdatering på dine VBA-applikationer er alvorlig nok til at retfærdiggøre dette.

så vidt jeg ved, er der endnu ingen eksisterende udnyttelse af de sikkerhedsproblemer, der er løst med den opdatering. (Ansvarsfraskrivelse: Jeg er ikke en sikkerhedsekspert!) Så i betragtning af flere applikationer, der er hårdt ramt af de ovenfor beskrevne problemer, anbefalede jeg mine kunder at udsætte opdateringen indtil videre.

opdatering 2019-08-18: en rettelse ser ud til at være i gang …

i de sene timer den 16.August frigav Microsoft opdateringen 16. August 2019—KB4512494 (OS Build 16299.1365) til Vinduer 10, Version 1709 (kun!).

listen “forbedringer og rettelser” til denne opdatering indeholder dette element:

  • løser et problem, der kan få følgende til at stoppe med at svare:
    • programmer, der blev lavet ved hjælp af Visual Basic 6 (VB6).
    • makroer, der bruger Visual Basic for Applications (VBA).
    • Scripts eller apps, der bruger Visual Basic Scripting Edition (VBScript).

    Du kan også modtage en “ugyldig procedure call” fejl.

så, Microsoft synes at være virkelig at gøre en indsats for at få dette rod fast hurtigt. Indtil videre er der kun rettelsen til den bestemte Version 1709 af vinduer 10. Der er ingen løsning tilgængelig for nyere versioner af vinduer 10, endsige Vinduer 7 eller 8, endnu. Ikke desto mindre er dette en sølvforing i horisonten, og det ser ud til at være sandsynligt, at andre opdateringer, der løser problemet på andre versioner af enker, følger i den næste uge.

opdatering: der er en rettelse til rådighed for vinduer 8.1 / vinduer Server 2012 R2 også. Denne opdatering er ikke angivet på siden opdateringshistorik for vindue 8.1 på Microsofts hjemmeside, og den er ikke tilgængelig via vinduer opdatering. Du kan installere det via Microsoft Update-kataloget. – Jeg har lige installeret det på min hovedudviklingscomputer, og det ser ud til at rette alle reproducerbare variationer af denne fejl nævnt ovenfor.

opdatering 2019-09-02 – Patches tilgængelige for alle operativsystemer

ugen efter den oprindelige, problematiske opdatering af vinduer frigav Microsoft et par patches for at rydde op i VBA-problemerne. Desværre mangler plasteret til den mest opdaterede version af vinduer 10 i nogen tid. Endelig den 30. August frigav Microsoft også stien til Vinduer 10, V1903.

det er lidt irriterende, at Microsoft opfordrer vinduer 10 brugere til at opdatere til den nyeste version hele tiden, men frigiver derefter den vigtige patch for at løse dette alvorlige VBA-problem uger senere end de tilsvarende programrettelser til alle andre operativsystemer.

Her er en liste over alle patches, der løser VBA – problemet:

  • vinduer 10, version 1903—August 30, 2019 – KB4512941 (OS Build 18362.329)
  • vinduer 10, version 1809 + vinduer Server 2019—August 17, 2019-KB4512534 (OS Build 17763.720)
  • vinduer 10, version 1803 – 19.August 2019—KB4512509 (OS Build 17134.984)
  • vinduer 10, version 1709 – 16. August 2019—KB4512494 (OS Build 16299.1365)
  • vinduer 10, version 1703 – 17. August 2019—kb4512474 (os build 15063.2021)
  • vinduer 10, Version 1607 + vinduer Server 2016 – August 17, 2019—kb4512495 (os build 14393.3181)
  • vinduer 8.1 vinduer Server 2012 R2 – opdatering kb4517298 august 16, 2019
  • vinduer 7 SP1 og vinduer Server 2008 R2 SP1: opdatering kb4517297 august 16, 2019
    (forkert Hent Link. Her er det korrekte Hent link til Microsoft Update Catalog)

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.