• ベストアンサー

INPUT type=file で出るダイアログに入力で窓を確実に取得したい。

http://oshiete1.goo.ne.jp/qa4624451.html でダイアログボックスへの文字列の挿入を実現して います。 sendkeysのターゲットを確実に取得したいのですが どうすればいいでしょうか? 時々、違う窓にsendkeysしてしまいます。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.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外用のクリップボードに渡す方法もありますし、テキストファイルなどにしてしまっても良いです。今は、組み立ては頭の中だけで、コードにするとまったく違う内容になるかもしれません。

ap_ex_mem
質問者

お礼

ありがとうございます。 何となく方向が見えてきた気がします。 実際取りかかってまた、いろいろと問題 が出てくると思いますが、そのときは よろしくお願いいたします。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんばんは。 >これだと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のセキュリティを必要としているわけではないし、背に腹は変えられないのだと思うのです。 今、こちらも、同じようなことを試みているもので、つい長くなってしまいました。

ap_ex_mem
質問者

お礼

こんばんは、お世話になります。 窓が開く件はもう一度探して取ればよかったんですね。 忘れていました。 データ取得に関しては今まではwebbrowserでやってまし たが最近、MSXML、MSHTMLに変えたところでした。 WinHTTPというのは知りませんでしたが、探ってみます。 とりあえず、UWSCの解説書を注文してしまいました。(笑) VBのようなIDE環境があるんですね。びっくりしました。 好きなれそうな感じです。

全文を見る
すると、全ての回答が全文表示されます。
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんにちは。 >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を使ってキーボードマクロで入れる方法もあるかと思います。

ap_ex_mem
質問者

お礼

ありがとうございます。 ​http://www.ken3.org/cgi-bin/group/vba_ie.asp で、IE7の問題はクリアできたのですが、三流さんの Form内にIEを配置する方法だとsendkeysで指定場所 に値が入らないんです。 UWSCだとダイレクトに file typeのinputに文字が入る ってことでしょうか?一度、見せていただきます。

ap_ex_mem
質問者

補足

UWSCを入れてみました。 これだとVBAなしで単独で作業ができるように思いましたが。 VBAの延長でUWSCを使うとした場合、あくまでメインはVBA として、Cellの値をUWSCへパラメータで渡すとか?そうい うのは可能でしょうか? また、IEの新規窓が勝手に開いてしまう。三流さんのページ の問題もクリアしていると思っていいのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんにちは。 リンク先の回答では、確実にポジションが取れていないので、不安定になってしまいます。 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 のようにすればよいです。

ap_ex_mem
質問者

補足

ご回答ありがとうございます。 通常、そのコードでいけると思うのですが、 INPUT type=file の 時はダイレクトで入らないみたいです。 それで参照ページではsendkeysを使っているのだと思います。 理想はダイレクトなんですが、どちらでもいいので確実に入れられ ないか考えています。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ExcelVBA/ダイアログボックスで選んだファイルのファイル名を取得したい

    ExcelのVBAについて教えてください。 「ファイルを開く」の時に出てくるようなダイアログボックスを表示させ、そこで選択したファイルのフルパス+ファイル名を文字列形式で取得したいのですが、どのようにしたら良いでしょうか? 自分でヘルプファイルもある程度調べてみたのですが、よく分かりませんでした。 最終的には、ワークシート上に画像ファイルを挿入し、その作成日付をセルに表示するようなものを作りたいのですが、 Application.Dialogs(xlDialogInsertPicture).Show では、画像は挿入されるものの、挿入した画像のファイル名を取得できないので、日付が調べられないのです。 宜しくお願いします。

  • ダイアログのボタンラベル取得

    こんにちは。 C#(VS2008 .NET3.5)にてアプリケーションの開発を行っているのですが 標準ダイアログ(メッセージボックス)の背景や文字サイズ等を変更したいがために 独自でメッセージダイアログを作成することになりました。 そこで、マルチ言語にも対応したいので 出来ればカルチャに依存したボタンのラベル名(日本語なら、はい(&Y)、いいえ(&N)など)を取得したいのですが どこから取得できるのでしょうか? 何か知っている方がいましたらご教授ください。

  • 子ダイアログのデータを親ダイアログで取得するには

    VC6.0にてMFCでダイアログベースアプリケーションを作成しています。 親ダイアログ(TestDlg.cpp)のメニューを選択すると、子ダイアログ(SetDlg.cpp)が開き、テキストボックスに文字を入力し、ボタン押下によりテキストボックスの入力数字を確定(グローバル変数(igStatu)に代入)しています。 子ウインドウで入力確定したデータを、親ダイアログにて使用したいのですが、データが受け渡されずに、親ダイアログ側にデータが入りません。 どのようにしたら、子ダイアログで設定したデータを親ダイアログで取得することができるのでしょうか? C++、MFCともに全然わかっていませんがお願いします。 グローバル変数は、TestDlg.cpp、SetDlg.cppがインクルードしているTest.h内にstatic宣言しています。 static宣言しないとリンクエラー2005になってしまいます。

  • BackSpaceしたい(QNo.2734284のやつ)

    http://oshiete1.goo.ne.jp/qa2734284.html を見たのですが、よく、分かりません。 簡単な電卓を作っていて、 テキストボックス内で、「backspace」ボタンを押すと、 文字が後ろから、一個ずつ、減っていくようにしたい。 javascriptどういう数式を書けば、 文字数を一個減らした文字列を代入できるのか、分かりません。 方法を教えてください。

  • input type="file"のmaxlengthについて

    こんにちは <input type="file">について、以下の点お教えください。 ソースで<input type="file" name="test" maxlength="10"> とした場合に、コピー&ペーストでは、例えば20byte文字列を貼り付けると10byteまでしかボックスには反映されないのですが、 その後直接手入力ができます。 また、ボタンからダイアログを起動してパスを指定した場合も、maxlength以上の桁数がセットされます。 ソースの書き方が悪いのでしょうか? それとも手入力文字数やダイアログからの桁数の制限をかけられないという仕様(HTML?IE?)なのでしょうか? また、ダイアログからパスを指定した場合、このパスが255byte以上(254byteはOK)だと、 パス内容がボックスに反映されないのですが、 これもまた仕様なのでしょうか? (ファイル名の最長桁数が256byteだと思うと問題があるような気がするのですけども) ※私のマシンはWinXPでIE6のSP2を使用しています。 以上の点について、何か情報をお持ちの方は回答お願いします!!

    • ベストアンサー
    • HTML
  • ブラウザなどで入力された文字列を取得する方法

    ブラウザやワードのようなアプリケーションで入力された文字列(特に漢字)をプログラムで取得する方法を探しています。 プログラム内で用意したテキストボックスに入力された文字列を取得するサンプルコードはそこかしこで見かけるのですが、 他のアプリケーションで入力した文字列を取得するような方法がどうしてもわかりません 文字列を取得するImeAPIの中のImmGetCompositionStringの存在や アクティブウインドウのハンドルを取得するGetActiveWindowの存在は知っているのですが この2つを組み合わせて出来るものなのでしょうか? ほかにも「フック」を使うという方法も考えましたがIMEで入力が確定した文字列を 「フック」してくることは可能なのでしょうか? 「これなら取得できる」といった良い方法があれば教えていただきたいです。 長文になりましたがなにとぞよろしくお願いいたします。 開発環境:windows7 64bit 開発言語:できればC言語 ↓テキストボックスに入力された文字列を取得するサンプルコード↓ http://shinshu.fm/MHz/95.83/archives/0000025041.html#comments http://www.atmarkit.co.jp/fdotnet/dotnettips/875imeyomi/imeyomi.html ↓IME APIの関数リスト↓ http://msdn.microsoft.com/ja-jp/library/cc422019.aspx

  • このサイトのある質問を開くと、ユーザー名とパスワード入力を要求される

    この質問ページ http://oshiete1.goo.ne.jp/qa4087370.html を開くと、 『wedding.xwb901.goo.ne.jp に接続』 というダイアログBOXが表示されます。 「wedding testing」と表示されており、ユーザー名とパスワードの入力を要求されます。 これは、何なのでしょうか? 私だけ?

  • 「ファイルとフォルダを検索」で入力した文字の履歴削除

    「スタート」→「検索」→「ファイルやフォルダ」を選択し、画面の左側で 「ファイルまたはフォルダの名前」と「含まれる文字列」のボックスに入力した文字の履歴はどうすれば消せますか? ボックス内にカーソルをおいてダブルクリックしても何も表示されませんが、たとえば「goo」と入力して検索実行後、再びボックス内に「g」と入力すると「goo」と候補が出てきてしまいます。これを消したいのですが。可能ですか?

  • 子ウィンドウの操作について(VC++)

    Windows98 Visual C++6.0 雛型でMDIを作成して、アクティブな子ウィンドウに記述されている文字列を操作したいと思っています。 ダイアログボックスを表示して、その中のボタンを押したら、アクティブな子ウィンドウから文字列を取得しある処理した結果をダイアログボックスのtextに表示したいと考えています。 今のところダイアログボックスを表示する所まで出来ています。 問題点は 1.アクティブな子ウィンドウのハンドルはどのようすれば取得できるのでしょうか? 使用すべき関数名等を教えてください。 2.アクティブな子ウィンドウに記述されているデータを取得するには、GetWindowTextやsendMessageで出来るのでしょうか?(なるべくならSJISで処理をしたいと考えているのですが。) わかりずらい質問かも知れませんが宜しくお願いします。

  • Word2010のファイル検索

    Word文書の中からある文字列を含むファイルを検索するのに, Word2003では「開く」のダイアログの右上の「ツール」→「検索」とたどると 「ファイル検索」のダイアログが開き, ターゲットの文字列と探す場所を細かく指定して目的の文書を絞り込めたんですが Word2010では「開く」のダイアログの「ツール」には「検索」がなくなっており, 右上の検索の窓にターゲットの文字列を入れると, まず「検索条件に一致する項目はありません」と出て, その下の「次の範囲内を再検索」の「カスタム」で対象とするフォルダを指定しても Word2003で同じフォルダを検索するといっぱいヒットするのに Word2010ではよくて1つ,2つ,しかもファイル名のみ検索しているような感じです。 結構頻繁に使っていたので非常に困っています。 Word2003のように検索するにはどのようにすればいいのでしょうか。 よろしくお願いいたします。 Word2010があまりにもがらりと変わっていて,かなり戸惑っています(>o<)

ファクスの受信について
このQ&Aのポイント
  • iPhoneでFAXの受信ができない場合の対処方法は?
  • MFC-J738DNのファクス設定とiPhoneへの転送設定について
  • ひかり回線を使用している場合のMFC-J738DNのファクス受信トラブルについて
回答を見る

専門家に質問してみよう