Náhlé „argument nebo volání procedury Neplatný“ chyba ve VBA

Philipp Stiefel, původně publikováno 15. srpna, 2019, poslední aktualizace 2. září, 2019

předtím, Než začneme, pojďme dát věci do perspektivy: „argument nebo volání procedury Neplatný“ je poměrně častá chyba. Pokud narazíte na tuto chybu při psaní nového kódu, je to s největší pravděpodobností skutečná chyba ve vašem kódu a nesouvisí s tématem tohoto textu.

Pokud vaše aplikace kód běží bezchybně, ale teď najednou se nezdaří, s Run-time error ‚5‘ – „argument nebo volání procedury Neplatný“, to je pravděpodobně problém způsobený 13. srpna 2019, aktualizace systému Windows pro všechny aktuální verze Windows.

Tento má vliv na všechny aktuální verze Office/VBA v systému Windows 10, Windows 8.1, a Windows 7 jako wells, jako všechny Windows Server operační systém Windows Server 2008 prostřednictvím Windows Server 2019.

společnost Microsoft již přidala toto varování do seznamu „Známé problémy v této aktualizaci“.

„Po instalaci této aktualizace aplikací, které byly vytvořeny pomocí Visual Basic 6 (VB6), makra pomocí jazyka Visual Basic for Applications (VBA), a skripty nebo aplikace pomocí Visual Basic Scripting Edition (VBScript) může přestat reagovat a může se zobrazit „chyba neplatná procedura volání.“

společnost Microsoft v současné době tento problém vyšetřuje a poskytne aktualizaci, pokud bude k dispozici.“

(zdroj: některý z níže uvedených článků KB)

zde je seznam aktualizací způsobujících problém (bez nároku na úplnost):

  • Windows 10, Verze 1903 – 13. srpna 2019—KB4512508 (OS Build 18362.295)
  • Windows 10, Verze 1809 – 13. srpna 2019—KB4511553 (OS Build 17763.678)
  • Windows 10, Verze 1803 – 13. srpna 2019—KB4512501 (OS Build 17134.950)
  • Windows 10, Verze 1709 – 13. srpna 2019—KB4512516 (OS Build 16299.1331)
  • Windows 10, Verze 1703 – 13. srpna 2019—KB4512507 (OS Build 15063.1988)
  • Windows 8.1 – 13. srpna 2019—KB4512489 (Bezpečnostní-pouze aktualizovat)
  • Windows 8.1 – 13. srpna 2019—KB4512488 (Měsíční Aktualizace)

Některé reprodukovatelné chybové scénáře způsobené Windows Update

narazil jsem na dvě různé, i když související, scénáře byly „argument nebo volání procedury Neplatný“ chyba dochází v důsledku nainstalované aktualizace. Oba se vztahují k prázdným polím.

Vnořených procedur s ParamArray argumenty

Pokud váš kód obsahuje několik postupů, kde proměnná ParamArray argumenty, které jsou předávány z jedné procedury do druhé to způsobí chybu, pokud nejvyšší úrovni param pole byla prázdná.

zde je malý příklad kódu VBA, který reprodukuje chybu.

Public Sub StartParamArrayTest() TestArray1End SubPrivate Sub TestArray1(ParamArray params() As Variant) TestArray2 paramsEnd SubPrivate Sub TestArray2(ParamArray params() As Variant) TestArray3 params ‚ Předchozí řádek zvýší chyba 5 – „argument nebo volání procedury Neplatný“End SubPrivate Sub TestArray3(ParamArray params() As Variant)‘ StubOnly, volat to zvýší chyba alreadyEnd Sub

nenašel jsem žádné řešení pro tento konkrétní chyba scénáře.

předání prázdného pole ByVal

Pokud předáte prázdné pole proceduře, která očekává parametr typu varianty ByVal, volání procedury selže s chybovou zprávou. To je pravděpodobně způsobeno stejnou vnitřní mechanikou jako předchozí chybová situace.

zde je malý příklad reprodukující chybu.

Public Sub StartVarArrayTest() Dim testArray() Jako Objekt TestArrayProc testArray ‚ Předchozí řádek zvýší chyba 5 – „argument nebo volání procedury Neplatný“End SubPrivate Sub TestArrayProc(ByVal varArray Jako Varianta)‘ StubOnly, volat to zvýší chyba alreadyEnd Sub

V tomto případě chyba může být zabráněno objevit předáním v prázdné pole ByRef na postup.

Private Sub TestArrayProc(ByRef varArray Jako Varianta) ‚ StubOnly, volat to nezvýší errorEnd Sub

Tohle by mělo být proveditelné řešení ve většině scénářů.

pomocí funkce Array vymažte pole s více hodnotami

Pokud použijete funkci Array bez argumentů k přiřazení prázdného pole proměnné, znovu se zobrazí chyba“ Neplatné volání procedury“. Pokud však použijete funkci pole bez argumentů k vymazání vícehodnotového pole se seznamem z kódu VBA, uvidíte chybu run-time 2004 “ k provedení této operace není dostatek paměti. Zavřete nepotřebné programy a zkuste operaci znovu.“

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

s touto variantou problému jsem se nesetkal sám, ale byl hlášen ve vlákně na fóru access MDSN.

další úvahy – „…může přestat reagovat … “

výše uvedené scénáře lze poměrně snadno diagnostikovat, jakmile víte o příčině chyby. Více se však obávám části „může přestat reagovat“ z popisu problému know. To je něco, co je mnohem těžší vystopovat a diagnostikovat. Nyní, když víme o této chybě, můžeme pravděpodobně diagnostikovat takovou situaci, ale bez těchto znalostí by bylo nalezení příčiny téměř nemožné.

Obecné Řešení / Dočasné Řešení

tak dlouho, dokud společnost Microsoft vydala další aktualizaci řešení a řešení tohoto problému, jediné skutečné „řešení“ je odinstalování 13. srpna 2019 Aktualizace systému Windows. Po odinstalování aktualizace bude váš kód spuštěn jako dříve. Žádné další kroky nutné.

je zřejmé, že odinstalace a odložení aktualizace zabezpečení pro Windows není ideální. Měli byste zvážit, zda je účinek této aktualizace na vaše aplikace VBA dostatečně závažný, aby to odůvodnil.

Pokud vím, není známo, že by existoval exploit pro bezpečnostní problémy opravené touto aktualizací. (Zřeknutí se odpovědnosti: Nejsem bezpečnostní expert!) Takže s ohledem na několik aplikací vážně postižených výše popsanými problémy jsem svým zákazníkům doporučil odložit aktualizaci až do odvolání.

Aktualizace 2019-08-18: Oprava se zdá být na cestě …

V pozdních hodinách 16. srpna vydala společnost Microsoft aktualizace 16. srpna 2019—KB4512494 (OS Build 16299.1365) na Windows 10, Verze 1709 (pouze!).

„Vylepšení a opravy“ seznam pro tato aktualizace zahrnuje tyto položky:

  • Řeší problém, který může způsobit následující přestane reagovat:
    • Aplikace, které byly provedeny pomocí Visual Basic 6 (VB6).
    • makra, která používají Visual Basic for Applications (VBA).
    • skripty nebo aplikace, které používají Visual Basic Scripting Edition (VBScript).

    může se také zobrazit chyba „Neplatné volání procedury“.

zdá se tedy, že Microsoft se opravdu snaží tento nepořádek rychle opravit. Zatím existuje pouze oprava pro konkrétní verzi 1709 systému Windows 10. Pro novější verze systému Windows 10, natož Windows 7 nebo 8, zatím není k dispozici žádná oprava. Nicméně, toto je stříbrná podšívka na obzoru, a zdá se být pravděpodobné, že v příštím týdnu budou následovat další aktualizace, které problém vyřeší u jiných verzí vdov.

aktualizace: k dispozici je oprava pro Windows 8.1 / Windows Server 2012 R2 taky. Tato aktualizace není uvedena na stránce Historie aktualizací pro okno 8.1 na webu společnosti Microsoft a není k dispozici prostřednictvím služby Windows Update. Můžete jej nainstalovat pomocí katalogu Microsoft Update. – Právě jsem ji nainstaloval do svého hlavního vývojového počítače a zdá se, že opravuje všechny reprodukovatelné varianty této chyby uvedené výše.

Aktualizace 2019-09-02 – Náplasti jsou k dispozici pro všechny operační systémy

týden po původním, problematické Windows Update, Microsoft uvolnil několik záplat na vyčištění VBA problémy. Oprava pro nejaktuálnější verzi systému Windows 10 bohužel nějakou dobu chyběla. Nakonec 30. srpna společnost Microsoft také vydala cestu pro Windows 10, V1903.

To je trochu nepříjemné, že Microsoft podporuje Windows 10 uživatelům aktualizovat na nejnovější verzi, ale pak uvolní důležité patch chcete-li vyřešit tento vážný VBA problém týdny později než odpovídající opravy pro všechny ostatní operační systémy.

Zde je seznam všech patchů, kterým se stanoví VBA problém:

  • Windows 10, verze 1903 – 30. srpna 2019—KB4512941 (OS Build 18362.329)
  • Windows 10, verze 1809 + Windows Server 2019 – 17. srpna 2019—KB4512534 (OS Build 17763.720)
  • Windows 10, verze 1803 – 19. srpna 2019—KB4512509 (OS Build 17134.984)
  • Windows 10, verze 1709 – 16. srpna 2019—KB4512494 (OS Build 16299.1365)
  • Windows 10, verze 1703 – 17. srpna 2019—KB4512474 (OS Build 15063.2021)
  • Windows 10, verze 1607 + Windows Server 2016 – 17. srpna 2019—KB4512495 (OS Build 14393.3181)
  • Windows 8.1 Windows Server 2012 R2 Aktualizace KB4517298 16. srpna 2019
  • Windows 7 SP1 a Windows Server 2008 R2 SP1: Aktualizace KB4517297 16. srpna 2019
    (Nesprávný odkaz ke stažení. Zde je správný odkaz ke stažení do katalogu Microsoft Update)

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.