äkillinen ”virheellinen menettelykutsu tai argumentti” virhe VBA: ssa

Philipp Stiefel, julkaistu alun perin 15.elokuuta 2019, päivitetty viimeksi 2. syyskuuta 2019

ennen kuin aloitamme, laitetaan asiat perspektiiviin: ”virheellinen menettelykutsu tai argumentti” on melko yleinen virhe. Jos kohtaat tämän virheen kirjoittaessasi uutta koodia, se on todennäköisesti todellinen virhe koodissasi eikä liity tämän tekstin aiheeseen.

Jos sovelluksesi koodi toimi moitteettomasti, mutta nyt yhtäkkiä epäonnistuu Ajonaikaisella virheellä ’5’-”virheellinen menettelysoitto tai argumentti”, se on todennäköisesti ongelma, joka johtuu 13.elokuuta 2019 päivitetyistä Windows – päivityksistä kaikille nykyisille Windows-versioille.

tämä vaikuttaa kaikkiin Office / VBA: n nykyisiin versioihin Windows 10: ssä, Windows 8.1: ssä ja Windows 7: ssä, kuten kaikissa Windows Server-käyttöjärjestelmissä Windows Server 2008: sta Windows Server 2019: ään.

Microsoft itse lisäsi jo tämän varoituksen ”Tunnetut ongelmat tässä päivityksessä” – luetteloon.

”päivityksen asentamisen jälkeen Visual Basic 6 (VB6) -, Visual Basic for Applications (VBA) – ja Visual Basic Scripting Editionia (VBScript) käyttävät skriptit tai sovellukset voivat lakata vastaamasta ja saatat saada ”virheellinen menettelyvirhe.”

Microsoft tutkii asiaa parhaillaan ja toimittaa päivityksen, kun se on saatavilla.”

(lähde: mikä tahansa alla luetelluista KB: n artikkeleista)

tässä on luettelo ongelman aiheuttaneista päivityksistä (ilman väitettä täydellisyydestä:

  • Windows 10, versio 1903 – 13.elokuuta 2019—KB4512508 (OS Build 18362.295)
  • Windows 10, versio 1809 – 13. elokuuta 2019—KB4511553 (OS Build 17763.678)
  • Windows 10, versio 1803 – 13. elokuuta 2019 kb4512501 (os build 17134.950)
  • Windows 10, versio 1709—13. elokuuta 2019 – kb4512516 (os build 16299.1331)
  • Windows 10, versio 1703—13. elokuuta 2019 – kb4512507 (os build 15063.1988)
  • Windows 8.1—13.8.2019 – kb4512489 (tietoturvapäivitys)
  • Windows 8.1-August 13, 2019-kb4512488 (Monthly Rollup)

jotkut toistettavissa virheskenaariot aiheuttama Windows Update

kohtasin kaksi erilaista, vaikka liittyvät, skenaariot olivat ”virheellinen menettely puhelun tai argumentti” virhe tapahtuu, koska asennettu päivitys. Molemmat liittyvät tyhjiin taulukoihin.

sisäkkäiset menettelyt ParamArray-argumenteilla

Jos koodisi sisältää useita menettelyjä, joissa muuttujien ParamArray-argumentit siirtyvät yhdeltä prosessilta toiselle, tämä aiheuttaa virheen, jos ylätason param-matriisi oli tyhjä.

tässä on pieni VBA-koodiesimerkki, joka toistaa virheen.

Public Sub StartParamArrayTest() TestArray1End SubPrivate Sub TestArray1(ParamArray params() as Variant) TestArray2 paramsEnd SubPrivate Sub TestArray2(ParamArray params() As Variant) TestArray3 params ’ Previous line will raise error 5 – ”Invalid procedure call or argument”End SubPrivate Sub TestArray3(ParamArray params() As Variant)’ StubOnly, calling this will raise the error alreadyend sub

I haven ’ t found any workaround for this specific error scenario yet.

tyhjän rivin ohittaminen byval

Jos syötät tyhjän rivin menettelyyn, joka odottaa Muunnostyyppistä argumenttia ByVal, menettelykutsu epäonnistuu virhesanoman kanssa. Tämä johtuu todennäköisesti samasta sisäisestä mekaniikasta kuin edellinen virhetilanne.

tässä on pieni esimerkki, jossa virhe toistetaan.

Public Sub Startvarraytest() Dim testArray() as Object TestArrayProc testArray ’ Previous line will raise error 5 – ”Inval procedure call or argument”End SubPrivate Sub TestArrayProc(ByVal varArray as Variant)’ StubOnly, calling this will raise the error alreadyEnd Sub

in this case the error can be prevented from appear by passing in the empty array ByRef to the procedure.

Private Sub TestArrayProc(ByRef varArray as Variant) ” StubOnly, calling this will not raise the errorEnd Sub

This should be a possible workaround in most scenaries.

käyttämällä Array-funktiota tyhjentämään moniarvoinen yhdistelmäruutu

Jos käytät Array-funktiota ilman argumentteja osoittaaksesi tyhjän rivin muuttujaan, näet jälleen ”virheellinen menettelykutsu” – virheen. Mutta jos käytät Array-toimintoa ilman argumentteja tyhjentämään moniarvoisen yhdistelmäruudun VBA-koodista, näet run-time error 2004 ” ei ole tarpeeksi muistia tämän toiminnon suorittamiseen. Sulje tarpeettomat ohjelmat ja kokeile toimintaa uudelleen.”

yksityinen Sub Command3_Click () Me.cboMultiValue.Value = Array () End Sub

en itse törmännyt tähän vaihteluun, mutta siitä kerrottiin Access MDSN-foorumin kierteessä.

jatkonäkökohdat – ”… voi lakata vastaamasta…”

edellä mainitut skenaariot on melko helppo diagnosoida, kunhan tietää virheen syyn. Kuitenkin, olen enemmän huolissani ”voi lakata vastaamasta” osa kuvaus tietää ongelman. Tätä on paljon vaikeampi jäljittää ja diagnosoida. Nyt kun tiedämme tästä virheestä, voimme todennäköisesti diagnosoida myös tällaisen tilanteen, mutta ilman tätä tietoa syyn löytäminen olisi ollut lähes mahdotonta.

General Workaround/Temporary Solution

niin kauan kuin Microsoft ei ole julkaissut toista päivitystä, joka käsittelee ja korjaa tätä ongelmaa, ainoa todellinen ”ratkaisu” on poistaa 13.elokuuta 2019 Windows-päivitykset. Kun olet poistanut päivityksen, koodi toimii kuten ennenkin. Lisätoimenpiteet eivät ole tarpeen.

ilmeisesti Windowsin tietoturvapäivityksen poistaminen ja lykkääminen ei ole ihanteellista. Sinun pitäisi punnita, onko vaikutus tämän päivityksen VBA sovellukset on tarpeeksi vakava perustella tämän.

tietääkseni ei ole tiedossa olemassa olevaa hyödyntää tietoturvaongelmia korjattu kyseisen päivityksen, vielä. (Vastuuvapauslauseke: en ole tietoturva-asiantuntija!) Niin, ottaen huomioon useita sovelluksia, joihin edellä kuvatut ongelmat vaikuttavat vakavasti, suosittelin asiakkaitani lykkäämään päivitystä toistaiseksi.

päivitys 2019-08-18: korjaus näyttää olevan käynnissä …

Elokuun 16.päivän myöhäisinä tunteina Microsoft julkaisi päivityksen 16. elokuuta 2019—kb4512494 (OS Build 16299.1365) Windows 10, versio 1709 (vain!).

tämän päivityksen ”parannukset ja korjaukset” – lista sisältää tämän kohdan:

  • käsittelee ongelmaa, jonka vuoksi seuraavat saattavat lakata vastaamasta:
    • sovellukset, jotka on tehty Visual Basic 6: lla (VB6).
    • makrot, jotka käyttävät Visual Basic-sovellusta sovelluksille (VBA).
    • skriptejä tai sovelluksia, jotka käyttävät Visual Basic Scripting Editionia (VBScript).

    Voit myös saada ”virheellisen menettelykutsun” virheen.

niin, Microsoft näyttää todella yrittävän saada tämän sotkun nopeasti kuntoon. Toistaiseksi on vain korjaus tietyn Version 1709 Windows 10. Windows 10: n uudemmille versioille, saati Windows 7: lle tai 8: lle, ei ole vielä korjattavaa. Tämä on kuitenkin hopeareunus horisontissa, ja näyttää todennäköiseltä, että seuraavan viikon aikana tulee muita Leskisen toisiin versioihin liittyviä, asiaa korjaavia päivityksiä.

päivitys: myös Windows 8.1 / Windows Server 2012 R2: lle on olemassa korjaus. Tätä päivitystä ei ole listattu Windows 8.1: n päivityshistoriasivulla Microsoftin verkkosivuilla, eikä se ole käytettävissä Windows Updaten kautta. Voit asentaa sen Microsoft Update Catalogin kautta. – Olen juuri asentanut sen minun tärkein kehitys tietokone ja se näyttää korjata kaikki toistettavissa muunnelmia tämän virheen edellä mainittiin.

Update 2019-09-02 – Patches available for all operating systems

alkuperäisen, ongelmallisen Windows-päivityksen jälkeisellä viikolla Microsoft julkaisi pari laastaria VBA-ongelmien siivoamiseksi. Valitettavasti Windows 10: n ajantasaisimman version korjaustiedosto puuttui jo jonkin aikaa. Lopulta 30. elokuuta Microsoft julkaisi polun myös Windows 10: lle, V1903: lle.

on hieman ärsyttävää, että Microsoft kannustaa Windows 10-käyttäjiä päivittämään uusimpaan versioon koko ajan, mutta julkaisee sitten tärkeän korjaustiedoston tämän vakavan VBA-ongelman ratkaisemiseksi viikkoja myöhemmin kuin vastaavat korjaukset kaikille muille käyttöjärjestelmille.

tässä on lista kaikista VBA – ongelman korjaavista paikkauksista:

  • Windows 10, versio 1903—30.elokuuta 2019 – KB4512941 (OS Build 18362.329)
  • Windows 10, versio 1809 + Windows Server 2019—17. elokuuta 2019-KB4512534 (OS Build 17763.720)
  • Windows 10, versio 1803 – 19.elokuuta 2019—KB4512509 (OS Build 17134.984)
  • Windows 10, versio 1709 – 16. elokuuta 2019—KB4512494 (OS Build 16299.1365)
  • Windows 10, versio 1703 – 17. elokuuta 2019—kb4512474 (os build 15063.2021)
  • Windows 10, versio 1607 + Windows Server 2016 – August 17, 2019—kb4512495 (os build 14393.3181)
  • Windows 8.1 Windows Server 2012 R2 – update kb4517298 August 16, 2019
  • Windows 7 SP1 ja Windows Server 2008 R2 SP1: päivitys kb4517297 16. elokuuta 2019
    (virheellinen latauslinkki. Tässä on oikea latauslinkki Microsoftin Päivityskatalogiin)

Vastaa

Sähköpostiosoitettasi ei julkaista.