Hola mundo! Hoy veremos cómo gestionar archivos usando Dropbox API desde Excel VBA
Vale! Trataré de hacer muy sencilla la explicación y empezaré desde un punto cero, quizá más adelante haga una segunda parte
Descargar Dropbox API desde Excel VBA (Contraseña: tutorialesexcel.com)
Los puntos que veremos serán:
- Crear una cuenta en Dropbox y obtener nuestras credenciales
- Subir un archivo a Dropbox desde VBA
- Listar archivos en nuestro Dropbox desde VBA
- Descargar archivos de nuestro Dropbox con VBA
Crear una cuenta en Dropbox y obtener nuestras credenciales
Vale! Como diría Franky esto es SÚPER NECESARIO, hay que hacerlo de la manera más apropiada
He creado el correo dropbox@tutorialesexcel.com, el cual usaremos para crear nuestra cuenta en Dropbox y obtener nuestras credenciales
Ingresamos a www.dropbox.com/login y creamos una cuenta

Te llegará un correo, es necesario que validez tu cuenta sino no podrás usar la API

Ahora debemos ingresar al enlace dropbox.github.io/dropbox-api-v2-explorer/

Damos click sobre token/from_oauth1 o podemos ir al siguiente enlace dropbox.github.io/dropbox-api-v2-explorer/#auth_token/from_oauth1
Ahora debemos dar clic sobre Get Token

Luego click sobre permitir y obtenemos nuestro token


Muy bien y para el proceso que queremos hacer ya tenemos todo lo necesario
Subir un archivo a Dropbox desde Excel VBA
Vale, esta es la parte más difícil, trataré de explicarlo lo mejor posible así que mucha atención
Primero debemos crear la carpeta en donde subiremos nuestro archivo, vamos a dropbox.com/home y creamos la carpeta

Muy bien, ahora que ya está creada programaremos un código en Excel VBA que nos permita alojar un archivo en ésta carpeta
Y debido al periódico uso que vamos a realizar, he decidido programarlo en un módulo de clase
Public Token As String, rutaDescargar As String, carpetaDB As String Public Function cargarDropbox(archivoSubir As String, Optional nombreDropbox As String) As Boolean Dim enviado$, subida$ Respuesta = ArchivoByte(archivoSubir) If nombreDropbox <> Empty Then subida = nombreDropbox Else subida = nombreArchivo(archivoSubir) End If subida = "/" & carpetaDB & "/" & subida enviado = "{""path"":""" & subida & """,""mode"":{"".tag"":""overwrite""},""autorename"":false,""mute"":true}" Set req = CreateObject("WINHTTP.WinHTTPRequest.5.1") req.Open "POST", "https://content.dropboxapi.com/2/files/upload", False req.setRequestHeader "Authorization", "Bearer " & Token req.setRequestHeader "Content-Type", "application/octet-stream" req.setRequestHeader "Dropbox-API-Arg", enviado req.setRequestHeader "User-Agent", "api-explorer-client" req.send (Respuesta) If req.Status = 200 Then cargarDropbox = True Else cargarDropbox = False End If End Function Private Function ArchivoByte(archivo As String) As Byte() Dim b() As Byte Open archivo For Binary As #1 ReDim b(FileLen(archivo) - 1) Get #1, , b Close #1 ArchivoByte = b End Function Private Function nombreArchivo(archivo As String) As String Dim ubi As Integer ubi = InStrRev(archivo, "\") nombreArchivo = Mid(archivo, ubi + 1, Len(archivo)) End Function
He creado una variable opcional por si necesitamos escribir un nuevo nombre a nuestro archivo a subir, la pregunta más frecuente con respecto a este código es el request
Los datos del request los he obtenido desde el mismo Dropbox API dropbox.github.io/dropbox-api-v2-explorer/#files_upload

Y para usar el módulo de clase creado, usaremos un módulo
Const TokenDropbox As String = "sl.AHg4FfCIfoib3ypkFypMXd2oBsJcIpYqPlxRFJ0QSH7SmcF8OxfXHiWGXRhBjj_1pZigidq68jnAha-CQUAWcVaL5cmMqISttG1OJKqklunngFYyb0vAP-MLXihP4AfsAtvpmjq_" Const carpetaDropbox As String = "archivos" Sub Carga() Dim nuevo As New Dropbox, archivo$, nombre$ nuevo.Token = TokenDropbox nuevo.carpetaDB = carpetaDropbox archivo = Application.GetOpenFilename nombre = Dir(archivo) If nuevo.cargarDropbox(archivo, nombre) = True Then MsgBox "Archivo subido correctamente", vbInformation, "TutorialesExcel.com" Else MsgBox "Error al intentar subir el archivo", vbCritical, "TutorialesExcel.com" End If End Sub
He definido dos constantes, para brindarle al lector la facilidad de sólo asignarle el valor que necesite para poder crear su propia conexión
Listar archivos en nuestro Dropbox desde VBA
Estamos viendo cómo usar la Dropbox API desde Excel VBA, este proceso será muy parecido al paso anterior
Esta vez trabajaremos con otro request, las cuales las podemos obtener desde aquí

Programaremos el código de listado y lo agregaremos a nuestro módulo de clase
Public Sub listarDropbox(Hoja As Worksheet, Optional fila As Long) Dim i As Long enviado = "{""path"": ""/" & carpetaDB & """}" Set req = CreateObject("WINHTTP.WinHTTPRequest.5.1") req.Open "POST", "https://api.dropboxapi.com/2/files/list_folder", False req.setRequestHeader "Authorization", "Bearer " & Token req.setRequestHeader "Content-Type", "application/json" req.setRequestHeader "User-Agent", "api-explorer-client" req.send (enviado) If req.Status = 200 Then Set jsonObject = JsonConverter.ParseJson(req.ResponseText) If fila <> Empty Then i = fila Else i = 10 End If With Hoja .Range("A9", "A" & Rows.Count).EntireRow.Delete .Range("A" & i - 1) = "Name": .Range("B" & i - 1) = "ID": .Range("C" & i - 1) = "Client_modified": .Range("D" & i - 1) = "Server_modified" .Range("E" & i - 1) = "Rev": .Range("F" & i - 1) = "Size": .Range("G" & i - 1) = "Content_hash" For Each Item In jsonObject("entries") .Range("A" & i) = jsonObject("entries")(i - 9)("name") .Range("B" & i) = jsonObject("entries")(i - 9)("id") .Range("C" & i) = jsonObject("entries")(i - 9)("client_modified") .Range("D" & i) = jsonObject("entries")(i - 9)("server_modified") .Range("E" & i) = jsonObject("entries")(i - 9)("rev") .Range("F" & i) = jsonObject("entries")(i - 9)("size") .Range("G" & i) = jsonObject("entries")(i - 9)("content_hash") i = i + 1 Next End With End If End Sub
Usamos a la librería JsonConverter, la cual la puedes descargar del siguiente link (Contraseña: tutorialesexcel.com)
Y ahora sólo ejecutaremos un pequeño procedimiento
Sub listado() Dim nuevo As New Dropbox nuevo.Token = TokenDropbox nuevo.carpetaDB = carpetaDropbox nuevo.listarDropbox Hoja1, 10 End Sub
Descargar archivos de nuestro Dropbox con VBA
Vale en este caso usaremos a dropbox.github.io/dropbox-api-v2-explorer/#files_get_temporary_link

Parseando el Json obtenido podemos obtener el link temporal de descarga, de la siguiente forma
Public Function descargarDropbox(Optional nombreArchivo As String) As Boolean Set req = CreateObject("WINHTTP.WinHTTPRequest.5.1") result = "{""path"": ""/" & carpetaDB & "/" & nombreArchivo & """}" req.Open "POST", "https://api.dropboxapi.com/2/files/get_temporary_link", False req.setRequestHeader "Authorization", "Bearer " & Token req.setRequestHeader "Content-Type", "application/json" req.setRequestHeader "User-Agent", "api-explorer-client" req.send (result) If req.Status = 200 Then descargarDropbox = True Set jsonObject = JsonConverter.ParseJson(req.ResponseText) Debug.Print jsonObject("link") Else descargarDropbox = False End If End Function
Ahora usaremos una API para descargar el archivo temporal Descargar archivo web en 3 simples pasos VBA, quedando nuestro código de la siguiente forma
#If VBA7 And Win64 Then Private Declare PtrSafe Function URLDownloadToFile Lib "urlmon" _ Alias "URLDownloadToFileA" ( _ ByVal pCaller As LongPtr, _ ByVal szURL As String, _ ByVal szFileName As String, _ ByVal dwReserved As LongPtr, _ ByVal lpfnCB As LongPtr _ ) As Long #Else Private Declare Function URLDownloadToFile Lib "urlmon" _ Alias "URLDownloadToFileA" ( _ ByVal pCaller As Long, _ ByVal szURL As String, _ ByVal szFileName As String, _ ByVal dwReserved As Long, _ ByVal lpfnCB As Long _ ) As Long #End If Public Token As String, rutaDescargar As String, carpetaDB As String Public Function descargarDropbox(Optional nombreArchivo As String) As Boolean Set req = CreateObject("WINHTTP.WinHTTPRequest.5.1") result = "{""path"": ""/" & carpetaDB & "/" & nombreArchivo & """}" req.Open "POST", "https://api.dropboxapi.com/2/files/get_temporary_link", False req.setRequestHeader "Authorization", "Bearer " & Token req.setRequestHeader "Content-Type", "application/json" req.setRequestHeader "User-Agent", "api-explorer-client" req.send (result) If req.Status = 200 Then descargarDropbox = True Set jsonObject = JsonConverter.ParseJson(req.ResponseText) URLDownloadToFile 0, jsonObject("link"), rutaDescargar & nombreArchivo, 0, 0 Else descargarDropbox = False End If End Function
Crearemos un proceso adicional en el módulo
Sub descarga() Dim nuevo As New Dropbox nuevo.Token = TokenDropbox nuevo.carpetaDB = carpetaDropbox nuevo.rutaDescargar = rutaDropbox If nuevo.descargarDropbox("LuIS.jpg") = True Then MsgBox "Archivo descargado exitosamente " & Chr(13) & "Ruta: " & rutaDropbox, vbInformation, "TutorialesExcel.com" Else MsgBox "Problema al descargar archivo", vbCritical, "TutorialesExcel.com" End If End Sub
Y listo hemos terminado, espero te haya gustado mi publicación
Cualquier consulta o asesoría puedes escribirme a Luisrojas@tutorialesexcel.com
Descargar Dropbox API desde Excel VBA (Contraseña: tutorialesexcel.com)
Recuerda que puedes descargar todos los archivos de mi blog completamente gratis desde tutorialesexcel.com/archivos/