ここから本文です

ExcelからVBAにてIE9を操作して csvファイルをダウンロードしたく考えています

jc1********さん

2013/7/216:38:45

ExcelからVBAにてIE9を操作して
csvファイルをダウンロードしたく考えています

業務システムにより生成したファイルを自動で指定のフォルダに
ダウンロードしたく試行錯誤していますが、初心者につきIE9の
通知領域に表示された「保存」(取り急ぎ「ファイルを開く」でも結構
です)を操作できず、行き詰っております。

試した方法は①Sendkeys ②URLDownloadToFileの2つです。

①ではSendkeys "%S", Trueを追記しましたが反応がなく、
他サイトを参照した限りでは(理解不足ですが)、当該領域を
指定する必要があるようですが、難解でいったん断念しました。

②ではファイルをダウンロードすることはできたものの
HTMLソースが取り込まれていて、肝心のデータでは
ないようです。

具体例を税関のサイトでいうと
・通知領域:www.e-statからik-100h2013e001.csvを開くか、または保存しますか?
・ページURL:http://www.e-stat.go.jp/SG1/estat/List.do?lid=000001111452
・HTMLソース:href="./Csvdl.do?sinfid=000021387805" ※
※実際使用するシステムではonclick="doSubmitFile( document.form, 'XXXX' )"と
JavaScriptで独自に定義したFunctionを処理しているようです。

上記のようになりますが、下記サンプルコードのcsvUrlに
記述するURLとしては、どのようになるのか質問いたしたく
ご教示ください。(JavaScriptの場合に関してもお願いします)

▼サンプルコード(抜粋引用)
csvUrl = "http://WWW.***.com/***/sample.csv" 'csvファイルのある場所
myFile = "D:\sample\sample.csv" 'csvファイルの保存先とファイル名
retVal = URLDownloadToFile(0, csvUrl, myFile, 0, 0)

その他、①の方法に因る場合でも結構ですので、
初心者にも理解できるように解説いただければ幸甚です。

以上、宜しくお願いいたします。

補足blue_arlequinさん

早速のご回答有難うございます。
なるほど、CGIが返したソースを取り込んでいたのですね。
ご提示いただいたコードを基に他サイトでも動作確認が取れました。
続いて実際に使用する業務システムに置き換えて処理してみました。

以下がファイル出力ボタンのソースとなります。
<button type="button" onclick="doSubmitFile( document.form, xxxx(function番号と思しき数値4桁) )">ファイル出力</button>

For Each elm In ie.Document.getElementsByTagName("button")
If elm.GetAttribute("onclick") Like "doSubmitFile( document.form, xxxx )" Then
URLDownloadToFile 0, elm.onclick, "C:\sample\" & Format(Now(),"yymmddhhmmss") & "出力データ.csv", 0, 0
End If
Next

当然かもしれませんがhrefと異なり、elm.onclickでは
独自に定義されたFunctionをそのまま入れている
ようで、反応がございません。

この場合の処理はやはり難しいのでしょうか。
お手数をお掛けしますが、再度ご教示いただきたく
宜しくお願い申し上げます。

閲覧数:
4,327
回答数:
1
お礼:
50枚

違反報告

ベストアンサーに選ばれた回答

blu********さん

編集あり2013/7/310:55:11

URLDownloadToFileで保存する場合、

>②ではファイルをダウンロードすることはできたものの
>HTMLソースが取り込まれていて、肝心のデータでは
>ないようです。

とありますが、何か違うURLを保存しようとしたのではありませんか。
例えばこんなのでどうでしょうか。
まず対象のURLでCSVファイルは

<a href="./Csvdl.do?sinfid=000021387805" tabindex="102"><img src="images/csv.gif" border="0" alt="CSVファイル"></a>

のようなhtmlで、クリックすると"ik-100h2013e001.csv"みたいなファイル名で保存しようとします。
これは普通のhtmlでなくCGIが返すのだと思います。
URLDownloadToFileでは、実際に飛び先のURLで作成されるファイル名は不明なので、

href="./Csvdl.do?sinfid=000021387805"

の"="以後の"000021387805"をファイル名として保存します。
保存先が"C:\sample"フォルダに保存する場合です。




Private Declare Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, ByVal szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long 'API宣言
Sub sample()
Dim ie As Object
Dim elm As Object
Set ie = CreateObject("InternetExplorer.Application")
ie.Visible = True
ie.navigate "http://www.e-stat.go.jp/SG1/estat/List.do?lid=000001111452"
Do While ie.Busy Or (ie.ReadyState <> 4): DoEvents: Loop '表示待ち
For Each elm In ie.Document.getElementsByTagName("A") 'Aタグを探す
If elm.GetAttribute("href") Like "*/Csvdl.do?*" Then 'href属性で"/Csvdl.do?"を含む場合
URLDownloadToFile 0, elm.href, "C:\sample\" & Mid(elm.href, InStrRev(elm.href, "=") + 1) & ".csv", 0, 0 'href先を保存する("Csvdl.do?sinfid=000021387805"の=以後がファイル名)
End If
Next
ie.Quit
End Sub


[ 補足へ ]
普通にその場所をSUBMITしては意味が無いので、doSubmitFileの中でCSVの格納場所がわかればURLDownloadToFileが使えます。
CSVの格納場所(とファイル名)がわかればURLDownloadToFileを使うのが一番楽だと思います。

htmlのどこかに

function doSubmitFile (){...}

と言うプログラムがあると思いますが、その内容によっては可能(CSVの格納場所がわかる)かもしれませんが、無理かもしれません。

質問した人からのコメント

2013/7/3 13:52:17

降参 blue_arlequinさん
ご指摘の点、理解いたしました。残念ながら当該ページを見ると
ページ内記述ではなく、幾つかのjsファイルで外部参照している
ようでしたので一旦断念して、Sendkeysで格闘してみます。
有難うございました。

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる