plötsligt ”ogiltigt proceduranrop eller argument” – fel i VBA

av Philipp Stiefel, ursprungligen publicerad augusti 15th, 2019, Senast uppdaterad September 2nd, 2019

innan vi börjar, låt oss sätta saker i perspektiv: ”ogiltigt proceduranrop eller argument” är ett ganska vanligt fel. Om du stöter på det här felet när du skriver ny kod är det troligtvis ett verkligt fel i din kod och inte relaterat till ämnet för denna text.

om programmets kod kördes felfritt men nu plötsligt misslyckas med ett Körtidsfel ”5” – ”ogiltigt procedursamtal eller argument”, är det förmodligen ett problem orsakat av Windows-uppdateringarna den 13 augusti 2019 för alla aktuella versioner av Windows.

detta påverkar alla aktuella versioner av Office / VBA på Windows 10, Windows 8.1 och Windows 7 samt alla Windows Server-operativsystem från Windows Server 2008 till Windows Server 2019.

Microsoft har redan lagt till denna varning i listan” kända problem i den här uppdateringen”.

” När du har installerat den här uppdateringen kan program som har gjorts med Visual Basic 6 (VB6), makron som använder Visual Basic for Applications (VBA) och skript eller appar som använder Visual Basic Scripting Edition (VBScript) sluta svara och du kan få ett ”ogiltigt anropsfel.”

Microsoft undersöker för närvarande problemet och kommer att tillhandahålla en uppdatering när den är tillgänglig.”

(källa: någon av KB-artiklarna nedan)

Här är en lista över uppdateringarna som orsakar problemet (utan krav på fullständighet):

  • Windows 10, Version 1903 – 13 augusti 2019—KB4512508 (OS – byggnad 18362.295)
  • Windows 10, Version 1809—13 augusti 2019 – KB4511553 (OS—byggnad 17763.678)
  • Windows 10, Version 1803 – 13 augusti 2019—kb4512501 (OS Build 17134.950)
  • Windows 10, version 1709 – 13 augusti 2019—kb4512516 (OS Build 16299.1331)
  • Windows 10, version 1703 – 13 augusti 2019—kb4512507 (OS Build 15063.1988)
  • windows 8.1-13 augusti 2019-kb4512489 (endast säkerhetsuppdatering)
  • Windows 8.1-augusti 13, 2019—KB4512488 (Monthly Rollup)

vissa reproducerbara felscenarier orsakade av Windows Update

jag stötte på två olika, även om relaterade, scenarier var felet ”Ogiltigt procedursamtal eller argument” uppstår på grund av den installerade uppdateringen. Båda är relaterade till tomma matriser.

kapslade procedurer med ParamArray-argument

om din kod innehåller flera procedurer där variabla ParamArray-argument skickas från en procedur till den andra kommer detta att orsaka felet om den översta nivån param-arrayen var tom.

Här är ett litet VBA-kodexempel som återger felet.

Public Sub StartParamArrayTest() TestArray1End SubPrivate Sub TestArray1(ParamArray params() som Variant) TestArray2 paramsEnd SubPrivate Sub TestArray2(ParamArray params() som Variant) TestArray3 params ’ tidigare rad kommer att höja fel 5 – ”ogiltigt förfarande samtal eller argument”End SubPrivate Sub TestArray3(ParamArray params() som Variant)’ StubOnly, ringer detta kommer att höj felet alreadyend sub

Jag har inte hittat någon lösning för det här Felscenariot än.

passerar en tom array ByVal

om du skickar en tom array till en procedur som förväntar sig ett Varianttypargument ByVal, kommer proceduranropet att misslyckas med felmeddelandet. Detta orsakas förmodligen av samma interna mekanik som den tidigare felsituationen.

Här är ett litet exempel som återger felet.

Public Sub StartVarArrayTest () Dim testArray () som objekt TestArrayProc testArray ’ föregående rad kommer att höja fel 5 – ”ogiltigt proceduranrop eller argument”avsluta SubPrivate Sub TestArrayProc (ByVal varArray som Variant)’ StubOnly, ringer detta kommer att höja felet redanyend Sub

i detta fall kan felet förhindras från att visas genom att passera i den tomma arrayen ByRef till proceduren.

privat Sub TestArrayProc (ByRef varArray som Variant) ’ StubOnly, ringer detta kommer inte att höja errorEnd Sub

detta bör vara en genomförbar lösning i de flesta scenarier.

använda Array-funktionen för att rensa en kombinationsruta med flera värden

Om du använder Array-funktionen utan argument för att tilldela en tom array till en variabel, ser du återigen felet ”Ogiltigt proceduranrop”. Men om du använder Array-funktionen utan argument för att rensa en kombinationsruta med flera värden från VBA-kod, kommer du att se ett run-time error 2004 ”Det finns inte tillräckligt med minne för att utföra denna operation. Stäng onödiga program och försök igen.”

privat Sub Command3_Click () mig.cboMultiValue.Value = Array () End Sub

jag stötte inte på denna variant av problemet själv men det rapporterades i en tråd på Access Mdsn-forumet.

ytterligare överväganden-”…kan sluta svara … ”

de ovan nämnda scenarierna är ganska lätta att diagnostisera, när du vet om orsaken till felet. Men jag är mer orolig för” kan sluta svara ” – delen från beskrivningen av know-problemet. Detta är något som är mycket svårare att spåra och diagnostisera. Nu när vi vet om detta fel kan vi förmodligen också diagnostisera en sådan situation, men utan denna kunskap hade det varit nästan omöjligt att hitta orsaken.

allmän lösning / tillfällig lösning

så länge Microsoft inte har släppt en annan uppdatering som adresserar och åtgärdar problemet, avinstallerar den enda riktiga ”lösningen” Windows-uppdateringarna den 13 augusti 2019. När du har avinstallerat uppdateringen körs din kod som tidigare. Inga ytterligare åtgärder behövs.

självklart är det inte idealiskt att avinstallera och skjuta upp en säkerhetsuppdatering för Windows. Du bör väga om effekten av den här uppdateringen på dina VBA-applikationer är tillräckligt allvarlig för att motivera detta.

Såvitt jag vet finns det inget känt befintligt utnyttjande för säkerhetsproblemen fixade med den uppdateringen, än. (Varning: Jag är inte en säkerhetsexpert!) Så, med tanke på flera applikationer som drabbats hårt av problemen som beskrivs ovan, rekommenderade jag mina kunder att skjuta upp uppdateringen tills vidare.

Uppdatering 2019-08-18: en Fix verkar vara på gång …

i slutet av augusti 16th Microsoft släppte uppdateringen augusti 16, 2019—KB4512494 (OS Build 16299.1365) till Windows 10, Version 1709 (endast!).

listan ”förbättringar och korrigeringar” för den här uppdateringen innehåller det här objektet:

  • Åtgärdar ett problem som kan få följande att sluta svara:
    • program som gjordes med Visual Basic 6 (VB6).
    • makron som använder Visual Basic for Applications (VBA).
    • skript eller appar som använder Visual Basic Scripting Edition (VBScript).

    Du kan också få ett ”ogiltigt proceduranrop” – fel.

Så, Microsoft verkar verkligen göra ett försök att få denna röra fast snabbt. Hittills finns det bara fix för den specifika versionen 1709 av Windows 10. Det finns ingen fix tillgänglig för nyare versioner av Windows 10, än mindre Windows 7 eller 8, än. Ändå, detta är en guldkant vid horisonten, och det verkar vara troligt att andra uppdateringar fastställande av frågan på andra versioner av änkor kommer att följa i nästa vecka.

Uppdatering: det finns en fix tillgänglig för Windows 8.1 / Windows Server 2012 R2 också. Den här uppdateringen visas inte på sidan Uppdateringshistorik för Windows 8.1 på Microsofts webbplats och är inte tillgänglig via Windows Update. Du kan installera den via Microsoft Update-katalogen. – Jag har just installerat den på min huvudutvecklingsdator och det verkar fixa alla reproducerbara variationer av detta fel som nämns ovan.

Update 2019-09-02-patchar tillgängliga för alla operativsystem

veckan efter den ursprungliga, problematiska Windows Update släppte Microsoft ett par patchar för att rensa upp VBA-problemen. Tyvärr saknas korrigeringsfilen för den mest uppdaterade versionen av Windows 10 under en tid. Slutligen, den 30 augusti, släppte Microsoft också sökvägen för Windows 10, V1903.

det är lite irriterande att Microsoft uppmuntrar Windows 10-användare att uppdatera till den senaste versionen hela tiden, men släpper sedan den viktiga korrigeringen för att lösa detta allvarliga VBA-problem veckor senare än motsvarande korrigeringar för alla andra operativsystem.

här är en lista över alla patchar som fixar VBA-problemet:

  • Windows 10, version 1903 – 30 augusti 2019—KB4512941 (OS Build 18362.329)
  • Windows 10, version 1809 + Windows Server 2019 – 17 augusti 2019—KB4512534 (OS Build 17763.720)
  • Windows 10, version 1803 – 19 augusti 2019—KB4512509 (OS – byggnad 17134.984)
  • Windows 10, version 1709—16 augusti 2019 – KB4512494 (OS—byggnad 16299.1365)
  • Windows 10, version 1703 – 17 augusti 2019—kb4512474 (OS – version 15063.2021)
  • Windows 10, Version 1607 + Windows Server 2016-17 augusti 2019-kb4512495 (OS-version 14393.3181)
  • Windows 8.1 Windows Server 2012 R2-uppdatering kb4517298 16 augusti 2019
  • Windows 7 SP1 och Windows Server 2008 R2 SP1: uppdatera kb4517297 augusti 16, 2019
    (felaktig nedladdningslänk. Här är rätt nedladdningslänk till Microsoft Update-katalogen)

Lämna ett svar

Din e-postadress kommer inte publiceras.