lunes, 16 de octubre de 2023

Cómo compartir una macro entre varias presentaciones de powerpoint

Problema: Hemos creado una macro en PowerPoint y deseamos que esté disponible en varias presentaciones de powerpoint.

Comentario: Existen varias maneras para resolver el problema pero la solución que propongo permitirá una compartición ágil solo entre aquel conjunto de presentaciones que deseemos. Para ello guardaremos el código visual basic for applications (VBA) de nuestra macro y lo importaremos en las diferentes transparencias que deseemos. 

Solución:  Una vez nuestra macro esté programada en Visual Basic, la guardaremos como archivo con extensión ".bas". Este será el archivo que importaremos cada vez.

A continuación, volveremos a la presentación y mostraremos la pestaña "Programador" en la parte superior del menú. Para ello, iremos a "Archivo" --> Abajo a la izquierda marcamos "Opciones" --> "Personalizar cinta de opciones" --> En el lado de la derecha bajo el título "Personalizar la cinta de opciones" aseguramos que está marcado "Programador". Aceptamos y arriba tendremos un nuevo menú. 

Entraremos en "Visual Basic" y en la izquierda, haremos clic derecho encima del nombre de nuestro PowerPoint, seleccionamos importar y elegimos el fichero .bas guardado. Ahora ya tendremos disponible la macro para ejecutarla aquí también.

Si encontraste una solución a tu problema y ahorraste tiempo, ya me doy por satisfecho. También podrías invitarme a un café con una pequeña donación en Paypal. ¡Gracias! 


Cómo encontrar todos los enlaces rotos en una presentación de Powerpoint

Problema: Deseamos comprobar que todos los links a páginas web que tenemos en una presentación Powerpoint estén vivos, que no estén rotos, que apunten correctamente a páginas web activas.

Comentario: En Powerpoint actualmente no existe un mecanismo para verificar que todos los link (enlaces) de una transparencia funcionen correctamente. Para ello, tendremos que crear una macro con visual basic y ejecutarla.  Además, en la programación de esta macro, no existe un mecanismo que nos devuelva todos los links de toda la presentación, tenemos que ir recorriendo transparencia a transparencia.

Solución:  A continuación comparto el código que utilizo yo. 
  • La manera de utilizarlo es ir a la pestaña "vista" --> Crear, le damos el nombre "REVISAR_HIPERVINCULOS" (atención a las mayúsculas) y copiamos este código. 
  • Para ejecutarlo, puedes pulsar en el triángulo verde que tendrás en la parte superior del editor de macros.
  • Cuando lo ejecutes, se creará un fichero de texto que se llamará "BrokenLinks.txt" en tu carpeta de usuario de Windows, que se llamará algo como "C:/Users/TU_NOMBRE" (por ejemplo, si tu usuario de Windows se llama Juan --> C:/Users/Juan o C:/Usuarios/Juan). Indicará en qué página está el enlace y de qué enlace se trata
  • Si hay enlaces rotos en la parte de notas de las diapositivas, también los identificará
  • También puedes guardar la presentación como "presentación con macros" y entonces lo tendrás siempre disponible en las macros de powerpoint. 
  • Si no quieres guardarlo dentro de la presentación, guarda como presentación normal y te saldrá un mensaje de si deseas no guardar las macros, aceptas y el código no se guardará dentro de la presentación. 
  • Para los lectores interesados explico lo que hace el código después del mismo, si eso no te interesa, simplemente copia todo el código y ejecútalo pulsando sobre el triángulo verde que tendrás en la parte superior del editor de macros (visual basic for applications, VBA):


Function CheckURL(strURL As String) As Boolean
  Dim objDemand As Object
  Dim varResult As Variant

  On Error GoTo ErrorHandler
  Set objDemand = CreateObject("WinHttp.WinHttpRequest.5.1")

  With objDemand
    .Open "GET", strURL, False
    .Send
    varResult = .StatusText
  End With

  Set objDemand = Nothing

  If varResult = "OK" Then
    CheckURL = True
  Else
    CheckURL = False
  End If

ErrorHandler:
End Function

Sub REVISAR_HIPERVINCULOS()
    Dim objDoc As Presentation
    Dim objLink As Hyperlink
    Dim strLinkAddress As String
    Dim sld As Slide
    Dim fso As Object
    Dim txtFile As Object

    Set objDoc = ActivePresentation
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set txtFile = fso.CreateTextFile(Environ("USERPROFILE") & "\BrokenLinks.txt", True)

    txtFile.WriteLine "BROKEN LINKS" & vbCrLf
    For Each sld In ActivePresentation.Slides
        For Each objLink In sld.Hyperlinks
            strLinkAddress = objLink.Address
            If Not CheckURL(strLinkAddress) Then
                txtFile.WriteLine "Link KO. Slide: " & sld.SlideIndex & " Link: " & strLinkAddress & vbCrLf
            End If
            DoEvents
        Next objLink
    Next sld

    txtFile.Close
    Set txtFile = Nothing
    Set fso = Nothing
End Sub



Aquí está el análisis del código, seguro que se puede mejorar y optimizar, pero os funcionará bien:

Function CheckURL(strURL As String) As Boolean:
  • Objetivo: Verificar si una URL dada es accesible o no.
  • Cómo funciona:
    • Se crea un objeto de solicitud HTTP (WinHttp.WinHttpRequest.5.1).
    • Intenta acceder a la URL (strURL) usando el método "GET".
    • Si la solicitud es exitosa, la función devuelve True si el estado es "OK". De lo contrario, devuelve False.
  • Errores: Si ocurre algún error durante la solicitud HTTP, la función devolverá False por defecto (porque las variables Boolean no inicializadas en VBA tienen un valor predeterminado de False).
Sub REVISAR_HIPERVINCULOS():
  • Objetivo: Revisar todos los hipervínculos en la presentación PowerPoint activa y registrar los que estén rotos en un archivo de texto.
  • Cómo funciona:
    • Primero, inicializa un objeto ActivePresentation, un FileSystemObject y un archivo de texto (BrokenLinks.txt) ubicado en el directorio del perfil del usuario.
    • La subrutina escribe "BROKEN LINKS" como encabezado en el archivo de texto.
    • Luego recorre cada diapositiva en la presentación activa.
    • Para cada diapositiva, verifica cada hipervínculo en la diapositiva usando la función CheckURL.
    • Si un hipervínculo no es válido (es decir, la función CheckURL devuelve False), se escribe información sobre ese hipervínculo roto en el archivo de texto, indicando el número de diapositiva y la dirección del hipervínculo.
    • Después de revisar todos los hipervínculos, cierra el archivo de texto y libera los objetos utilizados.
Si encontraste una solución a tu problema y ahorraste tiempo, ya me doy por satisfecho. También podrías invitarme a un café con una pequeña donación en Paypal. ¡Gracias!