- ベストアンサー
INPUT type=file で出るダイアログに入力で窓を確実に取得したい。
http://oshiete1.goo.ne.jp/qa4624451.html でダイアログボックスへの文字列の挿入を実現して います。 sendkeysのターゲットを確実に取得したいのですが どうすればいいでしょうか? 時々、違う窓にsendkeysしてしまいます。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 昨日、返事をアップロードしてから、調べてみました。 ちょっと勝手なレスになってすみませんが、昨日の回答から、私自身の中では見通しが変わり、結論としては、UWSC などを使わざるを得ないという確信に変わりました。 実は、今までは、「三流」さんのところでも出ていますが、タグとIDをリストに取って、そこから、ひとつずつ当たるという方法をとっていました。自分の開発でも掲示板の回答でも、それほど多くなかったので、失敗したことがなかったのでした。 それで、IEに MS の IE Developer Tools アドオンをインストールして調べてみました。 分かっている人には、当たり前のことだと思うのですが、WebサイトのHTTLコードのサンプルサイトで、二種類の Input Type="File" があり、.Value値があっても、取れるものと取れないものの意味が分かりました。いつかは技術的に取れると思っていましたが、取れないものは、取れないのですね。 http://www.tohoho-web.com/html/input.htm こちらは取れません。取れるIDなどがみあたりません。 Type="File" の説明に、このように書かれていました。 「ブラウザからWWWサーバーにファイルをアップロードする際に用います。入力フィールドの横には参照ボタンが表示されます。WWWサーバー側にはファイルを受け取るための特別なCGIスクリプトなどを設置しておく必要があります。セキュリティのために、初期値を設定したり、スクリプトで値を操作することはできません。」 http://www.tagindex.com/html_tag/form/input_file.html こちらは、取れるはずです。 こうしてみると、自動化のために、改めて、USWC を使わざるを得ないのかなって思いました。なお、USWCのExcel用の操作は、Proバージョンだそうで、Excelの子ウィンドウへの取得しにくいそうですが、GETACTIVEOLEOBJで、COMオブジェクト名で取得すれば操作できると思いますし、Excelから、直接でなくても、Excel外用のクリップボードに渡す方法もありますし、テキストファイルなどにしてしまっても良いです。今は、組み立ては頭の中だけで、コードにするとまったく違う内容になるかもしれません。
その他の回答 (3)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 >これだとVBAなしで単独で作業ができるように思いましたが。 内容にもよりますが、それも可能ですね。(^^; >VBAの延長でUWSCを使うとした場合、あくまでメインはVBAとして、Cellの値をUWSCへパラメータで渡すとか?そういうのは可能でしょうか? 可能だと思います。UWSCとExcelの親和性は高いようです。Excelでの使い方も書かれていたと思います。 >UWSCだとダイレクトに file typeのinputに文字が入るってことでしょうか? それは出来ます。人間の手でPC上で出来ることは、ほとんど出来ます。ただ、手前勝手で恐縮ですが、私の個人としては勉強がてら、もう少し、この辺りを、本当に、出来ないのか、どうなのかを、実際に、VBAだけで挑戦してみたいですね。最近、また、少し、こういうところを新たに勉強し始めたからです。それで、今までのコードを一週間ぐらい掛けて全面的に書き換えました。 どちらかというと、当座の間に合わせにはなるのですが、UWSC側にも、コードで書くことが可能で、AppActivate やWin32APIで、Excel の外のIEに出た時点で、Shell で、UWSCに切り替えればよいかと考えました。(今は、構想だけです) VBAが書ける人なら、UWSCは、一時間程度で、コードの要領は覚えますから、キーボードマクロ以上の動きをさせることも可能です。なんと、一般的なWin32APIコマンドが搭載されていますから、長いコードを書く必要がありません。 しかし、単にキーボードマクロ程度だけなら、ExcelやIE のWindow の位置を決めれば(つまりWindowを最大にすれば)、そのまま、マウスの動きに合わせて定位置に対して動いていきます。コピー&ペーストも可能です。(素人っぽい方法ですが) >IEの新規窓が勝手に開いてしまう。三流さんのページの問題もクリアしていると思っていいのでしょうか? ページの問題というのは、何を指すかはよく分からなかったのですが、新規窓は、Shell.Application で、ヘッダ(LocationName)を取れば、IEオブジェクトが取得できますから、それで操作すればよいと思います。 '------------------------------------------- Set objShellWindows = CreateObject("Shell.Application").Windows() For Each w In objShellWindows If TypeName(w) = "IWebBrowser2" Then If w.LocationName = "XXX" Then 'ヘッダ名(左上隅のサイトの名称) Set objIE = w Exit For End If End If Next 'IEの操作(objIE) '------------------------------------------- それと、ここのカテゴリでは、「三流さん」の解決法が多いようですが、IEの場合は、三流さんのところでは、もう一杯一杯ではないでしょうか?Vista+IE7以上になると、どうしても、管理者権限でレジストリをいじらざるを得ないわけです。(Hatenaの質問でもそれが出ていました。)しかし、他の別の質問者では、そういうことは出来ないといわれてしまいましたが、そうするとIEオブジェクトでの処理そのものが、もうお手上げです。 実際のプログラミングでは、あまり、IEオブジェクト(オートメーション)という方法を取らないのかもしれません。たとえば、古いものになるとWinSockやWin32API、新しいところでは、WinHTTPもあります。それが良い悪いというよりも、プログラマとしては、IEのセキュリティを必要としているわけではないし、背に腹は変えられないのだと思うのです。 今、こちらも、同じようなことを試みているもので、つい長くなってしまいました。
お礼
こんばんは、お世話になります。 窓が開く件はもう一度探して取ればよかったんですね。 忘れていました。 データ取得に関しては今まではwebbrowserでやってまし たが最近、MSXML、MSHTMLに変えたところでした。 WinHTTPというのは知りませんでしたが、探ってみます。 とりあえず、UWSCの解説書を注文してしまいました。(笑) VBのようなIDE環境があるんですね。びっくりしました。 好きなれそうな感じです。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 >INPUT type=file の時はダイレクトで入らないみたいです。 失礼しました。それは、別の問題のようです。 ↓以下のサイトで、未解決問題として、Vista のセキュリティで、 http://www.ken3.org/cgi-bin/group/vba_ie.asp 「三流君VBAでIE操作」 「画像を自動でアップしたいので INPUTタグTYPE FILEにファイル名を入れたい。 これも、セキュリティを突破できてません。」 と書かれていました。こちらでは、XP+IE7ですので分かりませんでした。 IEのセキュリティを、VBAでいじってしまう方法などいくつかあるかと思います。 http://support.microsoft.com/kb/884429/ja Internet Explorer の Web コンテンツのゾーンでセキュリティレベルを設定する方法 私は、VBAで、Webスクレイブはしますが、ついにIEオートメーションはURLをオープンするときだけで、それ以外はやめることにしました。IEオートメーションは、ともとも、アドオンが多すぎて問題が発生するからです。 SendKeys ではうまく行かないのは想像はつくのですが、たとえば、VBAから、UWSCを使ってキーボードマクロで入れる方法もあるかと思います。
お礼
ありがとうございます。 http://www.ken3.org/cgi-bin/group/vba_ie.asp で、IE7の問題はクリアできたのですが、三流さんの Form内にIEを配置する方法だとsendkeysで指定場所 に値が入らないんです。 UWSCだとダイレクトに file typeのinputに文字が入る ってことでしょうか?一度、見せていただきます。
補足
UWSCを入れてみました。 これだとVBAなしで単独で作業ができるように思いましたが。 VBAの延長でUWSCを使うとした場合、あくまでメインはVBA として、Cellの値をUWSCへパラメータで渡すとか?そうい うのは可能でしょうか? また、IEの新規窓が勝手に開いてしまう。三流さんのページ の問題もクリアしていると思っていいのでしょうか?
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 リンク先の回答では、確実にポジションが取れていないので、不安定になってしまいます。 Set objIE = CreateObject("InternetExplorer.Application") で、アクセスしたら、 ソースから、InputBox のIDの xxx を探して、そこに代入すればよいです。 例 「<input name="IMT" type="text" value="" class="textArea" id="xxx" size="45" maxlength="45">」 objIE.Document.getElementById("xxx").Value = ActiveSheet.Cells(1, 1).Value のようにすればよいです。
補足
ご回答ありがとうございます。 通常、そのコードでいけると思うのですが、 INPUT type=file の 時はダイレクトで入らないみたいです。 それで参照ページではsendkeysを使っているのだと思います。 理想はダイレクトなんですが、どちらでもいいので確実に入れられ ないか考えています。
お礼
ありがとうございます。 何となく方向が見えてきた気がします。 実際取りかかってまた、いろいろと問題 が出てくると思いますが、そのときは よろしくお願いいたします。