- ベストアンサー
VBAを利用してirvineを使ったダウンロード方法
- VBAを使ってirvineを利用し、指定した保存フォルダにダウンロードデータを保存する方法について教えてください。
- 保存フォルダを指定してirvineを使ってダウンロードするシンプルな方法を教えてください。また、ジョブの完了を確認する方法も知りたいです。
- irvineを利用してVBAから指定したURLの画像ファイルをダウンロードし、指定した保存フォルダに保存する方法を教えてください。保存が完了したかどうかも確認できる方法があれば教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> このやり方をシンプルに教えてください。 基本はこんな感じ。Folder プロパティーを使います。 Sub IrvineSample1() Dim Irvine As Object Dim vineItem As Object Set Irvine = CreateObject("Irvine.API") Set vineItem = CreateObject("Irvine.Item") vineItem.URL = "http://oshiete1.goo.ne.jp/qa1.html" vineItem.Folder = "C:\test" '<--- ※ココ Call Irvine.Current.AddItem(vineItem) End Sub > 対象ファイル 1.jpg~9.jpg > ジョブが終わったか否かも確認できたら 他アプリケーションとの連携は高度な問題なので、それなりの スキルが必要で、また「シンプル」に説明するのは難しい。 難解であっても API のドキュメントを理解しようと意志も必要 です。 ・・・といった愚痴っぽいのは横においておいて。 Irvine を手動操作して DL を停止させた場合までチェック してませんが、こんな感じ。コメント入れたので眺めてみて ください。 ' // 標準モジュール ' // Summary: Irvine で保存フォルダを指定し、ダウンロード Option Explicit Private Declare Sub Sleep Lib "kernel32.dll" ( _ ByVal dwMilliseconds As Long) Sub IrvineSample2() ' Irvine の起動(参照) On Error Resume Next Dim Irvine As Object Set Irvine = CreateObject("Irvine.API") If Err Then MsgBox "Irvine を起動できません", vbCritical Exit Sub End If On Error GoTo 0 ' とりあえずキューフォルダを Default に指定します Irvine.CurrentQueueFolder = "Default" ' DL アイテムのインデックスを保管しておくコレクション Dim colItem As Collection Set colItem = New Collection ' # Current.AddItem で DL アイテムを送信する際、 ' # インデックス(識別子)が返却されます。 ' # このインデックスを使って、後から DL アイテムの情報 ' # を調べることができます。 ' Irvine に DL アイテムキューを送信する Dim i As Long For i = 1 To 9 ' DL アイテム各種プロパティーを設定します Dim vineItem As Object Set vineItem = CreateObject("Irvine.Item") With vineItem ' ■ダウンロードファイルのURL .URL = "http://hogehoge.com/" & CStr(i) & ".jpg" ' ■個別で保存フォルダを指定する場合に指定する .Folder = "C:\test" ' ■別名で保存する場合に指定する '.Filename = "" End With ' DL アイテムをキューに追加し、DL を開始する Dim nIndex As Long nIndex = Irvine.Current.AddItem(vineItem) ' nIndex = -1 のときは既に DL されているとみなし無視 If nIndex >= 0 Then ' インデックスをコレクションに保管 colItem.Add nIndex ' あまり無理をさせてはいけません。Irvine 側の ' 受け入れ処理のため若干スリープ Call Sleep(50&) End If ' 念のため開放 Set vineItem = Nothing Next ' DL 終了確認(待機処理) Application.Cursor = xlWait Dim bDownloading As Boolean Do bDownloading = False Dim vIndex As Variant For Each vIndex In colItem With Irvine.Current.Items(CLng(vIndex)) If Not .Error And Not .Success Then bDownloading = True Exit For End If End With Next DoEvents ' CPUを VBA で占有しないよう1000ミリ秒=1秒スリープ ' VBA のせいで DL 速度落ちたらアレなので Call Sleep(1000&) Loop While bDownloading ' 各種オブジェクトの開放 Application.Cursor = xlDefault Set Irvine = Nothing Set colItem = Nothing AppActivate Application.Caption MsgBox "終了したっぽい (´ω`* )", vbInformation End Sub
その他の回答 (1)
- KenKen_SP
- ベストアンサー率62% (785/1258)
> Application.xxx > はことごとくエラーだったのです(何故だろーー)が、それ以外のところも > 問題なく動きました。 VBA ではなく、Excel VBA、Access VBA などと表記して下さい。 質問タイトルに VBA とだけあったので、一番普及しているであろう Excel VBA で #1 のソースを書いてます。 VBA と言えば一般的に Microsoft の Office 製品に搭載されているものを 意味しますが、Excel, Word, Access, etc... それぞれのアプリケーション によって若干ソースが変わってくる部分がでてきます。 また、単に VB と言った場合でも VB6 なのか、VB.NET なのかでソースは 全く別物になってきます。 > Private Declare Sub Sleep Lib "kernel32.dll" ( _ > ByVal dwMilliseconds As Long) 「指定した時間待機(ウェイト処理)」する Win32 API というライブラリの コマンドを使いますという宣言文です。 今回の Irvine 連携は、非同期処理になります。したがって、 「あれやれ、これやれ・・それキュー連続発射」 と投げっぱなしでは良くないんですよ。 適当にウェイトを挟んで Irvine 側でそれをさばく間を設けてやらないと、 Irvine が受けきれずエラーを起こします。 # まあ、9個ぐらいなら全然問題にならないですけど > AppActivate Application.Caption AppActive は、ウインドウタイトルに指定した文字列を含むウインドウを アクティブにします。 先述のとおり、Excel VBA で書いてます。したがって、Application とは Excel のこと。AppActivate に渡している文字列は、Excel の ウインドウタイトルですから、「Excel をアクティブにせよ」ということ ですね。 Irvine を起動したときに、ウインドウのフォーカスがそちらに遷移して しまいますよね? 処理終了の通知として最後に MsgBox を表示させてますが、Excel に ウインドウフォーカスを戻してから表示しないと、タスクバーで点滅する だけで、通知にならないからです・・
お礼
ご丁寧にありがとうございます 使っているのはAccess VBAで、VBAでも変わってくるんですね。 というか、その可能性は感じてましたが、今回には影響ないと思いまして...すみません 確かに、アクセスからテーブルをなめてIrvineに送ったらえらいことになりそうです。とても勉強になりました。 ご丁寧にありがとうございました!!
お礼
ありがとうございました!! 適当に返事を返すのは失礼でして、理解に励みました。 最初もAPIも理解の努力をしたのですが、例文が無くさっぱりだったんですが... まず、上段の方はOKでした! これは完璧に理解できました。 下段の方は、理解に少々時間がかかりましたが、大体わかりました。 なぜか、 Application.xxx はことごとくエラーだったのです(何故だろーー)が、それ以外のところも 問題なく動きました。 VBAあがりで、VBのVの字もわからない私です。 Private Declare Sub Sleep Lib "kernel32.dll" ( _ ByVal dwMilliseconds As Long) とか、 AppActivate Application.Caption とか。 だけど、かなりわかりやすく、脱帽です! お時間かけて書いていただき本当にありがとうございました。 感謝!感謝!本当に感謝でした。