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現在保存されているリンクされた CSV ではなく、別の Excel シートに行ごとに保存してから、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 DataCSV を分割し、 Excel ルーチンを使用して文字列配列をさらに解析する

以下は、コードの関連部分です。

'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 に答える