アプリ版:「スタンプのみでお礼する」機能のリリースについて

irvineを利用してターゲットの保存フォルダにダウンロードデータを入れたいだけなのですがどうやったらいいかわかりません。

保存フォルダ c:\保存フォルダ\
対象ファイル 1.jpg~9.jpg
対象URL http://hogehoge.com/

Set shell = CreateObject("WScript.Shell")
for i=1 to 9
Call shell.Run(Chr$(34) & "c:\irvine\irvine.exe" & Chr$(34) & " http://hogehoge.com/" & str(i) & ".jpg")
next i

...しかし、どこで保存フォルダを設定するのやら、という感じです。

参照のサイトも見たのですが、意味がわかりません。
http://hp.vector.co.jp/authors/VA024591/doc/api. …

保存場所を指定してダウンロードする、このやり方をシンプルに教えてください。
出来れば、ジョブが終わったか否かも確認できたらうれしいです。

参照サイト
http://q.hatena.ne.jp/1159035157
なんとなくActiveXを使うとわかったのですが、フォルダの指定とか
どれなのかさっぱりわからないです。

なにとぞお力添えお願いします

A 回答 (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 に
ウインドウフォーカスを戻してから表示しないと、タスクバーで点滅する
だけで、通知にならないからです・・
    • good
    • 0
この回答へのお礼

ご丁寧にありがとうございます
使っているのはAccess VBAで、VBAでも変わってくるんですね。
というか、その可能性は感じてましたが、今回には影響ないと思いまして...すみません

確かに、アクセスからテーブルをなめてIrvineに送ったらえらいことになりそうです。とても勉強になりました。

ご丁寧にありがとうございました!!

お礼日時:2009/10/29 14:57

> このやり方をシンプルに教えてください。



基本はこんな感じ。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
    • good
    • 0
この回答へのお礼

ありがとうございました!!
適当に返事を返すのは失礼でして、理解に励みました。
最初もAPIも理解の努力をしたのですが、例文が無くさっぱりだったんですが...

まず、上段の方はOKでした! これは完璧に理解できました。
下段の方は、理解に少々時間がかかりましたが、大体わかりました。

なぜか、
Application.xxx
はことごとくエラーだったのです(何故だろーー)が、それ以外のところも
問題なく動きました。

VBAあがりで、VBのVの字もわからない私です。

Private Declare Sub Sleep Lib "kernel32.dll" ( _
    ByVal dwMilliseconds As Long)
とか、
AppActivate Application.Caption
とか。
だけど、かなりわかりやすく、脱帽です!
お時間かけて書いていただき本当にありがとうございました。

感謝!感謝!本当に感謝でした。

お礼日時:2009/10/28 19:38

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!