Contenido
- 1 Realizar llamadas API en VBA para Mac
- 2 Cómo funciona el código
- 3 Ejemplo: realizar una llamada API
- 4 Análisis de JSON en VBA para Mac
- 5 Limitaciones y consideraciones
- 6 Conclusión
- 7 Conoce nuestra tienda
- 8 Mejora tu nivel y logra tus objetivo
- 9 Ayúdanos a hacer crecer el proyecto
- 10 ¡Únete a nuestro Grupo de Facebook!
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.
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:
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:
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:
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.