从网站下载文件

我在Mac上使用Excel 2011,这意味着我不能(或至less我不知道如何)导航到网页,并将数据从下载链接保存到Excel工作簿。 在这个网站上,

https://finance.yahoo.com/quote/SPY/history?period1=1342681200&period2=1500447600&interval=1d&filter=history&frequency=1d

Sub Test() Dim ws As Worksheet Dim qr As QueryTable Dim URL As String Set ws = Worksheets("Sheet1") Sheets("Sheet1").Cells.Clear URL = "https://finance.yahoo.com/quote/SPY/history?period1=1342681200&period2=1500447600&interval=1d&filter=history&frequency=1d" Set qr = ws.QueryTables.Add( _ Connection:="URL;" & URL, _ Destination:=Range("A1")) qr.RefreshStyle = xlOverwriteCells = True qr.BackgroundQuery = True qr.SaveData = True qr.Refresh BackgroundQuery = False End Sub 

有一个“下载数据”button。 我试图把这些数据放入Excel,然后计算5年的标准偏差。 谢谢!!

我遇到的一个问题是,为了查看所有date,必须向下滚动,所以当我将数据input到查询表时,它只会从首先显示的date中提取数据。

我使用@ ryguy72发布的部分代码,以及使用TextFileColumnDataTypes为每个列提供正确数据格式的部分来自Open CSV文件? 得到这个最小的代码作为一个testing。

它在Windows中工作,也许它会在Mac上工作(在电stream表上创build一个表格,并使用程序中的URL中的股票数据填充)

With块中的所有参数都不是必须的,但是你可以通过注释掉一些并运行代码(当然它们都可以留在)

 Sub DownloadStockQuotes() Dim qurl As String qurl = "http://finance.google.com/finance/historical?q=SPY&startdate=Jan+01+1970&enddate=Dec+31+2050&output=csv" Dim qt As QueryTable Set qt = ActiveSheet.QueryTables.Add(connection:="TEXT;" & qurl, Destination:=Range("b2")) With qt .Name = "Output" .FieldNames = True .RowNumbers = True .FillAdjacentFormulas = False .PreserveFormatting = True .RefreshOnFileOpen = False .RefreshStyle = xlInsertDeleteCells .SavePassword = False .SaveData = True .AdjustColumnWidth = True .RefreshPeriod = 0 .TextFilePromptOnRefresh = False .TextFilePlatform = 1252 .TextFileStartRow = 1 .TextFileParseType = xlDelimited .TextFileTextQualifier = xlTextQualifierDoubleQuote .TextFileConsecutiveDelimiter = False .TextFileTabDelimiter = True .TextFileSemicolonDelimiter = False .TextFileCommaDelimiter = True .TextFileSpaceDelimiter = False .TextFileColumnDataTypes = Array(2) ' This doesn't make any difference anymore .TextFileTrailingMinusNumbers = True .Refresh BackgroundQuery:=False End With End Sub 

这里是我收集的所有信息

第一个链接:请访问https://finance.yahoo.com/quote/SPY/history?period1=0&period2=1900000000&interval=1d&filter=history&frequency=1d

我将开始date更改为零,结束date为1900000000,这是1970年1月1日至2030年3月17日。(unix timestamps)

右键点击“下载数据”链接…复制链接地址

这给了第二个链接: https : //query1.finance.yahoo.com/v7/finance/download/SPY?period1=0&period2=1900000000&interval=1d&events=history&crumb=aGnIEkELa61

导航到该URL将返回一个跨越1993年1月29日至今天(今天直到2030年)的SPY.csv文件,

每次你需要新的数据(使用cURL),你的程序将不得不转到那个URL(第二个链接),然后把csv文件下载到内存中并保存。

现在这个catch,下载的URL在第一个链接的html源文件中不是明文的。

这就是你的程序所要做的:(它不会使用Web浏览器,而是cURL,它是一个可以从Web服务器请求数据的程序)

你做这些步骤,让你知道涉及什么

使用谷歌浏览器打开第一个链接…右键单击…查看页面源代码

将源文件复制并粘贴到文本编辑器中

searchcrumb的值(aGnIEkELa61在第二个链接)(顺便说一句:这是一个cookie)

这显示你在哪里find碎屑(你的程序不会知道碎屑的价值,它将不得不在这里find它)

组装查询url…

url = "https://query1.finance.yahoo.com/v7/finance/download/SPY?period1=0&period2=1900000000&interval=1d&events=history&crumb=" & crumbValue

导航到生成的URL并下载csv文本数据并对其进行处理

回顾一下:

所有由脚本调用的cURL完成的下载

下载第一个链接到内存并parsing(查找碎屑的值)

使用crumb来计算另一个URL(csv数据)

从计算的url下载数据到内存中,并parsing成表(或保存并导入…可能更容易)

好的我现在明白了。 看看下面的链接。

http://investexcel.net/multiple-stock-quote-downloader-for-excel/

从标题为“Get Excel Spreadsheet下载来自Google Finance的批量历史库存数据”的链接下载该文件。 这会给你你想要的。 我会在这里发布代码,但是它相当广泛,可能不一定有帮助。

在这里输入图像描述

 'Samir Khan 'simulationconsultant@gmail.com 'The latest version of this spreadsheet can be downloaded from http://investexcel.net/multiple-stock-quote-downloader-for-excel/ 'Please link to http://investexcel.net if you like this spreadsheet Sub DownloadStockQuotes(ByVal stockTicker As String, ByVal StartDate As Date, ByVal EndDate As Date, ByVal DestinationCell As String, ByVal freq As String) Dim qurl As String Dim StartMonth, StartDay, StartYear, EndMonth, EndDay, EndYear As String qurl = "http://finance.google.com/finance/historical?q=" & stockTicker qurl = qurl & "&startdate=" & MonthName(Month(StartDate), True) & _ "+" & Day(StartDate) & "+" & Year(StartDate) & _ "&enddate=" & MonthName(Month(EndDate), True) & _ "+" & Day(EndDate) & "+" & Year(EndDate) & "&output=csv" On Error GoTo ErrorHandler: QueryQuote: With ActiveSheet.QueryTables.Add(Connection:="URL;" & qurl, Destination:=Range(DestinationCell)) .BackgroundQuery = True .TablesOnlyFromHTML = False .Refresh BackgroundQuery:=False .SaveData = True End With ErrorHandler: End Sub Sub DownloadData() Dim frequency As String Dim numRows As Integer Dim lastRow As Integer Dim lastErrorRow As Integer Dim lastSuccessRow As Integer Dim stockTicker As String Dim numStockErrors As Integer Dim numStockSuccess As Integer numStockErrors = 0 numStockSuccess = 0 Application.Calculation = xlCalculationManual Application.ScreenUpdating = False lastErrorRow = ActiveSheet.Cells(Rows.Count, "J").End(xlUp).Row lastSuccessRow = ActiveSheet.Cells(Rows.Count, "L").End(xlUp).Row ClearErrorList lastErrorRow ClearSuccessList lastSuccessRow lastRow = ActiveSheet.Cells(Rows.Count, "a").End(xlUp).Row frequency = Worksheets("Parameters").Range("b7") 'Delete all sheets apart from Parameters sheet Dim ws As Worksheet Application.DisplayAlerts = False For Each ws In Worksheets If ws.Name <> "Parameters" And ws.Name <> "About" Then ws.Delete Next Application.DisplayAlerts = True 'Loop through all tickers For ticker = 12 To lastRow stockTicker = Worksheets("Parameters").Range("$a$" & ticker) If stockTicker = "" Then GoTo NextIteration End If Sheets.Add After:=Sheets(Sheets.Count) If InStr(stockTicker, ":") > 0 Then ActiveSheet.Name = Replace(stockTicker, ":", "") Else ActiveSheet.Name = stockTicker End If Cells(1, 1) = "Stock Quotes for " & stockTicker Call DownloadStockQuotes(stockTicker, Worksheets("Parameters").Range("$b$5"), Worksheets("Parameters").Range("$b$6"), "$a$2", frequency) Columns("a:a").TextToColumns Destination:=Range("a1"), DataType:=xlDelimited, _ TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _ Semicolon:=False, Comma:=True, Space:=False, Other:=False, FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), Array(7, 1)) If InStr(stockTicker, ":") > 0 Then stockTicker = Replace(stockTicker, ":", "") End If Sheets(stockTicker).Columns("A:G").ColumnWidth = 10 lastRow = Sheets(stockTicker).UsedRange.Row - 2 + Sheets(stockTicker).UsedRange.Rows.Count If lastRow < 3 Then Application.DisplayAlerts = False Sheets(stockTicker).Delete numStockErrors = numStockErrors + 1 ErrorList stockTicker, numStockErrors GoTo NextIteration Application.DisplayAlerts = True Else numStockSuccess = numStockSuccess + 1 If Left(stockTicker, 1) = "^" Then SuccessList Replace(stockTicker, "^", ""), numStockSuccess Else SuccessList stockTicker, numStockSuccess End If End If Sheets(stockTicker).Sort.SortFields.Add Key:=Range("A3:A" & lastRow), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With Sheets(stockTicker).Sort .SetRange Range("A2:G" & lastRow) .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With Range("a3:a" & lastRow).NumberFormat = "yyyy-mm-dd;@" 'Delete final blank row otherwise will get ,,,, at bottom of CSV Sheets(stockTicker).Rows(lastRow + 1 & ":" & Sheets(stockTicker).Rows.Count).Delete 'Remove initial ^ in ticker names from Sheets If Left(stockTicker, 1) = "^" Then ActiveSheet.Name = Replace(stockTicker, "^", "") Else ActiveSheet.Name = stockTicker End If 'Remove hyphens in ticker names from Sheet names, otherwise error in collation If InStr(stockTicker, "-") > 0 Then ActiveSheet.Name = Replace(stockTicker, "-", "") End If NextIteration: Next ticker Application.DisplayAlerts = False If Sheets("Parameters").Shapes("WriteToCSVCheckBox").ControlFormat.Value = xlOn Then On Error GoTo ErrorHandler: Call CopyToCSV End If If Sheets("Parameters").Shapes("CollateDataCheckBox").ControlFormat.Value = xlOn Then On Error GoTo ErrorHandler: Call CollateData End If ErrorHandler: Worksheets("Parameters").Select Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic Worksheets("Parameters").Select For Each C In ThisWorkbook.Connections C.Delete Next End Sub Sub CollateData() Dim ws As Worksheet Dim i As Integer, first As Integer Dim maxRow As Integer Dim maxTickerWS As Worksheet maxRow = 0 For Each ws In Worksheets If ws.Name <> "Parameters" Then If ws.UsedRange.Rows.Count > maxRow Then maxRow = ws.UsedRange.Rows.Count Set maxTickerWS = ws End If End If Next Sheets.Add After:=Sheets(Sheets.Count) ActiveSheet.Name = "Open" Sheets.Add After:=Sheets(Sheets.Count) ActiveSheet.Name = "High" Sheets.Add After:=Sheets(Sheets.Count) ActiveSheet.Name = "Low" Sheets.Add After:=Sheets(Sheets.Count) ActiveSheet.Name = "Close" Sheets.Add After:=Sheets(Sheets.Count) ActiveSheet.Name = "Volume" Sheets.Add After:=Sheets(Sheets.Count) ActiveSheet.Name = "Adjusted Close" i = 1 maxTickerWS.Range("A2", "B" & maxRow).Copy Destination:=Sheets("Open").Cells(1, i) Sheets("Open").Cells(1, i + 1) = maxTickerWS.Name maxTickerWS.Range("A2", "a" & maxRow).Copy Destination:=Sheets("High").Cells(1, i) maxTickerWS.Range("c2", "c" & maxRow).Copy Destination:=Sheets("High").Cells(1, i + 1) Sheets("High").Cells(1, i + 1) = maxTickerWS.Name maxTickerWS.Range("A2", "a" & maxRow).Copy Destination:=Sheets("Low").Cells(1, i) maxTickerWS.Range("d2", "d" & maxRow).Copy Destination:=Sheets("Low").Cells(1, i + 1) Sheets("Low").Cells(1, i + 1) = maxTickerWS.Name maxTickerWS.Range("A2", "a" & maxRow).Copy Destination:=Sheets("Close").Cells(1, i) maxTickerWS.Range("e2", "e" & maxRow).Copy Destination:=Sheets("Close").Cells(1, i + 1) Sheets("Close").Cells(1, i + 1) = maxTickerWS.Name maxTickerWS.Range("A2", "a" & maxRow).Copy Destination:=Sheets("Volume").Cells(1, i) maxTickerWS.Range("f2", "f" & maxRow).Copy Destination:=Sheets("Volume").Cells(1, i + 1) Sheets("Volume").Cells(1, i + 1) = maxTickerWS.Name maxTickerWS.Range("A2", "a" & maxRow).Copy Destination:=Sheets("Adjusted Close").Cells(1, i) maxTickerWS.Range("g2", "g" & maxRow).Copy Destination:=Sheets("Adjusted Close").Cells(1, i + 1) Sheets("Adjusted Close").Cells(1, i + 1) = maxTickerWS.Name i = i + 2 For Each ws In Worksheets If ws.Name <> "Parameters" And ws.Name <> "About" And ws.Name <> maxTickerWS.Name And ws.Name <> "Open" And ws.Name <> "High" And ws.Name <> "Low" And ws.Name <> "Close" And ws.Name <> "Volume" And ws.Name <> "Adjusted Close" Then Sheets("Open").Cells(1, i) = ws.Name Sheets("Open").Range(Sheets("Open").Cells(2, i), Sheets("Open").Cells(maxRow - 1, i)).Formula = _ "=vlookup(A2," & ws.Name & "!A$2:G$" & maxRow & ",2,0)" Sheets("High").Cells(1, i) = ws.Name Sheets("High").Range(Sheets("High").Cells(2, i), Sheets("High").Cells(maxRow - 1, i)).Formula = _ "=vlookup(A2," & ws.Name & "!A$2:G$" & maxRow & ",3,0)" Sheets("Low").Cells(1, i) = ws.Name Sheets("Low").Range(Sheets("Low").Cells(2, i), Sheets("Low").Cells(maxRow - 1, i)).Formula = _ "=vlookup(A2," & ws.Name & "!A$2:G$" & maxRow & ",4,0)" Sheets("Close").Cells(1, i) = ws.Name Sheets("Close").Range(Sheets("Close").Cells(2, i), Sheets("Close").Cells(maxRow - 1, i)).Formula = _ "=vlookup(A2," & ws.Name & "!A$2:G$" & maxRow & ",5,0)" Sheets("Volume").Cells(1, i) = ws.Name Sheets("Volume").Range(Sheets("Volume").Cells(2, i), Sheets("Volume").Cells(maxRow - 1, i)).Formula = _ "=vlookup(A2," & ws.Name & "!A$2:G$" & maxRow & ",6,0)" Sheets("Adjusted Close").Cells(1, i) = ws.Name Sheets("Adjusted Close").Range(Sheets("Adjusted Close").Cells(2, i), Sheets("Adjusted Close").Cells(maxRow - 1, i)).Formula = _ "=vlookup(A2," & ws.Name & "!A$2:G$" & maxRow & ",7,0)" i = i + 1 End If Next On Error Resume Next Sheets("Open").UsedRange.SpecialCells(xlFormulas, xlErrors).Clear Sheets("Close").UsedRange.SpecialCells(xlFormulas, xlErrors).Clear Sheets("High").UsedRange.SpecialCells(xlFormulas, xlErrors).Clear Sheets("Low").UsedRange.SpecialCells(xlFormulas, xlErrors).Clear Sheets("Volume").UsedRange.SpecialCells(xlFormulas, xlErrors).Clear Sheets("Adjusted Close").UsedRange.SpecialCells(xlFormulas, xlErrors).Clear On Error GoTo 0 Sheets("Open").Columns("A:A").EntireColumn.AutoFit Sheets("High").Columns("A:A").EntireColumn.AutoFit Sheets("Low").Columns("A:A").EntireColumn.AutoFit Sheets("Close").Columns("A:A").EntireColumn.AutoFit Sheets("Volume").Columns("A:A").EntireColumn.AutoFit Sheets("Adjusted Close").Columns("A:A").EntireColumn.AutoFit End Sub Sub SuccessList(ByVal stockTicker As String, ByVal numStockSuccess As Integer) Sheets("Parameters").Range("L" & 10 + numStockSuccess) = stockTicker Sheets("Parameters").Range("L10:L" & 10 + numStockSuccess).Borders(xlDiagonalDown).LineStyle = xlNone Sheets("Parameters").Range("L10:L" & 10 + numStockSuccess).Borders(xlDiagonalUp).LineStyle = xlNone Sheets("Parameters").Range("L10:L" & 10 + numStockSuccess).Borders(xlEdgeLeft).LineStyle = xlNone Sheets("Parameters").Range("L10:L" & 10 + numStockSuccess).Borders(xlEdgeTop).LineStyle = xlNone Sheets("Parameters").Range("L10:L" & 10 + numStockSuccess).Borders(xlEdgeBottom).LineStyle = xlNone Sheets("Parameters").Range("L10:L" & 10 + numStockSuccess).Borders(xlEdgeRight).LineStyle = xlNone Sheets("Parameters").Range("L10:L" & 10 + numStockSuccess).Borders(xlInsideVertical).LineStyle = xlNone Sheets("Parameters").Range("L10:L" & 10 + numStockSuccess).Borders(xlInsideHorizontal).LineStyle = xlNone Sheets("Parameters").Range("L10:L" & 10 + numStockSuccess).Borders(xlDiagonalDown).LineStyle = xlNone Sheets("Parameters").Range("L10:L" & 10 + numStockSuccess).Borders(xlDiagonalUp).LineStyle = xlNone With Sheets("Parameters").Range("L10:L" & 10 + numStockSuccess).Borders(xlEdgeLeft) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With With Sheets("Parameters").Range("L10:L" & 10 + numStockSuccess).Borders(xlEdgeTop) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With With Sheets("Parameters").Range("L10:L" & 10 + numStockSuccess).Borders(xlEdgeBottom) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With With Sheets("Parameters").Range("L10:L" & 10 + numStockSuccess).Borders(xlEdgeRight) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With Sheets("Parameters").Range("L10:L" & 10 + numStockSuccess).Borders(xlInsideVertical).LineStyle = xlNone Sheets("Parameters").Range("L10:L" & 10 + numStockSuccess).Borders(xlInsideHorizontal).LineStyle = xlNone With Sheets("Parameters").Range("L10:L" & 10 + numStockSuccess).Interior .PatternColorIndex = xlAutomatic .ThemeColor = xlThemeColorAccent2 .TintAndShade = 0.799981688894314 .PatternTintAndShade = 0 End With End Sub Sub ErrorList(ByVal stockTicker As String, ByVal numStockErrors As Integer) Sheets("Parameters").Range("J" & 10 + numStockErrors) = stockTicker Sheets("Parameters").Range("J10:J" & 10 + numStockErrors).Borders(xlDiagonalDown).LineStyle = xlNone Sheets("Parameters").Range("J10:J" & 10 + numStockErrors).Borders(xlDiagonalUp).LineStyle = xlNone Sheets("Parameters").Range("J10:J" & 10 + numStockErrors).Borders(xlEdgeLeft).LineStyle = xlNone Sheets("Parameters").Range("J10:J" & 10 + numStockErrors).Borders(xlEdgeTop).LineStyle = xlNone Sheets("Parameters").Range("J10:J" & 10 + numStockErrors).Borders(xlEdgeBottom).LineStyle = xlNone Sheets("Parameters").Range("J10:J" & 10 + numStockErrors).Borders(xlEdgeRight).LineStyle = xlNone Sheets("Parameters").Range("J10:J" & 10 + numStockErrors).Borders(xlInsideVertical).LineStyle = xlNone Sheets("Parameters").Range("J10:J" & 10 + numStockErrors).Borders(xlInsideHorizontal).LineStyle = xlNone Sheets("Parameters").Range("J10:J" & 10 + numStockErrors).Borders(xlDiagonalDown).LineStyle = xlNone Sheets("Parameters").Range("J10:J" & 10 + numStockErrors).Borders(xlDiagonalUp).LineStyle = xlNone With Sheets("Parameters").Range("J10:J" & 10 + numStockErrors).Borders(xlEdgeLeft) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With With Sheets("Parameters").Range("J10:J" & 10 + numStockErrors).Borders(xlEdgeTop) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With With Sheets("Parameters").Range("J10:J" & 10 + numStockErrors).Borders(xlEdgeBottom) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With With Sheets("Parameters").Range("J10:J" & 10 + numStockErrors).Borders(xlEdgeRight) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With Sheets("Parameters").Range("J10:J" & 10 + numStockErrors).Borders(xlInsideVertical).LineStyle = xlNone Sheets("Parameters").Range("J10:J" & 10 + numStockErrors).Borders(xlInsideHorizontal).LineStyle = xlNone With Sheets("Parameters").Range("J10:J" & 10 + numStockErrors).Interior .PatternColorIndex = xlAutomatic .ThemeColor = xlThemeColorAccent2 .TintAndShade = 0.799981688894314 .PatternTintAndShade = 0 End With End Sub Sub ClearErrorList(ByVal lastErrorRow As Integer) If lastErrorRow > 10 Then Worksheets("Parameters").Range("J11:J" & lastErrorRow).Clear With Sheets("Parameters").Range("J10").Borders(xlEdgeLeft) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With With Sheets("Parameters").Range("J10").Borders(xlEdgeTop) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With With Sheets("Parameters").Range("J10").Borders(xlEdgeBottom) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With With Sheets("Parameters").Range("J10").Borders(xlEdgeRight) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With End If End Sub Sub ClearSuccessList(ByVal lastSuccessRow As Integer) If lastSuccessRow > 10 Then Worksheets("Parameters").Range("L11:L" & lastSuccessRow).Clear With Sheets("Parameters").Range("L10").Borders(xlEdgeLeft) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With With Sheets("Parameters").Range("L10").Borders(xlEdgeTop) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With With Sheets("Parameters").Range("L10").Borders(xlEdgeBottom) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With With Sheets("Parameters").Range("L10").Borders(xlEdgeRight) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With End If End Sub Sub CopyToCSV() Dim MyPath As String Dim MyFileName As String dateFrom = Worksheets("Parameters").Range("$b$5") dateTo = Worksheets("Parameters").Range("$b$6") frequency = Worksheets("Parameters").Range("$b$7") MyPath = Worksheets("Parameters").Range("$b$8") For Each ws In Worksheets If ws.Name <> "Parameters" And ws.Name <> "About" Then ticker = ws.Name MyFileName = ticker & " " & Format(dateFrom, "dd-mm-yyyy") & " - " & Format(dateTo, "dd-mm-yyyy") & " " & frequency If Not Right(MyPath, 1) = "\" Then MyPath = MyPath & "\" If Not Right(MyFileName, 4) = ".csv" Then MyFileName = MyFileName & ".csv" Sheets(ticker).Copy With ActiveWorkbook .SaveAs Filename:= _ MyPath & MyFileName, _ FileFormat:=xlCSV, _ CreateBackup:=False .Close False End With End If Next End Sub