Cómo ejecutar un script de python externo desde VBA de Word
🔍 WiseChecker

Cómo ejecutar un script de python externo desde VBA de Word

Desea llamar a un script de Python directamente desde Word usando VBA. Esto es útil cuando necesita procesar datos, generar informes o interactuar con sistemas externos que VBA no puede manejar por sí solo. VBA de Word puede iniciar cualquier ejecutable externo, incluido el intérprete de Python, mediante la función Shell o el objeto Windows Script Host. Este artículo explica cómo configurar el código VBA que ejecuta un script de Python externo, pasa argumentos y espera a que el script finalice antes de continuar.

Puntos clave: Ejecutar scripts de Python desde VBA de Word

  • Función Shell con la ruta de python.exe: Inicia el intérprete de Python en una ventana separada.
  • Método WshShell.Run con waitOnReturn:=True: Ejecuta el script de forma sincrónica y espera a que finalice.
  • Pasar argumentos mediante una cadena de línea de comandos: Envía rutas de archivo o parámetros al script de Python.

ADVERTISEMENT

Cómo se comunica VBA de Word con programas externos

VBA de Word no tiene una integración con Python incorporada. Para ejecutar un script de Python, VBA utiliza el sistema operativo Windows para iniciar un nuevo proceso. Los dos métodos principales son la función Shell de VBA y el objeto Windows Script Host (WshShell). Ambos métodos llaman al intérprete de Python (python.exe) y proporcionan la ruta del archivo de script como argumento.

La función Shell inicia el proceso de forma asincrónica de manera predeterminada. Esto significa que VBA continúa ejecutando la siguiente línea de código antes de que finalice el script de Python. Si su macro de Word depende de la salida del script, debe usar un método sincrónico como WshShell.Run con el parámetro waitOnReturn establecido en True.

También necesita la ruta completa a python.exe y la ruta completa a su archivo .py. Python debe estar instalado en la misma máquina. Si Python no está en el PATH del sistema, debe proporcionar la ruta completa del ejecutable.

Métodos para ejecutar un script de Python desde VBA de Word

Método 1: Usar la función Shell de VBA

La función Shell es la forma más sencilla de iniciar un programa externo. Devuelve un identificador de tarea, pero no espera a que el programa finalice. Use este método cuando no necesite esperar a que finalice el script de Python.

  1. Abrir el Editor de VBA
    Presione Alt+F11 en Word para abrir el editor de Visual Basic for Applications.
  2. Insertar un nuevo módulo
    En el Explorador de proyectos, haga clic con el botón derecho en su documento o en el proyecto Normal y elija Insertar > Módulo.
  3. Escribir la llamada a Shell
    Pegue este código en el módulo:
    Sub RunPythonShell()
    Dim pythonPath As String
    Dim scriptPath As String
    pythonPath = "C:\Python39\python.exe"
    scriptPath = "C:\MyScripts\process.py"
    Shell pythonPath & " " & scriptPath, vbNormalFocus
    End Sub
  4. Ajustar las rutas para su sistema
    Reemplace pythonPath y scriptPath con las ubicaciones reales en su equipo. Si Python está en su PATH, puede usar solo “python.exe” en lugar de la ruta completa.
  5. Ejecutar la macro
    Presione F5 mientras el cursor esté dentro de la subrutina, o cierre el editor y ejecute la macro desde Word mediante Ver > Macros.

Método 2: Usar WshShell.Run para esperar a que finalice

Cuando su macro de Word deba esperar a que finalice el script de Python antes de continuar, use el objeto Windows Script Host. Este método le da control sobre el estilo de ventana y la sincronización.

  1. Abrir el Editor de VBA
    Presione Alt+F11.
  2. Insertar un nuevo módulo
    Haga clic con el botón derecho en el proyecto y elija Insertar > Módulo.
  3. Escribir la llamada a WshShell.Run
    Pegue este código:
    Sub RunPythonWsh()
    Dim wsh As Object
    Set wsh = CreateObject("WScript.Shell")
    Dim pythonPath As String
    Dim scriptPath As String
    Dim cmd As String
    pythonPath = "C:\Python39\python.exe"
    scriptPath = "C:\MyScripts\process.py"
    cmd = pythonPath & " " & scriptPath
    wsh.Run cmd, 0, True
    Set wsh = Nothing
    End Sub
  4. Entender los parámetros
    El segundo parámetro (0) oculta la ventana de comandos. Use 1 para mostrar una ventana normal. El tercer parámetro (True) indica a VBA que espere hasta que el script finalice.
  5. Ejecutar la macro
    Presione F5 o ejecútela desde el cuadro de diálogo Macros de Word.

Método 3: Pasar argumentos al script de Python

Para enviar datos como una ruta de documento o una variable desde Word a Python, agregue argumentos a la cadena de comando. Python lee estos argumentos mediante sys.argv.

  1. Modificar el código de WshShell.Run
    Agregue argumentos adicionales después de la ruta del script:
    Sub RunPythonWithArgs()
    Dim wsh As Object
    Set wsh = CreateObject("WScript.Shell")
    Dim pythonPath As String
    Dim scriptPath As String
    Dim docPath As String
    pythonPath = "C:\Python39\python.exe"
    scriptPath = "C:\MyScripts\process.py"
    docPath = ActiveDocument.FullName
    wsh.Run pythonPath & " " & scriptPath & " " & Chr(34) & docPath & Chr(34), 0, True
    Set wsh = Nothing
    End Sub
  2. Encerrar entre comillas las rutas con espacios
    La función Chr(34) agrega comillas dobles alrededor de la ruta del documento para manejar espacios en los nombres de archivo.
  3. Escribir el script de Python para recibir el argumento
    En su archivo .py, use sys.argv[1] para acceder al primer argumento pasado desde VBA.

ADVERTISEMENT

Problemas comunes al ejecutar Python desde VBA de Word

Word se congela o se bloquea mientras espera a Python

Cuando usa WshShell.Run con waitOnReturn:=True, Word deja de responder hasta que finaliza el script de Python. Este es el comportamiento normal. Para evitar una interfaz congelada, considere ejecutar el script de forma asincrónica con Shell y verificar más tarde si finalizó, o mostrar un mensaje de estado al usuario antes de que comience la espera.

El script de Python se ejecuta pero no produce ninguna salida

La causa más común es una ruta incorrecta a python.exe o al archivo .py. Pruebe el comando primero en una ventana del Símbolo del sistema. Si el comando funciona allí pero no desde VBA, el problema suele ser una asociación de extensión de archivo faltante o una variable de entorno PATH que no está disponible para el proceso de Word. Use siempre la ruta completa a python.exe.

VBA no puede encontrar el ejecutable de Python

Si Python está instalado solo para el usuario actual, es posible que el PATH del sistema no lo incluya. Encuentre la ubicación exacta de python.exe abriendo un Símbolo del sistema y ejecutando where python. Use esa ruta completa en su código VBA. Como alternativa, agregue Python a la variable de entorno PATH del sistema y reinicie Word.

El script de Python falla debido a módulos faltantes

El intérprete de Python iniciado por VBA se ejecuta con el mismo entorno que la cuenta de usuario que ejecuta Word. Si su script importa bibliotecas de terceros que no están instaladas en ese entorno, el script fallará. Instale los paquetes necesarios con pip desde una línea de comandos que se ejecute bajo la misma cuenta de usuario.

Función Shell frente a WshShell.Run: diferencias clave

Elemento Función Shell Método WshShell.Run
Esperar a que finalice No Sí, cuando waitOnReturn=True
Control del estilo de ventana Limitado a vbNormalFocus, vbHide, etc. Control numérico completo (0=ocultar, 1=normal, etc.)
Valor devuelto Identificador de tarea (entero) Nivel de error (entero)
Requiere referencia Ninguna Requiere CreateObject(“WScript.Shell”)
Mejor caso de uso Scripts de tipo “disparar y olvidar” Scripts cuya salida se necesita antes de continuar

VBA de Word puede iniciar scripts de Python externos de forma confiable usando la función Shell o el objeto Windows Script Host. El método WshShell.Run con waitOnReturn:=True le ofrece ejecución sincrónica y un mejor control sobre la ventana de comandos. Pruebe siempre su comando en un Símbolo del sistema antes de incorporarlo en VBA. Para los scripts que modifican documentos de Word, considere pasar la ruta del documento como argumento para que Python pueda acceder al archivo directamente.

ADVERTISEMENT