[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『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
さらに
お詳しい方の回答をお待ちください。
m(_ _)m
(隠居じーさん) 2018/12/19(水) 16:11
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
(隠居じーさん) 2018/12/19(水) 18:14
いろいろ調べてみましたが、う さん、???さんもご案内の通り、
少し注意しなければならないとは思いますが
後処理を勘案するとこの方法がベストかもです。
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
(隠居じーさん) 2018/12/20(木) 12:43
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
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.