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

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

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

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

Q&A

解決済

3回答

2568閲覧

EXCLE VBAでファイルをダウンロード

occhy

総合スコア15

VBA

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

0グッド

1クリップ

投稿2021/03/20 02:37

編集2021/03/20 11:55

前提・実現したいこと

メールにファイルのダウンロード先アドレスが書いてあり、
それをダブルクリックするとwebブラウザが立ち上がって
ファイル(zioファイル)がダウンロードできるというシステムがあります。

そのアドレスはメールにたくさん書かれていて、
http://www.hogegege.jp/index.php?type=download&no=101
http://www.hogegege.jp/index.php?type=download&no=105
http://www.hogegege.jp/index.php?type=download&no=116
http://www.hogegege.jp/index.php?type=download&no=119
http://www.hogegege.jp/index.php?type=download&no=206
というよう感じで数十個も羅列されています。
一個ずつクリックするのが面倒なので、エクセルのA列にこのアドレスを張り付けて、
あとは自動でダウンロードさせたいです。
そして、成功したらB列に「DL成功」、失敗したら「DL失敗」と記入したいです。

下記のような感じのコードをイメージしていますが、
ダウンロードする関数(s) をどう記述すればよいかアドバイスをお願いします。

EXCEL

1For each s in Ramge("A:A") 2 str= s.value 3 ret=ダウンロードする関数(str) 'ダウンロード実行 4 s.offset(0,1)=ret 'ダウンロード結果をB列に記録 5Next 6

URLDownloadToFileという関数は見つけたのですが、私の場合は
http://www.hogegege.jp/index.php?type=download&no=xx
というphpコードを送信するので、URLDownloadToFileではそもそも送信できないことまでわかっています。コードを書く以前に使えないことが自明なのでコードの書きようがなく、自力で書けたのがFor・・・Nextのところだけでした。
phpコードを送って戻り値も得るという方法は、どうしても見つかりません。
そのようなわけでアドバイスをお願いした次第です。

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

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

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

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

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

occhy

2021/03/20 06:43

できるだけ自分でがんばって考えて、コードまで書いてみました。 丸投げという意図はまったくありません。 丸投げだったら、アドバイスを求めるのでなく、コードを教えてほしいと書いたと思います。 そこのところ誤解があったようで申し訳ありません。
YT0014

2021/03/20 09:06

検索などで、"ダウンロードする関数"の情報を集められたのでしょうか? 質問内容やコードを見る限り、行った形跡が見えませんので、他者からすれば、丸投げに見えます。「できるだけがんばる」に、"できる限りの情報を収集して試してみる"という行為を追加するようにしてください。 ダウンロードする関数 VBA での検索を試み、結果ページを確認した上で、解決できたなら自己解決を、解決できなかったら、問題点を整理し直し、質問文を編集して、修正してください。
occhy

2021/03/20 11:56

そういうことだったのですね。申し訳ありません。 問題点を整理し直し、質問文を編集して、修正しました。
guest

回答3

0

URLDownloadToFileという関数は見つけたのですが、私の場合は

http://www.hogegege.jp/index.php?type=download&no=xx
というphpコードを送信するので、URLDownloadToFileではそもそも送信できないことまでわかっています。

ご提示いただいている対象リンク文字列は、URLであり、phpコードではありません。

当然、URLDownloadToFileにて、ダウンロード可能です。

投稿2021/03/20 12:54

YT0014

総合スコア1708

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

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

occhy

2021/03/20 14:49

思い込みがあったようですみません。 以下のコードでダウンロードまではできました。 Sub test() Dim ret, str For Each s In Sheets(1).Range("A1:A10") str = s.Value ret = URLDownloadToFile(0, str, "aaa.zip", 0, 0) 'ダウンロード実行 s.Offset(0, 1) = ret 'ダウンロード結果をB列に記録 Next あと残課題は、保存するファイル名の引数の"aaa.zip"のところを、サーバ側のファイル名にするというところですが、ファイル名はダウンロードしないとわからないので、指定できないのですが、これがまだ解決していません。 引数をnullにしたらエラーになったので、どうしたものかという状態です。
guest

0

手軽にやるなら、こんな感じでやればダウンロードはできそう。
成否の判断までやろうとするともう少しちゃんと考えないと。

VBA

1For each s in Ramge("A:A") 2 s.Hyperlinks(1).Follow 'ダウンロード実行 3Next

投稿2021/03/20 03:45

jinoji

総合スコア4585

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

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

occhy

2021/03/20 06:51

この方法でダウンロードはできました。 これだけでもすごく助かりますが、なかにはリンク先が存在しない場合があり、そこはエラーにしたいです。 リンク先が存在しないのが問題だと思うのですが、ちょっと別問題なので、成否判断で決着をつけたいです。
guest

0

ベストアンサー

phpのリンクから実際のダウンロード先を取得し、ファイル名を抽出して保存します。

VBA

1Private Declare PtrSafe Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" _ 2 (ByVal pCaller As Long, ByVal szURL As String, ByVal szFileName As String, _ 3 ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long 4 5'---------------------------------- 6'リンクから本当のダウンロード先を得る関数。 7'たとえば 8'GetLocation("http://www.hogegege.jp/index.php?type=download&no=101") 9'とすればrealUrlに本当のダウンロード先(ファイル名含む)が入る 10Function GetLocation(url As String) As String 11 Dim httpObj As Object 12 13 Set httpObj = CreateObject("MSXML2.ServerXMLHTTP") 14 httpObj.Open "HEAD", url, False 15 httpObj.send 16 GetLocation = httpObj.getOption(-1) 'SXH_OPTION_URL 17End Function 18 19'---------------------------------- 20' ダウンロード 21' url ダウンロード先リンク(phpのリンクでも可) 22' savedir ファイルの保存先フォルダ 23Sub DownloadFile(url As String, savedir As String) 24 Dim res, idx As Long 25 Dim realUrl, fname As String 26 Dim strPath As String 27 28 '指定した保存先ディレクトリの末尾にパス区切りが付いているかチェック 29 If Right(savedir, 1) <> "\" Then 30 savedir = savedir & "\" 31 End If 32 33 'urlからファイル名を抜き出す 34 realUrl = GetLocation(url) 35 idx = InStrRev(realUrl, "/") 36 fname = Mid(realUrl, idx + 1) 37 38 '保存するファイルパス・ファイル名を作成 39 strPath = savedir & fname 40 41 res = URLDownloadToFile(0, url, strPath, 0, 0) 42 If res = 0 Then 43 Debug.Print "ダウンロード完了: " & url 44 Else 45 Debug.Print "エラー: " & url 46 End If 47End Sub 48 49'---------------------------------- 50' テスト 51Sub Test() 52 Dim ret, str, savedir 53 savedir = "C:\TEST\" '保存フォルダ 54 55 For Each s In Sheets(1).Range("A1:A10") 56 url = s.Value 57 ret = DownloadFile(url, savedir) 'ダウンロード実行 58 s.Offset(0, 1) = ret 'ダウンロード結果をB列に記録 59 Next 60End Sub

検証環境:
Windows 10 Pro 20H2
Excel 2019

投稿2021/03/20 15:57

編集2021/03/20 17:43
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

occhy

2021/03/21 02:59

MSXML2.ServerXMLHTTPにはまったくたどり着けていませんでした。 こういう手段があるのですね。 早速試してみたのですが、 DownloadFile(url , savedir)を実行したら、戻り値が引数のurlと同じになってしまいました。 どうやらサーバのほうではリアルなファイルアドレスはないみたいで、phpでなにか処理して動的にファイルを生成してからダウンロードに供しているようです。 IEを利用する方法しかなさそうな気がしてきましたが、VBAだけでなんとかなりそうなものでしょうか。
退会済みユーザー

退会済みユーザー

2021/03/21 03:08 編集

Debug.print GetLocation(ダウンロード先url) を実行した場合でも、実際のファイルのアドレスは表示されないでしょうか? また、そのダウンロード先urlは実際にファイルがダウンロードできる(ファイルが存在する)urlでしょうか? (ファイルが存在しないurlをGetLocation関数に引数に指定すると、その戻り値は、引数に指定したurlと同じになるので)
occhy

2021/03/21 07:01

Debug.print GetLocation(ダウンロード先url) を実行したところ、ダウンロード先urlが戻り値として帰ってきました。 ダウンロード先にファイルがあるかどうかはよくわかりません。外からはサーバの中身がどうなっているかわからないようになっています。たぶんリクエストを受けたときに何か処理して(動的ななにかをしている)ファイルを送信しているのだと推測しています。そういうことでは、ただ単純にダウンロードできるファイルが存在するというわけではないみたいです。 DownloadFileが保存先引数がNULLの場合はサーバ側のファイル名で保存、という仕様の関数だったら話は簡単だったのですが、どうもそう簡単な話ではないようでして。 もうVBAでやるのはあきらめようかな、と思い始めてきました。
退会済みユーザー

退会済みユーザー

2021/03/21 07:14

「ダウンロード先にファイルがあるかどうかはよくわかりません。」とのことですが、そのリンク(例:http://www.hogegege.jp/index.php?type=download&no=101)を、ChromeやInternet Explorer等のブラウザ欄に貼り付けてエンターキーを押したら、何らかのファイルをダウンロードすること自体はできる、ということでしょうか。 (もし。この方法でダウンロードできるにもかかわらず、同じURLに関して上記VBAコードでDLできないなら、VBAでは無理そうですね)
occhy

2021/03/21 07:26

はい、そのとおりです。 あきらめることにします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問