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

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

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

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

Internet Explorer

Internet Explorer(IE;MSIE)はマイクロソフトが開発したウェブブラウザです。Microsoft Windowsに組み込まれています。

Q&A

0回答

446閲覧

VBAでIEのファイルをDLするシステム

FATE-T

総合スコア10

VBA

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

Internet Explorer

Internet Explorer(IE;MSIE)はマイクロソフトが開発したウェブブラウザです。Microsoft Windowsに組み込まれています。

0グッド

0クリップ

投稿2020/01/25 01:45

編集2020/01/27 05:19

前提・実現したいこと

対象サイトのファイルをダウンロードするシステムを作成中です。
下記のとおりファイルが壊れてしまい開けなくなります。
問題点分かる方回答よろしくお願いします。

追記 2020/01/27
下記プログラムだとHTMLファイルが保存されているようです。
URLDownloadToFile はpdfなどのファイルをダウンロードできないのでしょうか?
調べた限りでは可能と思われるのですが。
使っているブラウザは【IE11】です。

発生している問題・エラーメッセージ

ダウンロード後のファイルを開くと、ファイルが壊れていると出ます。

該当のソースコード

vba

1Private Declare PtrSafe Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" _ 2(ByVal pCaller As Long, _ 3ByVal szURL As String, _ 4ByVal szFileName As String, _ 5ByVal dwReserved As Long, _ 6ByVal lpfnCB As Long) As Long 7 8 9Sub ieopen() 10 11 Dim ie As InternetExplorer 12 13 Dim doc As Variant 14 15 basedir = "**********" '登録フォルダ入力 16 17 Set ie = New InternetExplorer 18 19 ie.Visible = True 20 21 For i = 1 To 39 Step 1 22 23 url = "*********" 'URL入力 24 25 ie.navigate url 26 27 Application.Wait Now() + TimeValue("00:00:03") 28 29 For j = 0 To 9 Step 1 30 31 FoldeName = doc.getElementsByTagName("h3")(j).innerHTML 32 33 FoldeName1 = Left(FoldeName, InStr(FoldeName, ":") - 1) 34 FoldeName2 = Mid(FoldeName, InStr(FoldeName, ":") + 1) 35 36 FoldeName1 = Mid(FoldeName1, InStr(FoldeName, ">") + 1) 37 FoldeName2 = Mid(FoldeName2, InStr(FoldeName, ">") + 1) 38 39 FoldeName = FoldeName1 + FoldeName2 40 41 FoldeName = Replace(FoldeName, "</a>", "") 42 FoldeName = Replace(FoldeName, "\", "") 43 FoldeName = Replace(FoldeName, "/", "") 44 FoldeName = Replace(FoldeName, ":", "") 45 FoldeName = Replace(FoldeName, ",", "") 46 FoldeName = Replace(FoldeName, ";", "") 47 FoldeName = Replace(FoldeName, "*", "") 48 FoldeName = Replace(FoldeName, "?", "") 49 FoldeName = Replace(FoldeName, """", "") 50 FoldeName = Replace(FoldeName, "<", "") 51 FoldeName = Replace(FoldeName, ">", "") 52 FoldeName = Replace(FoldeName, "|", "") 53 FoldeName = Replace(FoldeName, " ", "") 54 FoldeName = Replace(FoldeName, vbLf, "") 55 56 h = h + 1 57 SaveDir = basedir + CStr(h) + FoldeName 58 59 If Dir(SaveDir, vbDirectory) = "" Then 60 61 MkDir SaveDir 62 63 End If 64 65 On Error Resume Next 66 67 For k = 0 To 10 Step 1 68 69 70 71 DLurl = doc.getElementsByClassName("external")(j)(k).innerText 72 73 If DLurl = "" Then 74 DLurl = doc.getElementsByClassName("external")(j) 75 Filename = Mid(DLurl, InStrRev(DLurl, "/") + 1, Len(DLurl - InStrRev(DLurl, "/") + 1)) 76 Filename = Replace(FoldeName, "%", " ") 77 Else 78 Filename = DLurl 79 DLurl = doc.getElementsByClassName("external")(j) 80 End If 81 82 FileType = CStr(Right(DLurl, Len(DLurl) - InStrRev(DLurl, "."))) 83 84 lngRes = URLDownloadToFile(0, DLurl, SaveDir + "\" + Filename + "." + FileType, 0, 0) 85 86 SaveDir = "" 87 DLurl = "" 88 DeleteUrlCacheEntry StrPtr(DLurl) 89 90 Next 91 92 On Error GoTo 0 93 94 Next 95 96 Next 97 98 MsgBox "終わり" 99 100End Sub

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

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

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

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

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

m.ts10806

2020/01/25 02:15

アクセスしようとしている先って、どこか知らないですが、自動でアクセスして勝手にダウンロードしていい場所なのでしょうか。 いずれにしてもcodeのマークダウンできてませんので、質問本文調整してください
FATE-T

2020/01/25 02:28

ダウンロードはしても大丈夫なサイトです 質問文修正しました
dodox86

2020/01/25 02:43

色々とパーズしてからダウンロードしたいファイルのURLを生成されているようですが、URLDownloadToFileは HTTPレスポンスの"Content-Type:"や"Content-Length:"の指定にしたがってファイルに保存するものだったと思います。 ホームページのリンクから辿らないとファイルのダウンロードができない、直リンク禁止のようなサイトだと、リダイレクトされたりして期待しているデータは保存できない場合があります。ダウンロードしたファイルの内容をダンプして確認すると、リダイレクトされる際のhtmlだったりしますので、確認してみてください。
FATE-T

2020/01/25 03:24

ご指摘のとおりHTMLのソースになっていました
dodox86

2020/01/25 03:29

では、たぶんそういうこと(直リン禁止)なのだと思います。ファイルのURLをブラウザのアドレスバーに直接入力してダウンロードできるようなところなら、本プログラムは使えるのでしょう。
FATE-T

2020/01/25 03:49

DL URL を直にコピペできるのですが、何か間違っているのでしょうか?
dodox86

2020/01/25 03:59

ならば何か間違っているのではないでしょうか。プログラム中で正しくURLは生成されているのでしょうか。
FATE-T

2020/01/25 04:03

URL 生成及び保存パスの生成はできています
dodox86

2020/01/25 04:14

であれば、これ以上は具体的なサイトを提示し、どのようなレスポンス(ファイル)が返ってきているか分からないとどなたも回答できないと思います。内部的にIEのコンポーネントを使う処理ですから、IEやWindows環境に関係しているかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問