Sudden „Invalid procedure call or argument” error in VBA

by Philipp Stiefel, pierwotnie opublikowany 15 sierpnia 2019, ostatnia aktualizacja 2 września 2019

zanim zaczniemy, spójrzmy na to z perspektywy: „Invalid procedure call lub argument” jest raczej częstym błędem. Jeśli napotkasz ten błąd podczas pisania nowego kodu, najprawdopodobniej jest to rzeczywisty błąd w kodzie i nie jest związany z tematem tego tekstu.

Jeśli kod aplikacji działał bezbłędnie, ale teraz nagle zawiedzie z błędem „5”- „Nieprawidłowe wywołanie lub argument procedury”, prawdopodobnie jest to problem spowodowany aktualizacjami systemu Windows z 13 sierpnia 2019 r.dla wszystkich aktualnych wersji systemu Windows.

dotyczy to wszystkich aktualnych wersji pakietu Office/VBA w systemach Windows 10, Windows 8.1 i Windows 7, jak również wszystkich systemów operacyjnych Windows Server Od Windows Server 2008 do Windows Server 2019.

Microsoft już dodał to Ostrzeżenie do listy „Znane problemy w tej aktualizacji”.

„Po zainstalowaniu tej aktualizacji aplikacje wykonane przy użyciu Visual Basic 6 (VB6), makra używające Visual Basic for Applications (VBA) oraz skrypty lub aplikacje używające Visual Basic Scripting Edition (VBScript) mogą przestać odpowiadać i może pojawić się błąd „Nieprawidłowe wywołanie procedury.”

Microsoft obecnie bada ten problem i udostępni aktualizację, gdy będzie dostępna.”

(źródło: dowolny z wymienionych poniżej artykułów KB)

oto lista aktualizacji powodujących problem (bez zastrzeżenia kompletności):

  • Windows 10, Wersja 1903 – 13 sierpnia 2019 r.—KB4512508 (OS Build 18362.295)
  • Windows 10, Wersja 1809 – 13 sierpnia 2019 r.—KB4511553 (OS Build 17763.678)
  • Windows 10, Wersja 1803 – 13 sierpnia 2019 r. kb4512501 (OS build 17134.950)
  • Windows 10, wersja 1709—13 sierpnia 2019 r. – KB4512516 (OS build 16299.1331)
  • Windows 10, Wersja 1703—13 sierpnia 2019 r. – kb4512507 (OS build 15063.1988)
  • Windows 8.1—13 sierpnia 2019 r. – kb4512489 (aktualizacja tylko dla bezpieczeństwa)
  • Windows 8.1-Sierpień 13, 2019-KB4512488 (miesięczny Rollup)

niektóre powtarzalne scenariusze błędów spowodowane przez Windows Update

napotkałem dwa różne, choć powiązane, scenariusze, w których wystąpił błąd „Nieprawidłowe wywołanie procedury lub argument” z powodu zainstalowanej aktualizacji. Oba są powiązane z pustymi tablicami.

zagnieżdżone procedury z argumentami ParamArray

Jeśli Twój kod zawiera kilka procedur, w których zmienne argumenty ParamArray są przekazywane z jednej procedury do drugiej, spowoduje to błąd, jeśli tablica param najwyższego poziomu była pusta.

oto mały przykład kodu VBA odtwarzający błąd.

Public Sub StartParamArrayTest() TestArray1End SubPrivate Sub TestArray1(ParamArray params() As Variant) TestArray2 paramsEnd SubPrivate Sub TestArray2(ParamArray params() As Variant) Testarray3 params ’ Poprzednia linia spowoduje błąd 5 – „Nieprawidłowe wywołanie lub argument procedury”End SubPrivate Sub TestArray3(ParamArray params() As Variant)’ StubOnly, wywołanie spowoduje to podniesienie błędu Alreadyend Sub

nie znalazłem jeszcze żadnego obejścia tego konkretnego scenariusza błędu.

przekazanie pustej tablicy ByVal

jeśli przekażesz pustą tablicę do procedury oczekującej argumentu typu Variant ByVal, wywołanie procedury zakończy się niepowodzeniem z Komunikatem o błędzie. Prawdopodobnie jest to spowodowane tą samą mechaniką wewnętrzną, co poprzednia sytuacja błędu.

oto mały przykład przedstawiający błąd.

Public Sub StartVarArrayTest() Dim testArray() As Object TestArrayProc testArray ’ Poprzednia linia wywoła błąd 5 – „Invalid procedure call or argument”End SubPrivate Sub TestArrayProc(ByVal varArray As Variant)’ StubOnly, wywołanie tego spowoduje podniesienie błędu alreadyEnd Sub

w tym przypadku można zapobiec pojawieniu się błędu poprzez przekazanie pustej tablicy ByRef do procedury.

Private Sub TestArrayProc(ByRef varArray As Variant) ’ StubOnly, wywołanie tego nie wywoła błędu Sub

to powinno być wykonalnym obejściem w większości scenariuszy.

Używanie funkcji Array do wyczyszczenia wielowartościowego pola kombi

Jeśli użyjesz funkcji Array bez argumentów do przypisania pustej tablicy do zmiennej, ponownie zobaczysz błąd „Nieprawidłowe wywołanie procedury”. Ale jeśli użyjesz funkcji tablicy bez argumentów, aby wyczyścić wielowartościowe pole kombi z kodu VBA, zobaczysz błąd run-time 2004 „nie ma wystarczającej ilości pamięci do wykonania tej operacji. Zamknij niepotrzebne programy i spróbuj ponownie.”

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

sam nie spotkałem się z tą odmianą problemu, ale zostało to zgłoszone w wątku na Forum Access MDSN.

dalsze rozważania – „… może przestać odpowiadać…”

wyżej wymienione scenariusze są dość łatwe do zdiagnozowania, gdy już wiesz o przyczynie błędu. Jednak bardziej martwię się częścią „może przestać odpowiadać”z opisu problemu know. Jest to coś, co jest znacznie trudniejsze do wyśledzenia i zdiagnozowania. Teraz, gdy wiemy już o tym błędzie, prawdopodobnie możemy również zdiagnozować taką sytuację, ale bez tej wiedzy znalezienie przyczyny byłoby prawie niemożliwe.

ogólne obejście/tymczasowe rozwiązanie

dopóki firma Microsoft nie wydała kolejnej aktualizacji adresującej i naprawiającej ten problem, jedynym prawdziwym „rozwiązaniem” jest odinstalowanie aktualizacji systemu Windows z 13 sierpnia 2019 r. Po odinstalowaniu aktualizacji kod będzie działał jak wcześniej. Dalsze działania nie są konieczne.

oczywiście odinstalowanie i odroczenie aktualizacji zabezpieczeń dla systemu Windows nie jest idealne. Powinieneś rozważyć, czy wpływ tej aktualizacji na aplikacje VBA jest wystarczająco poważny, aby to uzasadnić.

według mojej wiedzy nie istnieje jeszcze exploit dla problemów z bezpieczeństwem naprawionych przy tej aktualizacji. (Zastrzeżenie: nie jestem ekspertem od bezpieczeństwa!) Tak więc, biorąc pod uwagę kilka aplikacji poważnie dotkniętych problemami opisanymi powyżej, zaleciłem moim klientom odroczenie aktualizacji do odwołania.

aktualizacja 2019-08-18: poprawka wydaje się być w toku …

w późnych godzinach 16 sierpnia Microsoft wydał aktualizację 16 sierpnia 2019 r.—KB4512494 (OS Build 16299.1365) do Windows 10, Wersja 1709 (tylko!).

lista „ulepszeń i poprawek” dla tej aktualizacji zawiera ten element:

  • rozwiązuje problem, który może spowodować, że następujące aplikacje przestaną odpowiadać:
    • aplikacje stworzone przy użyciu Visual Basic 6 (VB6).
    • makra używające Visual Basic for Applications (VBA).
    • Skrypty lub aplikacje korzystające z Visual Basic Scripting Edition (VBScript).

    Możesz również otrzymać błąd „Invalid procedure call”.

więc wydaje się, że Microsoft naprawdę stara się szybko naprawić ten bałagan. Do tej pory istnieje tylko poprawka dla konkretnej wersji 1709 systemu Windows 10. Nie ma poprawki dostępnej dla nowszych wersji systemu Windows 10, nie mówiąc już o Windows 7 lub 8. Niemniej jednak jest to srebrna linia na horyzoncie i wydaje się prawdopodobne, że inne aktualizacje naprawiające ten problem w innych wersjach wdów pojawią się w przyszłym tygodniu.

aktualizacja: dostępna jest poprawka również dla systemu Windows 8.1 / Windows Server 2012 R2. Ta aktualizacja nie jest wymieniona na stronie historii aktualizacji dla Okna 8.1 w witrynie firmy Microsoft i nie jest dostępna za pośrednictwem usługi Windows Update. Możesz go zainstalować za pośrednictwem katalogu Microsoft Update. – Właśnie zainstalowałem go na moim głównym komputerze programistycznym i wydaje się, że naprawia wszystkie powtarzalne odmiany tego błędu wymienionego powyżej.

aktualizacja 2019-09-02 – łatki dostępne dla wszystkich systemów operacyjnych

tydzień po pierwotnej, problematycznej aktualizacji systemu Windows, Microsoft wydał kilka łatek, aby usunąć problemy z VBA. Niestety od jakiegoś czasu brakuje poprawki do najbardziej aktualnej wersji systemu Windows 10. Ostatecznie 30 sierpnia Microsoft wydał również ścieżkę dla systemu Windows 10, V1903.

to trochę denerwujące, że Microsoft zachęca użytkowników systemu Windows 10 do aktualizacji do najnowszej wersji przez cały czas, ale następnie wydaje ważną łatkę, aby rozwiązać ten poważny problem VBA tygodnie później niż odpowiednie poprawki dla wszystkich innych systemów operacyjnych.

Oto lista wszystkich poprawek naprawiających problem VBA:

  • Windows 10, wersja 1903 – 30 sierpnia 2019 r.—KB4512941 (OS Build 18362.329)
  • Windows 10, wersja 1809 + Windows Server 2019 – 17 sierpnia 2019 r.—KB4512534 (OS Build 17763.720)
  • Windows 10, wersja 1803 – 19 sierpnia 2019 r.—KB4512509 (OS Build 17134.984)
  • Windows 10, wersja 1709 – 16 sierpnia 2019 r.—KB4512494 (OS Build 16299.1365)
  • Windows 10, Wersja 1703 – 17 sierpnia 2019 r—kb4512474 (OS build 15063.2021)
  • Windows 10, wersja 1607 + Windows Server 2016 – 17 sierpnia 2019 r.—kb4512495 (OS build 14393.3181)
  • Windows 8.1 Windows Server 2012 R2 – aktualizacja kb4517298 16 sierpnia 2019 r
  • Windows 7 SP1 i Windows Server 2008 R2 SP1: aktualizacja kb4517297 16 sierpnia 2019 r
    (niepoprawny link do pobrania. Oto poprawny link do katalogu Microsoft Update)

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.