【问题标题】:How do I read CRLF delimited lines from MSXML.ResponseText in VBA/Excel如何从 VBA/Excel 中的 MSXML.ResponseText 读取 CRLF 分隔行
【发布时间】:2011-12-06 03:25:21
【问题描述】:

我看到的大多数使用 MSXML 的示例都必须使用 Javascript 或 JQuery,但我正在编写一个两个都不使用的 Excel 2010 宏。

我的目标是下载一个文件(如下所示),并解析一个中等大小(5 到 15MB)的 CSV 文件。我最终想将 CSV 数据保存在隐藏的数据选项卡中。

我在 CSV VBA sample here 上取得了一些进展,但我不知道如何将 MSXML.ResponstText 的输出与该示例粘合。

这是我的 VBA/宏代码

Set objHttp = CreateObject("MSXML2.ServerXMLHTTP")
'objHttp.SetRequestHeader "Content-Type", "text/csv"
'objHttp.SetRequestHeader "charset", "gb2312"
Call objHttp.Open("GET", fileURL, False)
Call objHttp.Send("")
'Call MsgBox(objHttp.ResponseText)

如何让 excel 使用 ResponseText 并且一次只读取一行?

【问题讨论】:

  • 你试过 Split(objHttp.ResponseText, vbCrLf) 吗?
  • ps-您是在下载文件还是在阅读网络响应?
  • @JP 我正在下载一个 CSV 文件 similar to this one - 虽然请原谅不稳定/未对齐的数据
  • 相反,我会使用 URLDownloadToFile API 将文件保存在本地,然后只需使用 Excel 的本机方法打开它(请参阅@Jean-François Corbett 的回答)。

标签: excel vba msxml msxml6


【解决方案1】:

我说,不要混用。首先下载 CSV 文件,然后阅读它。

从您的问题来看,您的目标并不明显。如果要解析文件,则可以使用本机 VBA 语句逐行读取和解析它:

Dim filePath As String
Dim fn As Integer
Dim myLine As String
Dim myParsedLine() As String

filePath = "C:\DatabaseWeeklyStats.csv"

fn = FreeFile()
Open filePath For Input As #fn
Do Until EOF(fn)
    Line Input #fn, myLine
    myParsedLine = Split(myLine, ",")
    ' Line is now parsed. Do stuff.
Loop

如果您只想将整个 CSV 文件粘贴到工作簿的新工作表中,而不必事先“解析”(即解释其内容),那么您可以这样做:

Dim dbSheet As Worksheet
Dim targetSheet As Worksheet

Workbooks.Open Filename:="C:\DatabaseWeeklyStats.csv", _
    Format:=2 ' use comma delimiters
Set dbSheet = ActiveSheet

Set targetSheet = Workbooks("Book1").Sheets(3) ' wherever you want to move it to

dbSheet.Move After:=targetSheet
' dbSheet is now in your workbook.

' Hide it.
Set dbSheet = ActiveSheet
dbSheet.Visible = xlSheetHidden

【讨论】:

  • +1 您还可以包含使用 URLDownloadToFile API 获取 CSV 文件的代码,这将使此答案完整。
【解决方案2】:
Dim opener As New FileSystemObject
Dim fContainer

Set fContainer = opener.OpenTextFile("c:\DatabaseWeeklyStats.csv")

Do Until fContainer.AtEndOfStream
    sText = fContainer.ReadLine
    Debug.Print sText
Loop

' 这需要参考 Microsoft Scripting Runtime

【讨论】:

  • 这有帮助,但它是否可以使用 ServerXMLHTTP.ResponseText 或 URL 作为 OpenTextFile 的参数?我想我明天会试试。
  • opener?! fContainer?!奇怪的变量命名!不过,+1
猜你喜欢
  • 1970-01-01
  • 2021-07-25
  • 1970-01-01
  • 2015-01-11
  • 2018-12-05
  • 2014-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多