¿Cómo consumir una API con VBA en Mac?

Crear solicitudes API y manejar JSON en VBA para Mac es similar a Windows pero con algunas limitaciones y diferencias, principalmente debido a los diferentes objetos disponibles para solicitudes HTTP y el proceso de agregar bibliotecas.

Realizar llamadas API en VBA para Mac

En Mac, la biblioteca Microsoft XML v6.0 (MSXML2) no está disponible, lo que hace que las solicitudes de red sean particularmente complicadas. Sin embargo, una solución novedosa consiste en interactuar directamente con la capa Unix de macOS utilizando funciones a nivel de sistema de la biblioteca libc.dylib, un componente estándar de macOS. Este enfoque implica el uso de funciones de la biblioteca C como popen, pclose, fread y feof dentro de VBA, lo que permite la ejecución de comandos Unix y el manejo de flujos de archivos.

VBA
Private Declare PtrSafe Function web_popen Lib "libc.dylib" Alias "popen" (ByVal command As String, ByVal mode As String) As LongPtr
Private Declare PtrSafe Function web_pclose Lib "libc.dylib" Alias "pclose" (ByVal file As LongPtr) As Long
Private Declare PtrSafe Function web_fread Lib "libc.dylib" Alias "fread" (ByVal outStr As String, ByVal size As LongPtr, ByVal Items As LongPtr, ByVal stream As LongPtr) As Long
Private Declare PtrSafe Function web_feof Lib "libc.dylib" Alias "feof" (ByVal file As LongPtr) As LongPtr

Function executeInShell(web_Command As String) As String

    Dim web_File As LongPtr
    Dim web_Chunk As String
    Dim web_Read As Long

    On Error GoTo web_Cleanup

    web_File = web_popen(web_Command, "r")

    If web_File = 0 Then
        Exit Function
    End If

    Do While web_feof(web_File) = 0
        web_Chunk = VBA.Space$(50)
        web_Read = web_fread(web_Chunk, 1, Len(web_Chunk) - 1, web_File)
        If web_Read > 0 Then
            web_Chunk = VBA.Left$(web_Chunk, web_Read)
            executeInShell = executeInShell & web_Chunk
        End If
    Loop

web_Cleanup:

    web_pclose (web_File)

End Function

Cómo funciona el código

Aprovechando las funciones de la biblioteca C

El código VBA comienza declarando funciones de libc.dylib: popen, pclose, fread y feof. Estos son esenciales para ejecutar comandos de Unix y administrar flujos de salida. La palabra clave PtrSafe garantiza la compatibilidad con versiones de 64 bits de Excel.

Ejecutando comandos Unix con popen

popen abre un shell Unix en modo «lectura», lo que permite a VBA ejecutar un comando y leer su salida. Aquí es donde se pasa un comando curl para una solicitud de API.

Salida del comando de lectura

El código emplea un bucle con feof para leer el flujo de salida. fread se utiliza para leer la salida en una cadena VBA, fragmento por fragmento. El tamaño de estos trozos se puede ajustar según sea necesario.

Cerrando el Proceso

El bucle continúa hasta llegar al final del archivo (EOF). pclose luego cierra el proceso y devuelve el código de salida del comando.

Uso de funciones

La función es versátil y puede capturar la salida de cualquier comando de shell. Para llamadas API, se utiliza un comando curl específico de la API deseada.

Ejemplo: realizar una llamada API

Aquí hay un ejemplo de cómo escribir una solicitud GET simple:

VBA
Sub GETMac() 

  Dim Cmd As String
  
  Cmd = "curl --get -H ""Content-Type"":""application/json"" -d  '""' " & URL & ""
  
  GETResult = executeInShell(Cmd)
    
End Function

Aquí hay un ejemplo de cómo escribir una solicitud POST simple:

VBA
Sub POSTMac() 

  Dim Cmd As String
  
  jsonString = jsonString = "{""nombre"":""Juan"",""edad"":30,""ciudad"":""CDMX""}"
  
  Cmd = "curl  -X POST -H ""Content-Type"":""application/json"" -d  '" & JsonString & "' " & URLCompleta & ""
  
  POSTResult = executeInShell(Cmd)

End Function

Este script demuestra la ejecución de un comando curl para recuperar datos de la API JSONPlaceholder, un caso de uso típico para probar interacciones de API.

Análisis de JSON en VBA para Mac

Para analizar JSON en VBA en una Mac, aún puedes usar la biblioteca VBA-JSON. El proceso de agregar la biblioteca a su proyecto sigue siendo el mismo:

  • Descargue VBA-JSON desde su GitHub.
  • Importe el archivo JsonConverter.bas a su proyecto VBA.
  • Dado que Microsoft Scripting Runtime no está disponible en Mac, deberá utilizar el enlace tardío o modificar la biblioteca para que sea compatible con Mac como se sugiere en su documentación.

Una vez agregado, puede analizar el JSON como se muestra en los ejemplos anteriores:

VBA
Sub JSONEjemplo()
    Dim jsonString As String
    Dim jsonObject As Object

    ' Example JSON string
    jsonString = "{""nombre"":""Juan"",""edad"":30,""ciudad"":""CDMX""}"

    ' Parse the JSON string
    Set jsonObject = JsonConverter.ParseJson(jsonString)

    ' Use the jsonObject
    MsgBox "Nombre: " & jsonObject("nombre") & ", Edad: " & jsonObject("edad")
End Sub

Limitaciones y consideraciones

La función MacScript con AppleScript es menos sólida que MSXML2 y puede tener limitaciones con solicitudes, encabezados o métodos complejos.
El manejo de errores en AppleScript es menos sencillo en comparación con VBA.
Pruebe siempre su código minuciosamente en una Mac, ya que puede haber diferencias en cómo se ejecuta el código VBA en comparación con Windows.

Conclusión

Este método desbloquea un nuevo nivel de funcionalidad para los usuarios de Mac VBA, especialmente para tareas como las interacciones API que de otro modo serían desafiantes en este entorno. Al interactuar directamente con la capa Unix de macOS, los scripts VBA pueden ser significativamente más potentes y versátiles. Este enfoque es especialmente útil para los usuarios que necesitan integrar datos o servicios externos en sus flujos de trabajo de Excel en macOS.

Conoce nuestra tienda

Ver más productos

Mejora tu nivel y logra tus objetivo

Excel

Excel cursos

Access

cursos de Access

Power BI

cursos power BI

Ayúdanos a hacer crecer el proyecto

¡Únete a nuestro Grupo de Facebook!

Deja un comentario