画像をDLするコードが動かない

このQ&Aのポイント
  • VBAを使用してWEBサイトから画像データをダウンロードするコードが動作しない
  • 特定のループでエラーが発生し、解決策がわからない
  • 公式サイトから入手したサンプルコードでも同じエラーが発生する
回答を見る
  • ベストアンサー

画像をDLするコードが動かない

こんにちは。 秀和システムのVBAでIEを操作する書籍で解説されている、WEBサイトから画像データをDLするというコードが動かず困っています。 コードは以下です。 Range("Sheet1!$b$1") に、秀和システムの公式サイトのURLが記載されています。 -----ここから----- Dim obIE As Object '変数の定義を行います Dim Obj As Object '変数の定義を行います Dim Rtn_Down As Integer '変数の定義を行います Dim Rtn_del As Integer '変数の定義を行います '「Sleep」コマンドを使う場合の決まり文句 Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) '「URLDownloadToFile」を使う場合の決まり文句 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 '「DeleteUrlCacheEntry」を使う場合の決まり文句 Declare Function DeleteUrlCacheEntry Lib "wininet" _ Alias "DeleteUrlCacheEntryA" (ByVal lpszUrlName As String) As Long Sub ファイルをダウンロード() Set obIE = CreateObject("InternetExplorer.Application") '変数の定義を行います obIE.Visible = True '決まり文句。IEを見えるようにします Range("Sheet1!$b$1").Hyperlinks(1).Follow NewWindow:=True '画像を取得したいページを新しいウィンドウで開きます Sleep (2000) ' Do While obIE.ReadyState <> 4 '決まり文句。サイトが開くまで待ちます Do While obIE.Busy = True '決まり文句。サイトが開いてなければ、繰り返し待ちます Loop ' Loop For Each Obj In obIE.document.images '表示されているサイトのイメージタグを一つずつ、変数objにセット Rtn_del = DeleteUrlCacheEntry(Obj.href) 'ダウンロード対象のキャッシュをクリアします Rtn_Down = URLDownloadToFile(0, Obj.href, "c:\test\" + Obj.Nameprop, 0, 0) 'ファイルをCドライブのtestというフォルダにダウンロード Next '次のタグを処理します End Sub -----ここまで----- F8でステップ実行すると、 Do While obIE.ReadyState <> 4 '決まり文句。サイトが開くまで 待ちます Do While obIE.Busy = True '決まり文句。サイトが開いてな ければ、繰り返し待ちます Loop Loop のところでずっとループをくり返している、というところまでは突き止めましたが、どうやって解決したら良いか判らずにいます。 また、 ためしに、 Do While obIE.ReadyState <> 4 '決まり文句。サイトが開くまで 待ちます をコメントアウトしたところ、先に進みましたが、 For Each Obj In obIE.document.images '表示されてい るサイトのイメージタグを一つずつ、変数objにセット のところで、 「実行時エラー '-2147467259(80004005)': 'Document'メソッドは失敗しました: 'IWebBrouser2'オブジェクト というエラーが発生しました。 どなたかアドバイスの程、なにとぞお願い致します。 (なお、自分で入力したコードがダメだったあと、公式サイトからサンプルコードをDLして試しましたが、結果は同じでした)

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

こんにちは。 書籍は読んでいませんけれど、 此処でご提示の記述は、ちょっとおかしいですね。 私の環境でも、同じ状態になります。 .Hyperlinks(1) を NewWindow で .Follow する ということなら、それは、obIEとは無関係ですし、 obIE は 何も操作していない状態ですから、 何もない空っぽのページを 処理しようもないです。 一般論として、方法はだいたい2通りあります。  ●.Hyperlinks(1).Follow した結果として開かれる    新しいIEオブジェクトを捉え直す。  ●.Hyperlinks(1).Follow の代りに URLを指定して     URLを指定して obIE.navigate する 後者の例でお答えします。 修正箇所を★印で示します。 以下の修正を加えてから実行する限りでは、正常にダウンロードできること を、確認しました。 Sub ファイルをダウンロード()   Set obIE = CreateObject("InternetExplorer.Application") '変数の定義を行います   obIE.Visible = True '決まり文句。IEを見えるようにします '  Range("Sheet1!$b$1").Hyperlinks(1).Follow NewWindow:=True '画像を取得したいページを新しいウィンドウで開きます ' ★トル   obIE.navigate Sheets("Sheet1").Range("B1").Hyperlinks(1).Address ' ★変更 '  Sleep (2000) ' ★トル   ' Do While obIE.ReadyState <> 4 '決まり文句。サイトが開くまで待ちます   Do While obIE.Busy = True '決まり文句。サイトが開いてなければ、繰り返し待ちます     Sleep (10) ' ★追加   Loop   ' Loop   For Each Obj In obIE.document.images '表示されているサイトのイメージタグを一つずつ、変数objにセット     Rtn_del = DeleteUrlCacheEntry(Obj.href) 'ダウンロード対象のキャッシュをクリアします     Rtn_Down = URLDownloadToFile(0, Obj.href, "c:\test\" + Obj.Nameprop, 0, 0)   'ファイルをCドライブのtestというフォルダにダウンロード   Next '次のタグを処理します End Sub

wine38
質問者

お礼

レスを頂きありがとうございます! ご教示の方法で無事正常動作致しました。 やはりもとのソースがおかしかったのですね……。 初学者はこういう事態に立ち至るとデッドエンドなので、今回大変助かりました。 どうもありがとうございました!

その他の回答 (1)

noname#212067
noname#212067
回答No.1

>Do While obIE.ReadyState <> 4 '決まり文句。サイトが開くまで >待ちます >をコメントアウトしたところ、先に進みましたが、 先に進みますが、IEの処理が終わってない状態で次に行くので 「実行時エラー '-2147467259(80004005)':'Document'メソッドは失敗しました: :IWebBrouser2'オブジェクト が発生してしまいます。 この部分は、本来ならIEが、ホームページの読込みを、完全に終わったあと obIE.ReadyStateが4になって抜けるはずなのですが、機能しないようです IEのバージョン等の問題かと思うのですが Do Until obIE.StatusText Like "*ページが表示されました*" Do Until obIE.Busy = False なんかで、置き換えてみてください

wine38
質問者

お礼

レスを頂きありがとうございます! >Do Until obIE.StatusText Like "*ページが表示されました*" >Do Until obIE.Busy = False >なんかで、置き換えてみてください Do While obIE.ReadyState <> 4 '決まり文句。サイトが開くまで待ちます Do While obIE.Busy = True '決まり文句。サイトが開いてなければ、繰り返し待ちます をそれぞれ置き換えてみましたが、 Do Until obIE.StatusText Like "*ページが表示されました*" の行で、「実行時エラー '-2147467259(80004005)':'Document'メソッドは失敗しました: :IWebBrouser2'オブジェクト……」が発生してしまいました……。

関連するQ&A

  • エクセルマクロでIE操作

    IEをエクセルマクロで操作する際に現在は下記のようなコードで立ち上げでいます。 この時、1回目の処理が終わり、もう一度同じボタンを押してコードを実行する際 あたにIEが立ち上がってしまいます。 同じURLのIEがすでに立ち上がっている際には そのIEを利用して処理を行うにはどのようにしたらよいでしょうか? ption Explicit 'Sleepを使用する場合のお約束 Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Public Declare Function CloseWindow Lib "User32" (ByVal hwnd&) As Long Private Declare Function SetForegroundWindow Lib "user32.dll" (ByVal hwnd As Long) As Long Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Dim objIE As Object '変数を定義 Dim Obj As Object '変数を定義 Sub 間接() 'IEテストする。 Dim txtSelect As HTMLSelectElement Dim objTAG As Object 'IEの起動 Dim objIE As Object '変数を定義します。 Set objIE = New InternetExplorerMedium objIE.Visible = True '可視、Trueで見えるようにします。 '処理したいページを表示します。 objIE.Navigate "https://www.google.co.jp/?gws_rd=ssl" Sleep (1000) Do While objIE.ReadyState <> 4 'サイトが開かれるまで待つ(お約束) Do While objIE.Busy = True 'サイトが開かれるまで待つ(お約束) Loop Loop

  • 無限ループ VBA IE操作

    VBAです。 とあるサイトで Sub IE_wait() Const READYSTATE_COMPLETE As Long = 4 Do Until objIE.readyState = READYSTATE_COMPLETE Loop Do While objIE.Busy = True DoEvents Loop End Sub が無限ループに陥ります。 中断して Exit Sub を入れてみましたが、抜けれません。 ページは既に表示済みです。 なぜ無限ループが抜けられないのか、 なぜページが表示されているのにこのコードが繰り返されるのか 何かわかる方よろしくお願いします。

  • URLDownloadToFile でダウンロード不可

    Access2003のVBAでIEを立ち上げて、あるサイトにログインした後、 サイトのメニュー上にあるCSVダウンロードをキックしてファイルを ダウンロードしようとしてます。 下記のようなコードを書いて見ましたが、表向きエラーは出ないものの ファイルのダウンロードは出来ません。 ブラウザ立ち上げ→ログインまではうまくいっています。 さらに詳細に調べると、URLDownloadToFileのところでエラーを 返していて失敗しているということが判明しました。 エラーコードは-2146697208となっています。 こちら何が問題でしょうか?どなたかご教示いただけると助かります。 Sub ie_test() Dim objIE As Object Const strURL = "https://xxx.com/csv.php?command=Csv" Dim strFNAME As String Dim returnValue Set objIE = CreateObject("InternetExplorer.application") objIE.Visible = True objIE.Navigate "https://xxx.com/" Do While objIE.Busy = True DoEvents Loop objIE.Document.Forms(0).loginid.Value = "myname" 'ユーザー名 objIE.Document.Forms(0).passwd.Value = "pswd" 'パスワード 'フォームをSubmitする objIE.Document.Forms(0).submit Do While objIE.Busy Or (objIE.ReadyState <> 4): DoEvents: Loop 'READYSTATE_COMPLETE=4 'URLDownloadToFile API をコールする strFNAME = "c:\test.csv" returnValue = URLDownloadToFile(0, strURL, strFNAME, 0, 0) objIE.Quit '.Quitで閉じる End Sub

  • GetWindowText、GetActiveWindowについて

    こんばんは。よろしくお願いします。 まずは以下をご覧ください。 Excel VBA です。 Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Sub Sample() Dim rtn, rtn2 As Long Dim Name As String Dim Leng As Long Dim ReturnValue ReturnValue = Shell("CALC.EXE", 1) AppActivate ReturnValue Sleep 500 Name = String(250, Chr(0)) Leng = Len(Name) rtn = GetActiveWindow() rtn2 = GetWindowText(rtn, Name, Leng) Debug.Print Name End Sub これを実行しても、イミディエイトウインドウに「電卓」は出ません。 エラーもありません。 なぜなのでしょうか?

  • EXCEL VBAでWEBページ保存2

    何度もお世話になります、よろしくお願いいたします。 本日、EXCEL VBAでWEBページを完全保存する方法を質問して 下記を紹介していただきました。 Option Explicit 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 -------------------------------------------------------------------------------- Sub DownloadFileFromWeb() Const strUrl As String = "http://www.puremis.net/excel/index.shtml" Dim strSavePath As String Dim returnValue As Long strSavePath = ThisWorkbook.Path & "\" & "Test.htm" returnValue = URLDownloadToFile(0, strUrl, strSavePath, 0, 0) If returnValue = 0 Then MsgBox "Sccess!" Else MsgBox "Did not success." End If End Sub ------------------------------------------------- この状態だと動作は完璧なんですが たくさんのWEBページを保存するようにVBAを組みたいので HPアドレスの部分に変数を使いたいのです。 この部分です:Const strUrl As String = "http://www.puremis.net/excel/index.shtml" でも変数を使うとエラーになってしまうので困り果てております。何か良い方法はございませんでしょうか。 よろしくお願いいたします。

  • 特定のVBAコードの学習

    こちらのサイトに掲載されているVBAがとても便利だったので、これをとりかかりにExcel VBAの学習をしたいと思っています。 http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1230707792 行ごとに何を意味するものが書かれているのか、調べながら学習したいのですが、適当なサイトや書籍がありましたら教えてください。 コードも下記に記します。 Sub sample() Const READYSTATE_COMPLETE = 4 Dim ie As Object Dim r As Long Set ie = CreateObject("InternetExplorer.Application") 'ie 'ie.Visible = True 'ieを表示する場合 r = 1 '注目行の初期値 Do While Range("A" & r) <> "" 'A列が空白でない間 ie.navigate Range("A" & r).Value '注目行のA列のURlにアクセス Do While ie.busy Or (ie.readystate <> READYSTATE_COMPLETE): DoEvents: Loop '表示完了待ち Range("B" & r).Value = ie.document.Title '注目行のB列にurlのタイトル書き込み r = r + 1 '注目行+1 Loop ie.Quit 'ieを閉じる Set ie = Nothing End Sub

  • VBAで画像ファイルをダウンロードしたいけどうまく

    VBAで画像ファイルをダウンロードしたいけどうまく行かない・・・ XPで、オフィス2003です。 http://officetanaka.net/other/extra/tips01.htm を参考に、画像ファイルをダウンロードする練習をしているのですが "エラーが発生しました"になってしまいます。 標準モジュールに --------------------------------------------------------- Option Explicit Public 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 Sub Sample() GetImageFile "http://www.officetanaka.net/sample.jpg", "C:\sample.jpg" End Sub Sub GetImageFile(ImgName As String, SaveName As String) Dim SaveFileName As String, DownloadFile As String, Ret As Long Ret = URLDownloadToFile(0, DownloadFile, SaveFileName, 0, 0) If ImgName = "" Then Exit Sub SaveFileName = SaveName DownloadFile = ImgName Ret = URLDownloadToFile(0, DownloadFile, SaveFileName, 0, 0) If Ret = 0 Then MsgBox "ダウンロードできました" Else MsgBox "エラーが発生しました" End If End Sub --------------------------------------------------------- を貼り付けました。 Retが0にならなくてはいけないみたいですが、 自分の場合は、-2147221020になってしまいます。 どう修正すればいいのか教えてください。

  • VBA IEを操作。ファイルダウンロード

    IEを操作して、ファイルをダウンロードしようと思います。 色んなサイトからとってきて、使わせてもらっています。 '---------------------------------IEを開くときに使う Sub IE_OPEN(webUrl As String) Dim objShell Dim writesheet As Worksheet Dim n As Long Dim ID As String, Password As String Set objShell = CreateObject("Shell.Application") Set ie = CreateObject("InternetExplorer.Application") ie.Visible = True ie.Navigate2 webUrl Do While ie.Busy Or ie.readyState <> 4 DoEvents Loop Dim objINPUT Set objINPUT = ie.document.getElementsByTagName("INPUT") 'ループで頭からテキストが 次へ を探す For n = 0 To objINPUT.Length - 1 '※ type="submitボタンなので、.InnerTextじゃなくて、.Valueです ※※注意 If InStr(objINPUT(n).Value, "ログイン") > 0 Then '文字列の中から見つけたら Worksheets("Sheet1").Activate Do While ie.Busy Loop objINPUT(n).Click '見つけたINPUTタグのオブジェクトをクリック Do While ie.Busy Loop Exit For End If Next Set objINPUT = Nothing 'オブジェクト変数解放 End Sub '------------------------------IEを開く(この段階では既に開いてあります。) Private Sub CommandButton1_Click() Do While ie.Busy Or ie.readyState <> 4 DoEvents Loop ie.document.all.ah_ehName.Value = Me.ComboBox1.List(Me.ComboBox1.ListIndex) 'ID Do While ie.Busy Loop Dim objINPUT Dim n As Long Set objINPUT = ie.document.getElementsByTagName("INPUT") For n = 0 To objINPUT.Length - 1 If InStr(objINPUT(n).Value, "ダウンロード") > 0 Then objINPUT(n).Click Do While ie.Busy Loop Exit For End If Next Do While ie.Busy = True DoEvents Loop SendKeys "%S", True'保存 Do While ie.Busy = True DoEvents '何もしないループ(笑) Loop SendKeys "%O",True'ファイルを開く? Do While ie.Busy = True DoEvents Loop 'ie.Quit End Sub ’==================- 面倒なので、IEはPublic変数として モジュールに書いています。 (色んなモジュールを経由する必要があるため、このような手段を取りました) SendKeysをIEに送るというのが出来ずに困っています。 ダウンロードというボタンを押してのダウンロードなので、 ダウンロード用のURL等は分かりません。 Excel2003を使っています。 どうにかSendkeysで出来ないでしょうか? もしくは、もう少し分かりやすい方法は無いでしょうか。 (ファイルを保存しますか?のダイアログの「保存」をクリックして  所定の場所におき、開きたい。 そのまま開くのでもいいけれど、動作が不安定になるのは困る) 以上、よろしくお願い致します。

  • VBAで教えてgooに自動ログインしたい

    Sub 教えてgoo() Dim objIE As Object Const READYSTATE_COMPLETE As Long = 4 Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.Navigate "https://login.mail.goo.ne.jp/id/authn/LoginStart?Site=oshiete.goo.ne.jp&Success=http%3A%2F%2Foshiete.goo.ne.jp%2F" Do While objIE.Busy = True DoEvents Loop Do Until objIE.ReadyState = READYSTATE_COMPLETE Loop objIE.document.all.all("uname").Value = "gooID" objIE.document.all.all("pass").Value = "gooPW" Do While objIE.Busy = True DoEvents Loop Do Until objIE.ReadyState = READYSTATE_COMPLETE Loop objIE.document.all("ログイン").Click End Sub --------------------------------------------------------- を実行してみても、 objIE.document.all.all("uname").Value = "gooID" objIE.document.all.all("pass").Value = "gooPW" objIE.document.all("ログイン").Click の部分がエラーになってしまいます。 教えてgooは、VBAでログインできないように規制されてるのでしょうか?

  • https:/○○login.php エラーになる

    win7 32ビット オフィス2010です。 https:/○○login.php のようなサイトを開こうとすると ------------------------------------------------------ Dim objIE As InternetExplorer Sub test() Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.Navigate "https:/○○login.php" Call WaitIE1(objIE) End Sub ------------------------------------------------------ Function WaitIE1(objIE As InternetExplorer) Do While objIE.Busy = True DoEvents Loop Do While objIE.Document.ReadyState <> "complete" DoEvents Loop End Function ------------------------------------------------------ このコードがエラーになります。 Do While objIE.Document.ReadyState <> "complete" の部分で 実行時エラ― -2147417848 オートメーションエラーです。 起動されたオブジェクトはクライアントから切断されました。 となります。 objIEをウォッチ式に登録してみてみると Function WaitIE1(objIE As InternetExplorer) の時に、「変数なし」となっています。 objIE.Navigate http://www.goo.ne.jp/ にすれば、 エラーにならずに、コードが最後まで行きます。 ウォッチ式を見ても 「変数なし」にはなりません。 この違いは何でしょうか?

専門家に質問してみよう