Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

【VBA】httpリクエストを用いて取得したCSVデータをExcelシートに形式を変えて記入する方法

解決したいこと

VBAでWeb上のCSVデータをExcelのシートにEXcelの形式で貼付を行いたいです。
httpリクエストを利用して、Web上のCSVデータを取得しようと考えています。
しかし、httpリクエストでCSVデータを取得した後、Excelのシートにrange("A1")で
貼付を行うと、1つのセルの中にCSVデータが入力されてしまいます。
そこで、VBAでメモ帳を開いて、そこに一度CSVデータを貼付し、その後、Split関数を
用いてExcelに再度コピペをしようと考えました。
手順としましては、「CSVのテキストファイルを新たにC:のフォルダに作成する」→「作成したファイルを開く」→「開いたファイルにhttpリクエストで取得したCSVテキストデータを張り付ける」→「再度張り付けたCSVテキストデータを配列にいれて、Excelのシートに書き出す」を考えています。

現状、2点に関して教えて頂きたいです。
①エラーは表示されないが、CSVファイルが新たに作成されない。
②そもそもhttpリクエストで取得したCSVデータはどのようにして扱うのか?どこかのフォルダにも保存されていないようですし、あらたに作成したCSVファイルに貼り付けをしようとしても、ファイルの場所が不明なのでCSVの文字列をコピーもできない。

宜しくお願い致します。

発生している問題・エラー

ファイルがみつかりません。

例)


または、問題・エラーが起きている画像をここにドラッグアンドドロップ

VBA

ソースコードを入力

例)

Sub test2()

Dim httpReq As XMLHTTP60
Dim i As Long, j As Long
Dim strLine As String
Dim arrLine As Variant
Dim ws As Worksheet
Dim t As String
Dim fso As Object
Dim tso As Object
Dim strPath As String
Dim tFile As FileSystemObject

Call test3

Set httpReq = New XMLHTTP60
httpReq.Open "GET", "https://○○○reportFormat=CSV&○○○&maxIntradayDays=1&spanType=Intraday&startDateIntraday=2021%2F5%2F8&startHourIntraday=11&startMinuteIntraday=0&endDateIntraday=2021%2F5%2F8&endHourIntraday=12&endMinuteIntraday=0"
httpReq.send

Do While httpReq.readyState < 4
    DoEvents
Loop

t = httpReq.responseText


Set fso = CreateObject("Scripting.FileSystemObject")

With fso.GetFile("C:\Users\memo.txt").OpenAsTextStream(8).WriteLine("t")

                                             .Close

End With

Set fso = Nothing

Open ("C:\Users\memo.txt") For Input As #1


i = 1
Do Until EOF(1)

Line Input #1, strLine
arrLine = Split(strLine, ",")

For j = 0 To UBound(arrLine)
Worksheets("Paste01").Cells(i, j + 1).Value = arrLine(j)

Next j
i = i + 1
Loop
Close #1

Set tFso = Nothing
Set tFile = Nothing
Set httpReq = Nothing
End Sub

Sub test3()
On Error Resume Next

Dim fso             As New FileSystemObject     '// FileSystemObjectクラス
Dim ts              As TextStream               '// TextStreamクラス
Dim sFilePath                                   '// ファイルパス

'// ファイルパスを指定
sFilePath = "C:\Users\memo.txt"

'// ファイルを作成
Set ts = fso.CreateTextFile(Filename:=sFilePath, Overwrite:=True, Unicode:=False)

'// ファイルを閉じる
ts.Close

'// エラー発生時
If Err.Number <> 0 Then
    '// エラー内容を出力
    Debug.Print Err.Number & " " & Err.Description
End If

End Sub

自分で試したこと

上記の方法とは別で、ハイパーリンクでCSVが入ったWebのURLを開き、開いた段階でC:のユーザーのフォルダ内に
CSVファイルがExcelの形式で保存されます。なのでURLを開く前にC:内のCSVのデータを全て消去して、URLをひらき、自動で
ファイルに保存されたCSVデータをひらくという流れのVBAを作成しました。
しかし、フォルダパスを指定して開く際にユーザーに保存される為、ユーザー名をワイルドカードで作成しましたが参照のファイルが見つからないというエラーで保存先のCSVファイルを開くことが出来ず、断念しました。

0 likes

VBAでWeb上のCSVデータ(Shift-JIS、CRLF改行)をExcelのシート("Paste01")に張り付けるサンプルです。
Web上のCSVデータは、エンコードしてSplit関数で分解して各セルにセットしています。

Sub test3()
    Dim httpReq  As XMLHTTP60
    Dim stream As Object
    Dim x() As String
    Dim y() As String
    Dim i, l As Long
    Dim rowIndex, colIndex As Long
    
    Set httpReq = New XMLHTTP60
    Set stream = CreateObject("ADODB.Stream")
    
    httpReq.Open "GET", "https://..."
    httpReq.send
    
    Do While httpReq.readyState < 4
        DoEvents
    Loop

    ' エンコード
    stream.Open
    stream.Position = 0
    stream.Type = 1
    stream.Write httpReq.responseBody
    stream.Position = 0
    stream.Type = 2
    stream.Charset = "_autodetect"
    
    x = Split(stream.ReadText, vbCrLf)
    rowIndex = 1
    For i = 0 To UBound(x)
        y = Split(x(i), ",")
        colIndex = 1
        For l = 0 To UBound(y)
            Worksheets("Paste01").Cells(rowIndex, colIndex).Value = y(l)
            colIndex = colIndex + 1
        Next
        rowIndex = rowIndex + 1
    Next
    
    Set httpReq = Nothing
    Set stream = Nothing
End Sub
0Like

早速のご対応ありがとうございます!!!
試しましたが、Paste01にCSVデータがセルごとに分かれて貼りけられていました!

あとは自分で条件分岐を行って適切にCSVデータを行と列に分けて出力できそうです!
ありがとうございます!

ちなみにもう一点質問なのですが、httpreq.openメソッドで、URLはRange("任意のセル”)にいれたURLを参照しても反応出来ないのですが、URLの数字が変化する場合でもこのhttpreq.openメソッドは有効でしょうか?

0Like

ちなみにもう一点質問なのですが、httpreq.openメソッドで、URLはRange("任意のセル”)にいれたURLを参照しても反応出来ないのですが、URLの数字が変化する場合でもこのhttpreq.openメソッドは有効でしょうか?

セル(A1)にURLを設定し、そのURLでhttpReq.Openする場合のサンプルです。

httpReq.Open "GET", Worksheets("Paste01").Range("A1").Value

URLの数字が変化する場合でもこのhttpreq.openメソッドは有効でしょうか?

URLの数字が変化する場合というのが良くわかりませんが、
URLとして正しければOpenメソッドは使用できます。

0Like

@Yamazinさん
.Valueが抜けておりました!

追加すると上手く開くことが出来ました。ありがとうございます!

すみません、後頂いたコードを試してみたのですが、

For l = 0 To UBound(y)
Worksheets("Paste01").Cells(rowIndex, colIndex).Value = y(l)
colIndex = colIndex + 1
Next

の部分でループから抜け出す事が出来ませんでした。
その為、A1から行は変わらず、列のみが変化するという挙動になりました。

自分の行いたい挙動としましては、CSVデータの行毎に、Excelでも行を改行させて入力する
というものです。
頂いたコードを見る限りでは、@Yamazinさんも同様の挙動を想定したものなのかなと思いました。(間違っていたらすみません)
CSVのテキストデータを1行ずつ読み取れていない事が原因かと思い、Line input を使って1行ずつ読み込もうとしましたがそもそもファイル形式ではないので利用できずでした。
次元の概念が合っているか不安ですが、 For indexA = 0 To UBound(line,1)で試してみましたが
1行目のみを取得する事もできずでした。

こちら何か策はありますでしょうか?
もしお時間等ございましたらご教示ください。宜しくお願い致します。

0Like
For l = 0 To UBound(y)

この部分ですが、
UBound(y)は配列yの最大値を取得しているので、
無限ループになることはないと思います。
(ループ内でlの値を操作していない限り)

x = Split(stream.ReadText, vbCrLf)

この部分で、CSVデータを改行文字で分割して配列xにセットしているため
xにはCSVデータが行単位で設定されている想定です。
(改行文字がCRLF以外の場合、vbCrLfを適切なものに修正する必要あり)

こちらでは、入力元のCSVの文字コードや改行コードが何かわかりませんので、
実際のコードをに、ブレイクポイントを設定してウォッチで変数の値を確認するなどして
問題箇所を探してみるのが良いと思います。

1Like

ご回答いただきありがとうございます!

やはり他の方法で試してもループになってしまうので、CSVの方に原因がありそうです・・・

ご教示頂いた、文字コード、改行コードについては知識が無かったので調べて見ます!!

ありがとうございます!

0Like

Your answer might help someone💌