2

作为我愉快地解决问题的下一步(不理解为什么 WinHTTP 不验证某些 HTTPS 资源),我需要漂亮地解析获得的 CSV。目前我使用以下解决方案:

If HTTPReq.Status = 200 Then
    If FSO.FileExists(CSV_Path) = True Then FSO.DeleteFile (CSV_Path)
    Set FileStream = CreateObject("ADODB.Stream")
    FileStream.Open
    FileStream.Type = 1
    FileStream.Write HTTPReq.responseBody
    FileStream.SaveToFile (CSV_Path)
    FileStream.Close
    ActiveWorkbook.Connections("Redmine Timelog").Refresh
    ActiveSheet.PivotTables("PivotTable_RM").PivotCache.Refresh
End If

也就是说,我将 CSV 保存到磁盘,然后将其作为数据源链接到 Excel。但是,我想让我的 Excel 书自给自足,无需创建其他文件(出于一些非常明显的原因)。

就我而言,解决方案非常简单:WinHTTP.responseText在单独的 Excel 工作表上逐行存储(而不是当前存储的链接 CSV),然后使用Text to DataExcel 转换。但是,我面临以下直接麻烦:

  1. CSV 是 UTF-8 编码的,而原始 WinHTTP 响应文本似乎不是。有没有办法使用所需的编码来解释它?
  2. 如何将 CSV 拆分为行?使用Split函数还是其他什么?CSV 似乎使用了一些标准的 NewLine 字符,并且 99% 的数据应该没有这些字符。

解决了许多类似的问题,但到目前为止,我发现 VBA 没有任何明确和可接受的问题,因此我们将不胜感激。提前致谢!

4

2 回答 2

3

最后我自己找到了两种解决方案:

  1. 借助 ADODB.Stream 将 CSV 转换为 UTF-8(更多信息请参见:http ://www.motobit.com/tips/detpg_binarytostring/ )
  2. Text to Data使用Excel 例程拆分 CSV 并进一步解析字符串数组

以下是代码的相关部分:

'CSV to UTF-8
Set FileStream = CreateObject("ADODB.Stream")
FileStream.Open
FileStream.Type = 1 'Binary
FileStream.Write HTTPReq.responseBody
FileStream.Position = 0
FileStream.Type = 2 'Text
FileStream.Charset = "UTF-8"
CSV_Text = FileStream.ReadText
FileStream.Close
'CSV Splitting
CSV_Strings = Split(Trim(CSV_Text), vbLf)
ThisWorkbook.Worksheets("RM_Log").Cells.ClearContents
Set OutputRange = ThisWorkbook.Sheets("RM_Log").Range("A1:A" & UBound(CSV_Strings) + 1)
OutputRange = WorksheetFunction.Transpose(CSV_Strings)
OutputRange.TextToColumns Destination:=ThisWorkbook.Sheets("RM_Log").Range("A1"), _
    DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, _
    Tab:=False, Semicolon:=False, Comma:=True, Space:=False, Other:=False, FieldInfo _
    :=Array(Array(1, 3), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), _
    Array(7, 1), Array(8, 1), Array(9, 1)), DecimalSeparator:=".", _
    TrailingMinusNumbers:=True

结果,我的 Excel 文件现在完全可以自给自足了。希望这对其他人也有帮助。非常感谢所有留下评论的人——他们缩小了我的搜索范围。

于 2013-01-11T19:17:50.327 回答
0

这条线

OutputRange = WorksheetFunction.Transpose(CSV_Strings)

应该是这样的

OutputRange.Formula = WorksheetFunction.Transpose(CSV_Strings)
于 2016-06-28T13:42:51.943 回答