- ベストアンサー
IEからエクセルに落とすマクロで配達状況を取得する方法
- 毎日60件ほどの書類を発送しているが、配達状況をIEからエクセルに落とすマクロが遅いため困っている。
- マクロの構成はFor...Nextステートメントを使用して伝票番号をループし、IEでサイトにナビゲートして配達状況を取得している。
- 数が多い場合、アプローチ方法を教えてほしい。もっと早くなるアドバイスがあれば助かる。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。お邪魔します。 > プロなら、このように数が多い場合、 > どのようにアプローチするのでしょうか? どの分野の「プロ」をお望みなのかよく判りませんが、 私は「エクセルマクロのプロ」や「プロのプロブラマー」 ではありませんので、 答える資格はないのかな?と思ってはいますが、、、。 とりあえず、設計上の話から。 ページを表示させる必要がないのであれば、 IEやWebBrowserコントロール等を経由させずに、 WinHTTP(Microsoft WinHTTP Services, version 5.1) や MSXML2(Microsoft XML, v6.0) を使って、HTMLだけを取得して MSHTML(Microsoft HTML Object Library) で、DOM操作で処理するとか、 VBScript_RegExp_55(Microsoft VBScript Regular Expressions 5.5) で、正規表現を使って必要なデータだけを抽出するとか、 必要なHTMLタグだけを探しておいて、 MSForms(Microsoft Forms 2.0 Object Library)のDataObject 経由で、HTMLタグをクリップボードへコピーして シートに貼り付けする 等の方法があります。 > 60件もあるからなのか、 > 終わるまで10分ぐらいかかります。 ページを表示させる必要がないのであれば、 HTMLを取得するだけに留めることで無駄な時間を省けます。 条件にもよりますが、 概ね、0.1~0.2秒/件、前後が目安になる感じです。 WinHTTPやMSXML2にしても レスポンスをひとつずつ待機していると時間が掛かるので、 非同期で複数同時にリクエストしておいて クラスモジュールにてレスポンス取得したタイミングの トリガ(イベント)を受けとって、 responseTextやresponseBodyなどでHTMLを取得し、 必要な情報だけを抽出します。 具体性のないご質問ですので、質問スレの紹介に留めます。 WinHTTP(非同期)、MSHTML、の組合わせで クラスモジュールを使った例(の簡略版(約7割省略))です。 「'エクセルでXMLHTTPを用いて株の経常益を取得」 http://okwave.jp/qa/q9123746.html 先の解答・説明にある通りの準備をすれば動作の確認は出来ます。 配達状況の確認は私もよく使いますが、 "xxx.com/xxxx/=123456789" というようなURLを扱ったことはありませんし、 こちらからは、ページソースを見ることも叶わない予感がします。 必要なデータだけを抽出する為には、 ページソースを見る事が必須になりますので、 DOM操作に関しては、 実際にページソースを見ることが出来る方に相談なさるか、 事前にそちらで検討の上、ページソースを抜粋したサンプル を添えて質問なさるか、ということになるかと思います。 興味をお持ちでしたら、 リンク先質問文にあるURLのページについて、 IEで開いて、 [ページ]→[ソースの表示] または [F12]→[DOMExplorer] などで、 HTMLソースの中から必要な情報だけを探す為の手掛かりを見つける 練習などしておくと、 具体的な答えを得られるような具体的な質問が書ける ようになるかと思います。 個別のオブジェクトについての部分的な扱い方や クラスモジュールの使い方については、 Web上にも多数の情報がありますので、学び取ってください。 追加質問として、具体的にあなたの実際の必要に応えるような 応用に関する相談について、 追加回答をするつもりは(今回のスレッド(質問)では)ありませんが、 こちらから提示した回答内容に関する実践上の疑問については ご質問あれば出来る範囲でお応えするつもりはあります。 職場での「プロ」意識に則れば、 通信環境や配送会社側の各種サービス(交渉)などについても 確認・検討は必要でしょうし、 質問文にその旨書き添えてあるかどうかで回答の質も変わってくるでしょう。 また、10秒/件、というのは、やはり遅いですから、 IEを使うにしても、複数のIEタブを非同期で並行処理する、とか、 或いは複数のWebBrowserコントロールを事前に用意しておく、等、 工夫の余地はあります。 いずれにしても、現状を打破するには、 クラスモジュールを使用することになるかと思います。 取得する内容によっては(確率は低いですが)、 Webクエリ等でも、更新をVBAから実行することで 多少の時短に繋がるケースもあるかも知れません。 さしあたり、以上です。
その他の回答 (1)
- ushi2015
- ベストアンサー率51% (241/468)
こんにちは どのようなコードなのか分からないのでなんとも言えないですが、 60件毎にナビゲートするにはある程度時間は掛かります。 コードをチューンするか、ネットへの接続スピードを上げるか、 どちらが効果的かという事になると思います。
お礼
ありがとうございます!
お礼
すごい!ありがとうございます! 研究してみます。 質問で詳しく書きすぎても、質問が長すぎてしまうので 本質だけ捉えようとして、質問するのですが、 それでは技術的な正しい回答を得るのが難しいですよね。 この配送業者です。 GetElementsbyTagNameで、 TABLEとSPANで、必要な情報を取得しています。 http://www.dhl.com.hk/en/express/tracking.html?brand=DHL&AWB=xxxxxxx ←伝票番号