CSV文本全部在一行中下载而不是新行

时间:2015-01-11 03:01:20

标签: excel-vba csv stockquotes vba excel

我使用此代码从Yahoo Finance下载特定代码的CSV格式。出于某种原因,CSV文件的下载与应该在股价历史中开始每日新行的行相同。由于这个原因,我无法使用打开的文件作为#handate进行输入。有任何想法吗?如果您有任何帮助或建议,请提前感谢您。

Public Sub DownloadAllHistorical(ticker As Variant, stdate As Date, endate As Date, freq As String, loc As Variant)
Dim a, b, c, d, e, f As String
a = "&a=" & Month(stdate) - 1
b = "&b=" & Day(stdate)
c = "&c=" & Year(stdate)
d = "&d=" & Month(endate) - 1
e = "&e=" & Day(endate)
f = "&f=" & Year(endate)
g = "&g=" & freq

Dim URL As String
URL = "http://ichart.finance.yahoo.com/table.csv?s=" & _
      ticker & _
      a & b & c & _
      d & e & f & _
      g & "&ignore=.csv"

Dim http As MSXML2.XMLHTTP
Set http = New MSXML2.XMLHTTP
http.Open "GET", URL, False
http.send
URL = http.responseBody
If http.Status = 200 Then
    Set ostream = CreateObject("ADODB.Stream")
    ostream.Open
    ostream.Type = 1
    ostream.Write http.responseBody
    ostream.SaveToFile loc & ticker & ".csv", 2 ' 1 = no overwrite, 2 = overwrite
    ostream.Close
End If

Set ostream = Nothing
Set http = Nothing
End Sub

1 个答案:

答案 0 :(得分:2)

这不是一个好问题。一个好问题可能会在几分钟内得到解答。

您可以假设任何访问Stack Overflow的Excel-VBA页面以回答问题的人都熟悉Excel VBA。你不应该假设他们熟悉其他任何东西。您假设潜在的回答者熟悉“ticker”一词,并且知道Yahoo财务下载的参数。

您的标题是“CSV文本全部下载而不是新行”。你说:“出于某种原因,CSV文件的下载与应该在股票价格历史中每天开始新线路相同。”事实上,标题和声明是不真实的。

运行代码并查看保存的文件后,问题很明显。也许如果我考虑过你希望使用Input#语句,我会立即猜到原因。

Windows的某些功能可以追溯到MS-DOS时代。特别是,NotePad和Input#仅适用于MS-DOS样式的文本文件。在那些日子里,输出设备像打字机一样工作:CR意味着返回到当前行的开头而LF意味着前进一行。所有文本文件都使用CRLF(回车后跟换行符)作为行分隔符,因为这意味着它们可以直接输出到打印机,控制台等。

Windows的大多数部分仍然使用CRLF作为默认行分隔符,但是将接受LF,这是其他地方的标准。 NotePad和输入#不会。

如果您使用接受LF作为分隔符的文本编辑器打开下载的文件,您会看到每天的详细信息都在各自的行上。你可能不知道为什么,但你不会问这样一个误导性的问题。

你应该怎么做?

选择1

在您的日常工作中添加以下内容:

Dim InxLine As Long
Dim Line() As String

Line = Split(http.responseText, vbLf)
For InxLine = 0 To UBound(Line)
  Debug.Print Line(InxLine)
Next

此代码只是将每一行输出到立即窗口。您必须使用适当的代码替换Debug.Print Line(InxLine)来处理这些行。

选择2

如果要保存CSV文件,可以保持现有例程不变,并添加如下内容:

Sub TestOpen()

  Dim WbkThis As Workbook

  Set WbkThis = ThisWorkbook

  Workbooks.Open ("C:\Users\Tony\Desktop\goog.csv")

  ' goog.csv is now the active workbook which have a single worksheet named "goog"
  Sheets("goog").Move After:=WbkThis.Sheets(WbkThis.Worksheets.Count)
  ' because the only sheet within workbook goog.csv has been removed, the workbook is
  ' automatically closed.

End Sub

我已将Google的CSV文件下载到我的桌​​面。此宏将CSV文件作为工作簿打开,并将包含数据的工作表移动到包含宏的工作簿。工作表“goog”已准备好按要求处理。

选择3

如果例程创建一个使用CRLF作为行终止符的文件非常重要:

在下载之后和写入光盘之前,将以下内容添加到现有例程中:

Dim FileText As String
FileText = Replace(http.responseText, vbLf, vbCr & vbLf)

替换:

ostream.Type = 1
ostream.Write http.responseBody

由:

ostream.Type = 2
ostream.Writetext FileText

这将给出一个NotePad和其他古老程序可以分成行的文件。