質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

3053閲覧

Excel VBA(マクロ)ネット上のリンクをクリックしてから生成されるCSVファイルを取得するには?

kawase2

総合スコア28

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2019/04/23 12:22

Excel VBA(マクロ)ネット上のリンクをクリックしてから生成されるCSVファイルを取得するには?

下記のページから1年分のNYダウのデータを取得し、エクセルのシートに貼り付けたいと思っています。
https://stooq.com/q/d/?s=^dji

ブラウザから手動でアクセスした場合、

フォームの「Start date:」と「End date:」を1年分の日付を入力し、「Show」ボタンを押す。その後、
ページの下の方にある「Download data in csv file...」をクリックすると、CSVファイルが生成されてダウンロードできるのですが、
この作業をExcelマクロで行いたいと思っています。

発生している問題

CSVファイルのアドレスがわかっていれば取り込むことはできるのですが、
フォーム送信のあと、生成されるCSVファイルの取り込み方法がわかりません。

試したこと

ちなみに「Show」ボタンを押した後「Download data in csv file...」に生成されるリンクアドレスは、2019年4月23日から1年間のデータが欲しい場合、
https://stooq.com/q/d/l/?s=^dji&d1=20180423&d2=20190423&i=d
と、なります。

ならば、マクロの記録をしながら、webクエリで取り込めばいいのでは?と思い実行すると、ファイルのダウンロードのウィンドウが出て、ファイルを保存することはできるのですが、開くを選択すると「選択したコマンドは、このショートカット メニューからは実行できません。」となり、直接取り込むことはできませんでした。

現状…

いったんローカル、ダウンロードフォルダなどに保存し、読み込むしかないのでしょうか?できれば一度でシートに展開できればありがたいのですが。。。
皆さまのお知恵をおかしください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

直接シートに取り込めるようになるまで、
一旦ダウンロードしてCSVファイルで保存。
それから取り込む仕様にしたいと思います。

WorkBooks.openのファイル名にはURLが直接指定できます。
つまり

Call Workbooks.Open("https://stooq.com/q/d/l/?s=^dji&d1=20180423&d2=20190423&i=d", 0, True)

などとすれば、workのbookに直接CSVを読み込むことができます。

投稿2019/04/26 06:43

h.horikoshi

総合スコア505

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kawase2

2019/04/26 12:51 編集

お答え、ありがとうございます。 >workのbookに直接CSVを読み込むことができます。 直接読み込むというよりは、新しいブックが作成されて、そこに読み込まれるのですね! このお答えを参考に下記のコードを書いてみましたら、 NYダウのデータから欲しい部分(直近○○日分とか)をピックアップできて、やりたいことができました。 参考までに、私の書いたコードを載せておきます。 (幼稚なコードですみません(*゚∀゚*) ) Sub Test01() 'NYダウの最新データ取得 Dim wb1 As Workbook Dim d1, d2, d3 '最新の日付を取得 d1 = (Year(Date) - 1) d2 = Year(Date) d3 = Format(Date, "mm") & Format(Date, "dd") 'URLを設定して新しいブックに開く Call Workbooks.Open("https://stooq.com/q/d/l/?s=^dji&d1=" & d1 & d3 & "&d2=" & d2 & d3 & "&i=d", 0, True) Set wb1 = ActiveWorkbook '直近200日分の日付と終値のデータをコピー With wb1.Worksheets(1) a = .Cells(Rows.Count, 1).End(xlUp).Row 'ラストの行数を調べる .Range(Cells(a - 199, 1), Cells(a, 1)).Copy ThisWorkbook.Sheets(1).Range("A1") .Range(Cells(a - 199, 5), Cells(a, 5)).Copy ThisWorkbook.Sheets(1).Range("B1") End With 'ブックを閉じる Application.DisplayAlerts = False wb1.Close Application.DisplayAlerts = True End Sub
guest

0

Windows API関数を用いてファイルをダウンロードしてみました。
ご参考まで。

VBA

1#If Mac Then 2 'Running on MacIntosh. Do nothing. 3#ElseIf VBA7 Then 4 'Excel 2010 or later: 5 #If Win64 Then 6 '64-bit Excel, 2010 or later: 7 'Use PtrSafe, LongPtr, and LongLong: 8 Private Declare PtrSafe Function URLDownloadToFile Lib "urlmon" _ 9 Alias "URLDownloadToFileA" _ 10 (ByVal pCaller As LongPtr, _ 11 ByVal szURL As String, _ 12 ByVal szFileName As String, _ 13 ByVal dwReserved As LongLong, _ 14 ByVal lpfnCB As LongPtr) As LongLong 15 #Else 16 '32-bit Excel 2010 or later: 17 'Use PtrSafe and LongPtr, but NOT LongLong: 18 Private Declare PtrSafe Function URLDownloadToFile Lib "urlmon" _ 19 Alias "URLDownloadToFileA" _ 20 (ByVal pCaller As LongPtr, _ 21 ByVal szURL As String, _ 22 ByVal szFileName As String, _ 23 ByVal dwReserved As Long, _ 24 ByVal lpfnCB As LongPtr) As Long 25 #End If 26#Else 27 'Excel 2007 or earlier: 28 Private Declare Function URLDownloadToFile Lib "urlmon" Alias _ 29 "URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, ByVal _ 30 szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long 31#End If 32 33Sub Get_CSV() 34 35 Const strURL = "https://stooq.com/q/d/l/?s=^dji&d1=20180423&d2=20190423&i=d" 36 Dim strFNAME As String 'ダウンロード先(パス+ファイル名) 37 Dim ReturnValue As Variant 38 39 'ファイル名をブックのパス+test.csvとする 40 strFNAME = ThisWorkbook.Path & "\test.csv" 41 42 'URLDownloadToFile API をコールする 43 ReturnValue = URLDownloadToFile(0, strURL, strFNAME, 0, 0) 44 45 If ReturnValue = 0 Then 'ダウンロードに成功すると「ReturnValue =0」となる。 46 Debug.Print "ダウンロード成功" 47 Else 48 Debug.Print "ダウンロード失敗" 49 End If 50 51 '結果の表示 52 MsgBox strFNAME & "を保存しました。" 53 54End Sub

投稿2019/04/23 12:51

TanakaHiroaki

総合スコア1063

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kawase2

2019/04/25 10:33

ご回答ありがとうございます。 直接シートに取り込めるようになるまで、 一旦ダウンロードしてCSVファイルで保存。 それから取り込む仕様にしたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問