Error repentino de «llamada o argumento de procedimiento no válido» en VBA

por Philipp Stiefel, publicado originalmente el 15 de agosto de 2019, actualizado por última vez el 2 de septiembre de 2019

Antes de comenzar, pongamos las cosas en perspectiva: «Llamada de procedimiento no válida o argumento» es un error bastante común. Si encuentra este error al escribir código nuevo, lo más probable es que sea un error real en su código y no esté relacionado con el tema de este texto.

Si el código de su aplicación se ejecutaba sin problemas, pero ahora falla repentinamente con un error de tiempo de ejecución ‘5’-«Llamada o argumento de procedimiento no válido», probablemente sea un problema causado por las actualizaciones de Windows del 13 de agosto de 2019 para todas las versiones actuales de Windows.

Esto afecta a todas las versiones actuales de Office / VBA en Windows 10, Windows 8.1 y Windows 7, así como a todos los sistemas operativos Windows Server desde Windows Server 2008 hasta Windows Server 2019.

El propio Microsoft ya ha añadido esta advertencia a la lista de» Problemas conocidos en esta actualización».

» Después de instalar esta actualización, las aplicaciones que se crearon con Visual Basic 6 (VB6), las macros con Visual Basic para Aplicaciones (VBA) y los scripts o aplicaciones con Visual Basic Scripting Edition (VBScript) pueden dejar de responder y puede recibir un «error de llamada a procedimiento no válido».»

Microsoft está investigando este problema y proporcionará una actualización cuando esté disponible.»

(Fuente: Cualquiera de los artículos de KB enumerados a continuación)

Aquí hay una lista de las actualizaciones que causan el problema (sin pretensión de que estén completas):

  • Windows 10, Versión 1903 – 13 de agosto de 2019—KB4512508 (OS Build 18362.295)
  • Windows 10, Versión 1809 – 13 de agosto de 2019—KB4511553 (OS Build 17763.678)
  • Windows 10, Versión 1803 – 13 de agosto de 2019—KB4512501 (OS Build 17134.950)
  • Windows 10, Versión 1709 – 13 de agosto de 2019—KB4512516 (OS Build 16299.1331)
  • Windows 10, Versión 1703 – 13 de agosto de 2019—KB4512507 (OS Build 15063.1988)
  • Windows 8.1 – 13 de agosto de 2019—KB4512489 (actualización de solo seguridad)
  • Windows 8.1—13 de agosto de 2019-KB4512488 (Resumen mensual)

Algunos escenarios de error reproducibles causados por Windows Update

Encontré dos escenarios diferentes, aunque relacionados, en los que se produce el error «Llamada o argumento de procedimiento no válido» debido a la actualización instalada. Ambos están relacionados con matrices vacías.

Procedimientos anidados con argumentos de ParamArray

Si su código contiene varios procedimientos en los que se pasan argumentos de ParamArray variables de un procedimiento a otro, esto causará el error si la matriz de parámetros de nivel superior estaba vacía.

Aquí hay un pequeño ejemplo de código VBA que reproduce el error.

Public Sub StartParamArrayTest() TestArray1End SubPrivate TestArray1(ParamArray params() Como Variante) TestArray2 paramsEnd SubPrivate TestArray2(ParamArray params() Como Variante) TestArray3 params ‘ La línea anterior generará error 5 – «Llamada o argumento de procedimiento no válido»End SubPrivate TestArray3(ParamArray params() Como Variante)’ subir el error alreadyEnd Sub

Todavía no he encontrado ninguna solución para este escenario de error en particular.

Pasar un ByVal de matriz vacía

Si pasa una matriz vacía a un procedimiento que espera un argumento de tipo Variante ByVal, la llamada al procedimiento fallará con el mensaje de error. Esto es probablemente causado por la misma mecánica interna que la situación de error anterior.

Aquí hay un pequeño ejemplo que reproduce el error.

Public Sub StartVarArrayTest() Dim testArray () Como Objeto TestArrayProc testArray ‘ La línea anterior generará el error 5 – «Llamada o argumento de procedimiento no válido»End SubPrivate TestArrayProc (ByVal varArray Como Variante)’ StubOnly, llamar a esto generará el error alreadyEnd Sub

En este caso, se puede evitar que aparezca el error pasando el array vacío ByRef al procedimiento.

Sub TestArrayProc privado (ByRef varArray Como Variante) ‘ Estrictamente, llamar a esto NO generará el Sub error

Esto debería ser una solución viable en la mayoría de los escenarios.

Uso de la función Array para borrar un cuadro combinado de varios valores

Si utiliza la función Array sin argumentos para asignar una matriz vacía a una variable, verá una vez más el error «Llamada a procedimiento no válida». Pero si usa la función de matriz sin argumentos para borrar un cuadro combinado de múltiples valores del código VBA, verá un error de tiempo de ejecución 2004 «No hay suficiente memoria para realizar esta operación. Cierre los programas innecesarios e intente la operación de nuevo.»

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

No encontré esta variación del problema, pero se informó en un hilo en el Foro Access MDSN.

Otras consideraciones – «may puede dejar de responder

Los escenarios mencionados anteriormente son bastante fáciles de diagnosticar, una vez que sepa la causa del error. Sin embargo, estoy más preocupado por la parte de «puede dejar de responder» de la descripción del problema de saber. Esto es algo que es mucho más difícil de rastrear y diagnosticar. Ahora que sabemos acerca de este error, probablemente también podamos diagnosticar tal situación, pero sin este conocimiento, encontrar la causa hubiera sido casi imposible.

Solución temporal / Solución general

Mientras Microsoft no haya lanzado otra actualización para solucionar y solucionar este problema, la única «solución» real es desinstalar las actualizaciones de Windows del 13 de agosto de 2019. Una vez que desinstale la actualización, el código se ejecutará como antes. No es necesario adoptar ninguna otra medida.

Obviamente, desinstalar y aplazar una actualización de seguridad para Windows no es lo ideal. Debe sopesar si el efecto de esta actualización en sus aplicaciones de VBA es lo suficientemente severo como para justificar esto.

Que yo sepa, todavía no hay exploit conocido para los problemas de seguridad solucionados con esa actualización. (Descargo de responsabilidad: ¡No soy un experto en seguridad! Por lo tanto, considerando varias aplicaciones gravemente afectadas por los problemas descritos anteriormente, recomendé a mis clientes que pospusieran la actualización hasta nuevo aviso.

Actualización 2019-08-18: Parece haber una corrección en marcha

En las últimas horas del 16 de agosto, Microsoft lanzó la actualización 16 de agosto de 2019—KB4512494 (Versión del sistema operativo 16299.1365) a Windows 10, Versión 1709 (¡solo!).

La lista de «Mejoras y correcciones» para esta actualización incluye este elemento:

  • Soluciona un problema que puede hacer que lo siguiente deje de responder:
    • Aplicaciones que se crearon con Visual Basic 6 (VB6).
    • Macros que utilizan Visual Basic para aplicaciones (VBA).
    • Scripts o aplicaciones que utilizan Visual Basic Scripting Edition (VBScript).

    También puede recibir un error de «Llamada de procedimiento no válida».

Entonces, Microsoft parece estar realmente haciendo un esfuerzo para arreglar este desastre rápidamente. Hasta ahora solo existe la solución para la versión particular 1709 de Windows 10. No hay ninguna solución disponible para las versiones más recientes de Windows 10, y mucho menos Windows 7 u 8, todavía. Sin embargo, este es un resquicio de esperanza en el horizonte, y parece probable que otras actualizaciones que corrijan el problema en otras versiones de Widows sigan en la próxima semana.Actualización

: También hay una solución disponible para Windows 8.1/Windows Server 2012 R2. Esta actualización no aparece en la página historial de actualizaciones de Windows 8.1 del sitio web de Microsoft y no está disponible a través de Windows Update. Puede instalarlo a través del catálogo de Microsoft Update. – Acabo de instalarlo en mi computadora de desarrollo principal y parece corregir todas las variaciones reproducibles de este error mencionado anteriormente.

Actualización 2019-09-02-Parches disponibles para todos los sistemas operativos

La semana siguiente a la original y problemática actualización de Windows, Microsoft lanzó un par de parches para limpiar los problemas de VBA. Desafortunadamente, el parche para la versión más actualizada de Windows 10 se perdió durante algún tiempo. Finalmente, el 30 de agosto, Microsoft también lanzó la ruta para Windows 10, V1903.

Es un poco molesto que Microsoft anime a los usuarios de Windows 10 a actualizar a la versión más reciente todo el tiempo, pero luego lanza el parche importante para resolver este grave problema de VBA semanas más tarde que los parches correspondientes para todos los demás sistemas operativos.

Aquí hay una lista de todos los parches que solucionan el problema de VBA:

  • Windows 10, versión 1903 – 30 de agosto de 2019—KB4512941 (Compilación del sistema operativo 18362.329)
  • Windows 10, versión 1809 + Windows Server 2019 – 17 de agosto de 2019—KB4512534 (compilación del sistema operativo 17763.720)
  • Windows 10, versión 1803 – 19 de agosto de 2019—KB4512509 (Compilación del sistema operativo 17134.984)
  • Windows 10, versión 1709 – 16 de agosto de 2019—KB4512494 (Compilación del sistema operativo 16299.1365)
  • Windows 10, versión 1703 – 17 de agosto de 2019—KB4512474 (Versión del sistema operativo 15063.2021)
  • Windows 10, versión 1607 + Windows Server 2016 – 17 de agosto de 2019—KB4512495 (Versión del sistema operativo 14393.3181)
  • Windows 8.1 Windows Server 2012 R2 – Actualización KB4517298 16 de agosto de 2019
  • Windows 7 SP1 y Windows Server 2008 R2 SP1: Actualización KB4517297 16 de agosto de 2019(Enlace de descarga incorrecto. Aquí está el enlace de descarga correcto al catálogo de Microsoft Update)

Deja una respuesta

Tu dirección de correo electrónico no será publicada.