Súbita “chamada de procedimento Inválido ou o argumento” erro no VBA

por Philipp Stiefel, publicado originalmente em 15 de agosto de 2019, atualizada por último 2 de setembro, 2019

Antes de começar, vamos colocar as coisas em perspectiva: “chamada de procedimento Inválido ou o argumento” é um erro comum. Se você encontrar este erro ao escrever um novo código, é mais provável que seja um erro real em seu código e não relacionado ao tópico deste texto.

Se o código da sua aplicação estava a correr sem falhas, mas agora de repente falha com um erro de execução ‘5’ – “chamada ou argumento de procedimento inválido”, é provavelmente um problema causado pelas actualizações do Windows de 13 de agosto de 2019 para todas as versões actuais do Windows.

isso afeta todas as versões atuais do Office / VBA no Windows 10, Windows 8.1, e Windows 7 como wells como todos os sistemas operacionais Windows Server desde Windows Server 2008 até Windows Server 2019.

A própria Microsoft já adicionou este Aviso à lista de “problemas conhecidos nesta atualização”.

“Depois de instalar esta atualização, as aplicações que foram feitas usando Visual Basic 6( VB6), macros usando Visual Basic para aplicações (VBA), e scripts ou aplicativos usando Visual Basic Scripting Edition (VBScript) podem parar de responder e você pode receber um “erro de chamada de procedimento inválido.”

Microsoft está atualmente investigando este problema e irá fornecer uma atualização quando disponível.”

(Fonte: qualquer um dos artigos KB listados abaixo)

Aqui está uma lista das atualizações que causam a emissão (sem alegação de exaustividade):

  • Windows 10, Versão 1903 – dia 13 de agosto, 2019—KB4512508 (SO Construir 18362.295)
  • Windows 10, Versão de 1809 – dia 13 de agosto, 2019—KB4511553 (SO Construir 17763.678)
  • Windows 10, Versão 1803 – dia 13 de agosto, 2019—KB4512501 (SO Construir 17134.950)
  • Windows 10, Versão 1709 – dia 13 de agosto, 2019—KB4512516 (SO Construir 16299.1331)
  • Windows 10, Versão 1703 – dia 13 de agosto, 2019—KB4512507 (SO Construir 15063.1988)
  • Windows 8.1 – 13 de agosto, 2019—KB4512489 (Segurança-somente de atualização)
  • o Windows 8.1-August 13, 2019-KB4512488 (Monthly Rollup)

Some reproducible error scenarios caused by the Windows Update

I encountered two different, although related, scenarios were the “Invalid procedure call or argument” error occurs due to the installed update. Ambos estão relacionados com arrays vazios.

procedimentos aninhados com argumentos de ParamArray

Se o seu código contém vários procedimentos onde os argumentos de ParamArray variáveis são passados de um procedimento para o outro, isto irá causar o erro se a lista de ParamArray de nível superior estiver vazia.

Aqui está um pequeno exemplo de código VBA reproduzindo o erro.

Public Sub StartParamArrayTest() TestArray1End SubPrivate Sub TestArray1(ParamArray params() As Variant) TestArray2 paramsEnd SubPrivate Sub TestArray2(ParamArray params() As Variant) TestArray3 params ‘ linha Anterior será levantar de erro de 5 “chamada de procedimento Inválido ou o argumento”Final SubPrivate Sub TestArray3(ParamArray params() As Variant)’ StubOnly, chamando isso irá gerar o erro alreadyEnd Sub

eu não encontrei nenhuma solução alternativa para esse erro específico cenário ainda.

passando um ByVal vazio

se passar um array vazio para um procedimento que espera um argumento de tipo variante ByVal, a chamada de procedimento irá falhar com a mensagem de erro. Isto é provavelmente causado pela mesma mecânica interna que a situação de erro anterior.

aqui está um pequeno exemplo reproduzindo o erro.

Public Sub StartVarArrayTest() Dim testArray() Como Objeto de TestArrayProc testArray ‘ linha Anterior será levantar de erro de 5 “chamada de procedimento Inválido ou o argumento”Final SubPrivate Sub TestArrayProc(ByVal varArray Como Variante)’ StubOnly, chamando isso irá gerar o erro alreadyEnd Sub

neste caso, o erro pode ser impedido de aparecer, passando o array vazio ByRef para o procedimento.

Sub-TestArrayProc privado ( ByRef varArray como variante) ” StubOnly, chamando-o, isto não irá aumentar o Sub-errorEnd

isto deverá ser uma solução viável na maioria dos cenários.

usando a função Array para limpar uma lista de vários valores

Se você usar a função Array sem argumentos para atribuir uma lista vazia a uma variável, você verá mais uma vez o erro de “chamada de procedimento inválido”. Mas se você usar a função Array sem argumentos para limpar uma lista multi-VALOR do código VBA, você verá um erro de tempo de execução 2004 ” não há memória suficiente para executar esta operação. Fechar os programas sem necessidade e tentar a operação novamente.”

Sub-comando privado 3_ Cllick () Me.cboMultiValue.Value = Array () End Sub

i did not encounter this variation of the issue myself but it was reported in a thread on the Access MDSN Forum.

considerações adicionais – “… pode parar de responder … ”

os cenários acima mencionados são bastante fáceis de diagnosticar, uma vez que você sabe sobre a causa do erro. No entanto, estou mais preocupado com a parte “pode parar de responder” a partir da descrição da questão do saber. Isto é algo que é muito mais difícil de rastrear e diagnosticar. Agora que sabemos sobre este erro, podemos provavelmente diagnosticar tal situação também, mas sem esse conhecimento encontrar a causa teria sido quase impossível.

General Workaround / Temporary Solution

desde que a Microsoft não tenha lançado outra atualização abordando e corrigindo este problema, a única “solução” real é desinstalar as atualizações do Windows de 13 de agosto de 2019. Uma vez que você desinstalou a atualização, seu código será executado como antes. Não são necessárias mais medidas.

obviamente, desinstalar e adiar uma atualização de segurança para o Windows não é o ideal. Você deve ponderar se o efeito desta atualização em suas aplicações VBA é grave o suficiente para justificar isso.

tanto quanto sei, ainda não existe exploração existente para as questões de segurança fixadas com essa actualização. (Disclaimer: eu não sou um especialista em segurança! Assim, considerando várias aplicações severamente afetadas pelos problemas descritos acima, eu recomendei aos meus clientes para adiar a atualização até novo aviso.

Update 2019-08-18: a Fix appears to be under way …

In the late hours of August 16 Microsoft released the update August 16, 2019-KB4512494 (OS Build 16299.1365) para o Windows 10, Versão 1709 (apenas!).

a lista de “melhorias e correções” para esta atualização inclui este item:

  • aborda uma questão que pode fazer com que o seguinte deixe de responder:
    • aplicações que foram feitas usando Visual Basic 6 (VB6).Macros que usam o Visual Basic para aplicações (VBA).
    • Scripts or apps that use Visual Basic Scripting Edition (VBScript).

    Você também pode receber um erro de “chamada de procedimento inválido”.

assim, a Microsoft parece estar realmente a fazer um esforço para resolver esta confusão rapidamente. Até agora há apenas a correção para a versão particular 1709 do Windows 10. Não há nenhuma correção disponível para versões mais recentes do Windows 10, quanto mais para o Windows 7 ou 8, ainda. No entanto, este é um lado positivo no horizonte, e parece ser provável que outras atualizações que corrigem o problema em outras versões de viúvas se seguirão na próxima semana.

Update: existe uma correção disponível para o Windows 8.1/Windows Server 2012 R2 também. Esta atualização não está listada na página de histórico de atualização da janela 8.1 no site da Microsoft e não está disponível através do Windows Update. Você pode instalá-lo através do Catálogo Microsoft Update. – Acabei de instalá-lo no meu computador de desenvolvimento principal e parece corrigir todas as variações reprodutíveis deste erro mencionado acima.

Update 2019-09-02 – Patches disponíveis para todos os sistemas operacionais

na semana seguinte à atualização original e problemática do Windows, a Microsoft lançou um par de patches para limpar as questões VBA. Infelizmente, o patch para a versão mais atualizada do Windows 10 está faltando por algum tempo. Finalmente, em 30 de agosto, a Microsoft também lançou o caminho para o Windows 10, V1903.

é um pouco irritante que a Microsoft encoraje os usuários do Windows 10 a atualizar para a versão mais recente o tempo todo, mas então libera o patch importante para resolver este grave problema VBA semanas mais tarde do que os patches correspondentes para todos os outros sistemas operacionais.

Aqui está uma lista de todos os patches de fixação do VBA problema:

  • Windows 10, versão 1903 – 30 de agosto de 2019—KB4512941 (SO Construir 18362.329)
  • Windows 10, versão 1809 + Windows Server 2019 – 17 de agosto de 2019—KB4512534 (SO Construir 17763.720)
  • Windows 10, versão 1803 – 19 de agosto de 2019—KB4512509 (SO Construir 17134.984)
  • Windows 10, versão 1709 – 16 de agosto de 2019—KB4512494 (SO Construir 16299.1365)
  • Windows 10, versão 1703 – 17 de agosto de 2019—KB4512474 (SO Construir 15063.2021)
  • Windows 10, versão 1607 + Windows Server 2016 – agosto 17, 2019—KB4512495 (SO Construir 14393.3181)
  • Windows 8.1 Windows Server 2012 R2 – Atualização KB4517298 16 de agosto de 2019
  • Windows 7 SP1 e Windows Server 2008 R2 SP1: Atualização KB4517297 16 de agosto de 2019
    (Incorreta link de download. Aqui está a ligação de transferência correcta para o Catálogo Microsoft Update)

Deixe uma resposta

O seu endereço de email não será publicado.