Need little code Modification in this -
while I start it asking for save on location & have to click "save" Button. Want to over come on this . i.e. it will done by auto without click. if save location hard coded in VBA most preferable.
have to change year in code to download data for particular year. so I cant download with 2 years.
Option Explicit' Expected sequence: BeforeNavigate, DownloadBegin, NavigateComplete2, DownloadComplete, DocumentCompletePrivate mbFileDownloading As BooleanPrivate mstrDocumentToWaitFor As StringPrivate mbErrorFound As BooleanPrivate Sub UserForm_Activate() Unload MeEnd SubPrivate Sub UserForm_Initialize() Const navOpenInBackgroundTab As Long = &H1000 DoEvents LoadAllFilesEnd SubPrivate Sub LoadAllFiles() Dim strStartDate As String Dim strEndDate As String Dim datLastDate As Date Dim datWorkDate As Date Dim iYear As Integer Dim strMonth As String Dim strDay As String Dim strFileName As String Dim strFilePath As String Dim lSanityCheck As Long Const navOpenInBackgroundTab As Long = &H1000 Const lDelayTime As Long = 500000 strStartDate = Range("A1").Value 'Range("StartDate").Value strEndDate = Range("B1").Value 'Range("EndDate").Value iYear = 2014 datLastDate = DateValue(strEndDate) ' 'DateSerial(iYear, 4, 9) datWorkDate = DateValue(strStartDate) 'DateSerial(iYear, 1, 1) Do mbFileDownloading = False mbErrorFound = False strMonth = UCase(Format(datWorkDate, "MMM")) ' upper case name of the month, like JAN strFileName = "cm" & Right("0" & Day(datWorkDate), 2) & strMonth & iYear & "bhav.csv.zip" ' e.g. cm01JAN2013bhav.csv.zip strFilePath = "http://nseindia.com/content/historical/EQUITIES/" & iYear & "/" & strMonth & "/" & strFileName mstrDocumentToWaitFor = strFilePath Debug.Print strFilePath WebBrowser1.Navigate2 strFilePath, navOpenInBackgroundTab lSanityCheck = 0 While WebBrowser1.Busy DoEvents lSanityCheck = lSanityCheck + 1 If lSanityCheck > lDelayTime Then Debug.Print "Out of time" Exit Do End If Wend Do Until mbFileDownloading DoEvents lSanityCheck = lSanityCheck + 1 If lSanityCheck > lDelayTime Then Debug.Print "Out of time" Exit Do End If Loop If mbErrorFound Then Debug.Print "File " & datWorkDate & " not found" Else 'MsgBox "Ready for next file--click [OK]" End If datWorkDate = DateAdd("d", 1, datWorkDate) Debug.Print Loop Until datWorkDate > datLastDate Debug.Print "Process complete."End SubPrivate Sub WebBrowser1_FileDownload(ByVal ActiveDocument As Boolean, Cancel As Boolean) Debug.Print "WebBrowser1_FileDownload "; ActiveDocument mbFileDownloading = TrueEnd SubPrivate Sub WebBrowser1_NavigateError(ByVal pDisp As Object, URL As Variant, Frame As Variant, StatusCode As Variant, Cancel As Boolean) Debug.Print "WebBrowser1_NavigateError "; URL & " type: " & TypeName(pDisp) & " StatusCode " & StatusCode mbFileDownloading = True mbErrorFound = TrueEnd Sub''Private Sub WebBrowser1_CommandStateChange(ByVal Command As Long, ByVal Enable As Boolean)' 'Debug.Print "WebBrowser1_CommandStateChange " & Command'End Sub''Private Sub WebBrowser1_ProgressChange(ByVal Progress As Long, ByVal ProgressMax As Long)' Debug.Print "WebBrowser1_ProgressChange "; Progress' miProgressLevel = Progress'End Sub
Microsoft ExcelMicrosoft OfficeMicrosoft Applications
Last Comment
Naresh Patel
8/22/2022 - Mon
Joe Howard
If all you need is to download a file, using a WebBrowser control is an unnecessary overkill.
This will work to download a file using Windows Api calls (will work on both 32-bit and 64-bit):
Option ExplicitOption Explicit#If VBA7 Then Private Declare PtrSafe 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#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 IfSub Demo() Dim strStartDate As String Dim strEndDate As String Dim datLastDate As Date Dim datWorkDate As Date Dim iYear As Integer Dim strMonth As String Dim strDay As String Dim strFileName As String Dim strFilePath As String Dim strSavePath As String strStartDate = Range("A1").Value 'Range("StartDate").Value strEndDate = Range("B1").Value 'Range("EndDate").Value strSavePath = "C:\Test\" ' Or Range("C1").Value iYear = 2014 datLastDate = DateValue(strEndDate) ' 'DateSerial(iYear, 4, 9) datWorkDate = DateValue(strStartDate) 'DateSerial(iYear, 1, 1) strMonth = UCase(Format(datWorkDate, "MMM")) ' upper case name of the month, like JAN strFileName = "cm" & Right("0" & Day(datWorkDate), 2) & strMonth & iYear & "bhav.csv.zip" ' e.g. cm01JAN2013bhav.csv.zip strFilePath = "http://nseindia.com/content/historical/EQUITIES/" & iYear & "/" & strMonth & "/" & strFileName Call DownloadFileFromWeb(strFilePath, strSavePath)End SubPublic Function DownloadFileFromWeb(strUrl As String, strSavePath As String) As Long On Error GoTo err_1 ' Returns 0 if success, error code if not. ' Error codes: ' -2146697210 "file not found". ' -2146697211 "domain not found". ' -2147467260 "transfer aborted". DownloadFileFromWeb = URLDownloadToFile(0, strUrl, strSavePath, 0, 0)Err_Exit: Exit Functionerr_1: MsgBox Err.Description ResumeEnd Function
AFAIK, you can't save page from WebBrowser control without showing the dialog.
1. You can subclass your form and when the savedialog appears, you can hide the dialog, programmetically put the path and hit the save button. (I wrote similar code for common dialog a few days ago. Search the forum.)
2. Or, BETTER, you can loop through all objects in the DOM (WebBrowser1.Documnt) and save then from cache (or re-download those objects using URLDownloadToFile API - this will use cache by default).
(see the WebBrowser related posts in the "usefull threads..." link in my sig for an example for images.)
I am beginner to coding I don't understand very much, Even this code also provided by one of the expert in past question.so will you pls attached workbook instead & pls tell me what to do?
Mr.MacroShodow,
I can't check right now. As netdown in my location.Replying from my mobile.i will get back to as soon as possible.
Thank You
Joe Howard
Or you can use this greatly enhanced version, which incorporates some of the many works shared by Excel MasterMind Chip Pearson, chip@cpearson.com, www.cpearson.com.
List of enhancements:
Create destination folder if it doesn't exist (will create nested directories too, i.e. C:\Test\Test\Test\Test)
Gives four options what to do if file exists at destination (Overwrite, Recycle, Ignore, PromptUser)
Verifies that file exists on server before attempting download
I don't understand. How many files is it supposed to download?
Naresh Patel
ASKER
Mr.MacroShadow,
See it is date range so say if I put start date as 1 Jan 2014 to End Date 7 Jan 2014 then it will download all files in this date range & whichever is available. if any file is not available for particular date then go for next.
This will work to download a file using Windows Api calls (will work on both 32-bit and 64-bit):
Open in new window