[[20181219151344]] 『sendkeysを使っているエクセルVBAの運用』(しのみや) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『sendkeysを使っているエクセルVBAの運用』(しのみや)

 教えてください

 sendkeysを使っているエクセルVBAがあります
 IEで作られた自社ソフトを動かして、ファイルダウンロードをしています
 社内の効率化で作っているもので、費用は発生しておりません

 【動作】
 1.エクセルのセルにhttp://〜といった登録パスを入力する
   ↓
 2.エクセルでスタートボタンを押す
   ↓
 3.上記で登録したパスをIEで開く
   ↓
 4.(3.と同時に)IEのダウンロード画面が出てくる
   ↓
 5.OKを押す
   ↓
 最初に戻る

 を繰り返すVBAです

 sendkeysを使っているのは、「5.OKを押す」の部分です

 IEのダウンロード画面が出ると、VBAから制御ができないので
 sendkeysで対応しました
 あまり使いたくはないのですが…

 自分で使うなら途中で止まったりしても対応しておりますが、
 動作中にクリックしてしまったりすると違う動きをするので
 人にお渡しできるものではないな、と思っています

 今回は、「なんとかならないか?」と上の人に頼まれてチャレンジしたようなものですので
 必要な動作はできていますが、今後の動きを考えております

 ”sendkeysを使ったVBAを人にお渡しし、注意点を伝える”ケースと
 もしくは”渡せるものではないと説明する”ケース
 (渡せないとなると、自分で運用するしかなく、今後の管理も任される)

 今回のダウンロードをするVBAはさほど難しい動きはしていないので、
 「Ctrl+Pauseで止めてもらい、ダウンロードできたところから再開してもらう」が
 (人によっては)対応可であると思いますが、
 ほかの人に配布されたりして、違う使い方をされるのも…

 もし渡すなら、ここに気を付けたほうがよいや
 やらないほうが良い、など体験談や幅広い知識を頂けると助かります

< 使用 Excel:Excel2010、使用 OS:Windows10 >


 覚えていないのですが。。。(なら言うな ><;っていわれそぉですが A^_^;;;)なにかのヒントにでも。。。
たしか
DOMをループで回して、ボタンの名前が解れば(ソースみて探しておく^^;)
そのオブジェクト.クリック
とかで
出来たような気がします。
でわ
(隠居じーさん) 2018/12/19(水) 16:05

ボタン。。。名無しでも
何個目のボタンか解れば、たしか、可能だったような気がします。
自作でローカルサーバー上げて
自作HTML、でボタン、設置して簡易実験
すると。。。わかりやすいかもです。

さらに
お詳しい方の回答をお待ちください。
m(_ _)m

(隠居じーさん) 2018/12/19(水) 16:11


Sendkeysは、たまたまアクティプになっているアプリに対して文字列送信するので、確かに確実性に欠けますね。 とはいえ、Web制御ならば、その具体的なURLやHTML一式を見る事ができないと、どういう手段が使えるのか判断できません。 つまり、ご自分で頑張って解析し、検索し、試行錯誤してもらうしかないのです。

IEが開いて、ダウンロードボタンが出てくるのであれば、IE表示を実現しているマクロがあるはずだし、HTMLソースコードを読めば、ボタンに書かれた文字列と同じものがどこかに書かれているはずです。 大抵は、ボタンにはIDを振っていたり、クラス名指定しているので、これらを元にオブジェクトを特定し、Submit または Click すれば、Sendkeys を無くすことができるようになります。 IDが無ければ、最悪はTDタグを全て調べて、見えているものと同じ文字列だったならば、このオブジェクトを Click すれば解決できます。 TDタグとは無関係な箇所にボタンがあるならば、何か近くにあるタグを手掛かりにする事になるでしょう。

いずれにせよ、HTML次第でコードは全然違ってくるので、URLを開示できないのであれば、この程度しかアドバイスできません。
(???) 2018/12/19(水) 16:19


 全部は公表できず、
 情報が少なく回答しづらい状況ですみません

 もしかしたら、回答になっていないかもしれないのですが

 ダウンロード画面というのは以下です(IE9です)
 http://www.vwnet.jp/windows/WS08/IISforIE9/DownloadForIE9.html

 なので、
 >IDを振っていたり、クラス名指定している
 のお話とは違うのかな?と思ったりしました

 回答がずれていたらすみません
(しのみや) 2018/12/19(水) 17:09

最終的にやりたい事は、ファイルをダウンロードしたいということですよね?

IEにパスを渡してすぐにダウンロードの確認メッセージが表示されるということは、
ダウンロードしたいファイルのURLがわかっているということですよね?

であれば、API「URLDownloadToFile」を使用すると、確認メッセージを表示せずに、ファイルをダウンロードできます。
ネットで「URLDownloadToFile」を調べてみてはいかがでしょうか?

検討違いなら申し訳ありません。
(う) 2018/12/19(水) 17:20


おっと、被りましたが…。

現状はURLをセルに入力していて、これがハイパーリンクになっていて、クリックするとブラウザ起動するのを利用しているのですね。 ボタンとは、CSSで相手先が提供しているものではなく、IEのダウンロードボタンの事、という訳ですか。

それなら、URLを開く部分から全部マクロにしないと、自動でのボタン押しはできませんね。 現状通り、Sendkeys を利用するのがベストでしょう。 他の人には、マクロを動作させた後は余計なマウス操作をしないよう、手順を明文化するだけにしてはいかがでしょうか。

または、マクロを頑張ってみるならば、URLDownloadToFile というAPIがあるので、これを調べてみると良いかも知れません。(Windowsが提供するAPIの利用なので、初心者お断りな技術です)
(???) 2018/12/19(水) 17:22


ファイルのURLがおわかりなら
ネットフレームワークなら、比較的簡単にSystem.Net.WebClient()を使い出来るようです
あとCOMアセンブリにしてエクセル様から参照で。。。
DOSコマンドでも出来たような。。。
https://qiita.com/uratatsu/items/d77152ca121d0b779464
bitsadmin /transfer <URL> <ダウンロード先>

(隠居じーさん) 2018/12/19(水) 18:14


https://tonari-it.com/excel-vba-windowsapi-urldownloadtofile/
参考サイト
Excelが64ビット版なら少し変更しなければいけないと思います。

いろいろ調べてみましたが、う さん、???さんもご案内の通り、
少し注意しなければならないとは思いますが
後処理を勘案するとこの方法がベストかもです。
DOSで挑戦してみましたが。すこし工夫がいるのと。出来たのは出来たのですが
UACのプロンプトを表示させなくするのがかなり煩雑です(ここはやっていません)。
COMアセンブリも作成はそ〜んなに難しくは無いと思いますが、あと
出来たDLLをPCに登録しないと使えません。(めんど〜です^^;)
vsで作ればそのPCは自動で登録してくれますが、
配布となるといろいろ。。。考慮すべきことがたくさん^^;)
でわ。おやすみなさい。。。zzzzz

(隠居じーさん) 2018/12/20(木) 00:43


 さまざまな知識ありがとうございます
 全部はついていけていないのですが…

 まず最初に…教えていただいている
 URLDownloadToFile を調べてみました

 https://vba-code.net/ie/download-image/
 このページの簡素化バージョンを使わさせてもらっており、
 記述通りコピペをすると、うまく画像が取れました

 こちらの必要な状況に書き換えて、動きを確認しておりまして

    Const imgUrl As String = "https://vba-code.net/ie/download-image/"
    Const fileName As String = "guam.jpg"

 ここの部分を以下のように書き換えております

    Const imgUrl As String = "http://00.00.00.00/FILE/000/000/00000000000/"
    Const fileName As String = "明細.xls"

 そうすると以下の部分で、「オーバーフローしました」となります
    result = URLDownloadToFile(0, imgUrl, myDocumentsFolder + "\" + fileName, 0, 0)
 resultの変数宣言を、longにしたところ「-2146697208」になったのでダウンロードが失敗して いるのかな?と思っています
 (参考にさせてもらったページ https://www.vba-ie.net/element/image-download.php#a12)

 何の要因で失敗しているのでしょうか…
(しのみや) 2018/12/20(木) 12:05

Const imgUrl As String = "http://00.00.00.00/FILE/000/000/00000000000/"
あの〜
このようなURLは存在するのでしょうか?

(隠居じーさん) 2018/12/20(木) 12:43


imgUrl だけだとダウンロードするファイルが指定されていないと思いますが、、、、

2番目の引数は、ダウンロードしたいファイルのフルURLです。
ファイル名までの指定が必要です。
ダウンロードしたいファイルのURL上のファイル名も「明細.xls」であれば、

result = URLDownloadToFile(0, imgUrl, myDocumentsFolder + "\" + fileName, 0, 0)
 ↓
result = URLDownloadToFile(0, imgUrl + fileName, myDocumentsFolder + "\" + fileName, 0, 0)

でないでしょうか。

(う) 2018/12/20(木) 13:08


まず、-2146697208は、16進にすると800C0008です。 これは、WINDOWSの定数ではINET_E_DOWNLOAD_FAILURE、つまり、ダウンロード失敗、の意味ですね。 APIを使うからには、エラーコードの意味も調べてください。

imgUrl の文字列を直接IEに貼ってENTERすると、どうなりますか? それで目的のファイルが得られないようならば、ダウンロードもできません。 サーバ上のファイル名は何ですか? 「明細.xls」は、ダウンロード時に付けたい名前だったりしませんか? 参照元では、ファイル名部分はHTML内から得ていたようですよ?

あと、文字列連結には + ではなく & をつかうべきでしょうね。 + は大昔のBASICの名残であり、データ型を自動解釈する現代では、数字同士だと足し算してしまう + は使わない方が良いでしょう。
(???) 2018/12/20(木) 13:20


 隠居じーさん
 社内のサーバーで公表できるものではないので
 "http://00.00.00.00/FILE/000/000/00000000000/" 
 このようにさせて頂きました
 そのことを記載せず失礼しました

 うさん
 >result = URLDownloadToFile(0, imgUrl + fileName, myDocumentsFolder + "\" + fileName, 0, 0) 
 こちらで解決できました

 ???さん
 >+ ではなく & をつかうべきでしょうね
 対応してみます

 動きは再現できました
 記述の中身をしっかりと確認してみます

 ありがとうございました
(しのみや) 2018/12/20(木) 13:56

 大きな動きは理解できるようになりました

 sendkeysを使っていたときは1000件分が1時間必要でしたが
 今では1分で出来るようになりました^^;

 イロイロ悩んでおりましたが、そこからかなり上を行くものが出来てしまい
 ビックリしております

 ありがとうございましたm(_ _)m

(しのみや) 2018/12/21(金) 16:00


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.