Gestionar proyectos VBA en presentaciones usando Python

Introducción

Aspose.Slides proporciona clases e interfaces para trabajar con macros y código VBA.

Añadir macros VBA

Aspose.Slides proporciona la clase VbaProject para permitirle crear proyectos VBA (y referencias de proyectos) y editar módulos existentes. Puede usar la clase VbaProject para gestionar VBA incrustado en una presentación.

  1. Crear una instancia de la clase Presentation.
  2. Utilizar el constructor de VbaProject para añadir un nuevo proyecto VBA.
  3. Añadir un módulo al proyecto VBA.
  4. Establecer el código fuente del módulo.
  5. Añadir referencias a stdole.
  6. Añadir referencias a Microsoft Office.
  7. Asociar las referencias con el proyecto VBA.
  8. Guardar la presentación.

Este código Python le muestra cómo añadir una macro VBA desde cero a una presentación:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, SaveFormat, VbaProject, VbaReferenceOleTypeLib

presentation = Presentation()
try:
    # Crear un nuevo proyecto VBA.
    vba_project = VbaProject()
    presentation.setVbaProject(vba_project)

    # Añadir un módulo vacío y establecer su código fuente.
    module = vba_project.getModules().addEmptyModule("Module")
    module.setSourceCode('Sub Test(oShape As Shape)\n    MsgBox "Test"\nEnd Sub')

    # Crear referencias a stdole y Microsoft Office.
    stdole_reference = VbaReferenceOleTypeLib("stdole", r"*\G{00020430-0000-0000-C000-000000000046}#2.0#0#C:\Windows\system32\stdole2.tlb#OLE Automation")
    office_reference = VbaReferenceOleTypeLib("Office", r"*\G{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}#2.0#0#C:\Program Files\Common Files\Microsoft Shared\OFFICE14\MSO.DLL#Microsoft Office 14.0 Object Library")

    # Añadir referencias al proyecto VBA.
    vba_project.getReferences().add(stdole_reference)
    vba_project.getReferences().add(office_reference)

    # Guardar la presentación.
    presentation.save("test.pptm", SaveFormat.Pptm)
finally:
    presentation.dispose()

Eliminar macros VBA

Usando el método getVbaProject de la clase Presentation, puede eliminar una macro VBA.

  1. Crear una instancia de la clase Presentation y cargar la presentación que contiene la macro.
  2. Acceder al módulo de la macro y eliminarlo.
  3. Guardar la presentación modificada.

Este código Python le muestra cómo eliminar una macro VBA:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, SaveFormat

# Cargar la presentación que contiene la macro.
presentation = Presentation("VBA.pptm")
try:
    # Acceder al módulo VBA y eliminarlo.
    vba_project = presentation.getVbaProject()
    if vba_project is not None and len(list(vba_project.getModules())) > 0:
        module = vba_project.getModules().get_Item(0)
        vba_project.getModules().remove(module)

    # Guardar la presentación.
    presentation.save("test.pptm", SaveFormat.Pptm)
finally:
    presentation.dispose()

Extraer macros VBA

  1. Crear una instancia de la clase Presentation y cargar la presentación que contiene la macro.
  2. Comprobar si la presentación contiene un proyecto VBA.
  3. Recorrer todos los módulos contenidos en el proyecto VBA para ver las macros.

Este código Python le muestra cómo extraer macros VBA de una presentación que contiene macros:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation

# Cargar la presentación que contiene la macro.
presentation = Presentation("VBA.pptm")
try:
    # Comprobar si la presentación contiene un proyecto VBA.
    vba_project = presentation.getVbaProject()
    if vba_project is not None:
        for module in vba_project.getModules():
            print(module.getName())
            print(module.getSourceCode())
finally:
    presentation.dispose()

Comprobar si un proyecto VBA está protegido con contraseña

Usando el método VbaProject.isPasswordProtected, puede determinar si las propiedades de un proyecto están protegidas con contraseña.

  1. Crear una instancia de la clase Presentation y cargar una presentación que contiene una macro.
  2. Comprobar si la presentación contiene un VBA project.
  3. Verificar si el proyecto VBA está protegido con contraseña para ver sus propiedades.
import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation

presentation = Presentation("VBA.pptm")
try:
    # Comprobar si la presentación contiene un proyecto VBA.
    vba_project = presentation.getVbaProject()
    if vba_project is not None:
        if vba_project.isPasswordProtected():
            print(f"The VBA project '{vba_project.getName()}' is password-protected for viewing its properties.")
finally:
    presentation.dispose()

FAQ

¿Qué ocurre con las macros si guardo la presentación como PPTX?

Las macros se eliminarán porque PPTX no admite VBA. Para conservar las macros, elija PPTM, PPSM o POTM.

¿Puede Aspose.Slides ejecutar macros dentro de una presentación para, por ejemplo, actualizar datos?

No. La biblioteca nunca ejecuta código VBA; la ejecución solo es posible dentro de PowerPoint con la configuración de seguridad adecuada.

¿Se admite trabajar con controles ActiveX vinculados a código VBA?

Sí, puede acceder a los ActiveX controls, modificar sus propiedades y eliminarlos. Esto es útil cuando las macros interactúan con ActiveX.