• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:irvineを利用してVBAからダウンロード)

VBAを利用してirvineを使ったダウンロード方法

このQ&Aのポイント
  • VBAを使ってirvineを利用し、指定した保存フォルダにダウンロードデータを保存する方法について教えてください。
  • 保存フォルダを指定してirvineを使ってダウンロードするシンプルな方法を教えてください。また、ジョブの完了を確認する方法も知りたいです。
  • irvineを利用してVBAから指定したURLの画像ファイルをダウンロードし、指定した保存フォルダに保存する方法を教えてください。保存が完了したかどうかも確認できる方法があれば教えてください。

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

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.1

> このやり方をシンプルに教えてください。 基本はこんな感じ。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

ssmx
質問者

お礼

ありがとうございました!! 適当に返事を返すのは失礼でして、理解に励みました。 最初もAPIも理解の努力をしたのですが、例文が無くさっぱりだったんですが... まず、上段の方はOKでした! これは完璧に理解できました。 下段の方は、理解に少々時間がかかりましたが、大体わかりました。 なぜか、 Application.xxx はことごとくエラーだったのです(何故だろーー)が、それ以外のところも 問題なく動きました。 VBAあがりで、VBのVの字もわからない私です。 Private Declare Sub Sleep Lib "kernel32.dll" ( _     ByVal dwMilliseconds As Long) とか、 AppActivate Application.Caption とか。 だけど、かなりわかりやすく、脱帽です! お時間かけて書いていただき本当にありがとうございました。 感謝!感謝!本当に感謝でした。

その他の回答 (1)

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.2

> 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 に ウインドウフォーカスを戻してから表示しないと、タスクバーで点滅する だけで、通知にならないからです・・

ssmx
質問者

お礼

ご丁寧にありがとうございます 使っているのはAccess VBAで、VBAでも変わってくるんですね。 というか、その可能性は感じてましたが、今回には影響ないと思いまして...すみません 確かに、アクセスからテーブルをなめてIrvineに送ったらえらいことになりそうです。とても勉強になりました。 ご丁寧にありがとうございました!!

関連するQ&A

専門家に質問してみよう