Search code examples
excelvbagoogle-drive-api

Download Google Drive File from Excel Sheet using VBA


The hyperlink below appears in a cell in an Excel Sheet. It opens and displays a file if clicked on (permissions given to anyone with the link)

How can I download a linked file to a local folder using Excel vba?


Solution

  • URLDownloadToFile on Google Drive

    • The folder C:\Test has to exist for this example to work.
    • For more info on URLDownloadToFile try to search SO or Google.

    The Code

    Option Explicit
    
    #If VBA7 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 LongPtr
    #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
    
    Function downloadFile( _
        ByVal FileURL As String, _
        ByVal FilePath As String) _
    As Boolean
        Const ProcName As String = "downloadFile"
        On Error GoTo clearError
        
        URLDownloadToFile 0, FileURL, FilePath, 0, 0
        downloadFile = True
    
    ProcExit:
        Exit Function
    clearError:
        Debug.Print "'" & ProcName & "': Unexpected Error!" & vbLf _
                  & "    " & "Run-time error '" & Err.Number & "':" & vbLf _
                  & "        " & Err.Description
        Resume ProcExit
    End Function
    
    Sub downloadGoogleDrive()
        
        Const UrlLeft As String = "http://drive.google.com/u/0/uc?id="
        Const UrlRight As String = "&export=download"
        
        Const FileID As String = "17bw2KgzD1ifcA7rdXdxiN9bN70g8jnMO"
        Const FilePath As String _
            = "C:\Test\Type1 and Type 2 errors - Atyati Temp.jpg"
        
        Dim Url As String: Url = UrlLeft & FileID & UrlRight
        
        Dim wasDownloaded As Boolean
        wasDownloaded = downloadFile(Url, FilePath)
        If wasDownloaded Then
            MsgBox "Success"
        Else
            MsgBox "Fail"
        End If
    
    End Sub