VBAから即時関数を実行できますか
未読分:10件
昨日以降(0) 2日前以降(0) 3日前以降(0) 4日前以降(0) 5日前以降(0)
近田 伸矢, 植木 悠二, 上田 寛
IEのデータ収集&自動操作のプログラミング本はこの1冊だけ!IEの起動やポップアップウィンドウ、表示を制御する基本的なコードはもちろん、テキストボックスやラジオボタン、表、ハイパーリンクなどのHTML部品を制御する方法など、自動操作に欠かせないノウハウを丁寧に解説。
Message#10 2017年5月25日(木)14時14分 From: 太郎 | 返事 削除 変更 |
自分も困っていて解決したので残しておきます IE11ではこのやり方になるそうです。 https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13155784783?__ysp=dmJhIGluaXRFdmVudA%3D%3D Set ev=ie.document.createEvent("HTMLEvents") ev.initEvent "change", True, True tag.dispatchEvent(ev) |
Message#9 2016年10月21日(金)11時56分 From: moku | 返事 削除 変更 |
ジャッカルのメッセージ(#8)への返事 > javascript処理完了前に次の処理へ移行しているのかもしれないね。 > 一応Application.Wait入れて調整しているようだからもうちょっと時間を入れるとか、 > 取得できなかったら「Goto」でその部分の最初からやり直すとかいれるといいかも。 ありがとうございます。 もう少し試行錯誤してみます。 うまくいったらご報告します。 > > あきらめてWebアプリ側に機能追加をしてもらえないか聞いてみることにします。 > > 実はすでに一回聞いてみたのですが、一蹴されてしまいました(泣)。 > > だめもとで挑戦したことに敬意! お褒めに預かり恐縮です。 孤軍奮闘中なのでうっかり涙ぐんだことは秘密です。 Webアプリ側に追加してほしい機能はほんのちょっとしたことなので、 こちらも頑張ってみます。 |
Message#8 2016年10月20日(木)17時42分 From: ジャッカル | 返事 削除 変更 |
javascript処理完了前に次の処理へ移行しているのかもしれないね。 一応Application.Wait入れて調整しているようだからもうちょっと時間を入れるとか、 取得できなかったら「Goto」でその部分の最初からやり直すとかいれるといいかも。 > あきらめてWebアプリ側に機能追加をしてもらえないか聞いてみることにします。 > 実はすでに一回聞いてみたのですが、一蹴されてしまいました(泣)。 だめもとで挑戦したことに敬意! > ジャッカルのメッセージ(#6)への返事 > > > もう試してるかもしれないけど > > > > objIE.document.getElementById("items2_Setting").FireEvent ("change") > > > > とか、選択してからフォーカスさせるとかでもだめ? > > > > > > sendkeyを使いたくない理由がnumロックのオフになることならオンにする処理をいれるとか。 > > ジャッカルさん、回答ありがとうございます。 > > sendkeyを使いたくない理由は原因不明で止まってしまうからなのです。 > 問題のサイトは何個も絞込み条件を入れていくというものでして、 > しかも同じことを何百回も繰り返したいのです。 > どうしても途中で動かなくなってしまいます。 > > あきらめてWebアプリ側に機能追加をしてもらえないか聞いてみることにします。 > 実はすでに一回聞いてみたのですが、一蹴されてしまいました(泣)。 |
Message#7 2016年10月20日(木)09時22分 From: moku | 返事 削除 変更 |
ジャッカルのメッセージ(#6)への返事 > もう試してるかもしれないけど > > objIE.document.getElementById("items2_Setting").FireEvent ("change") > > とか、選択してからフォーカスさせるとかでもだめ? > > > sendkeyを使いたくない理由がnumロックのオフになることならオンにする処理をいれるとか。 ジャッカルさん、回答ありがとうございます。 sendkeyを使いたくない理由は原因不明で止まってしまうからなのです。 問題のサイトは何個も絞込み条件を入れていくというものでして、 しかも同じことを何百回も繰り返したいのです。 どうしても途中で動かなくなってしまいます。 あきらめてWebアプリ側に機能追加をしてもらえないか聞いてみることにします。 実はすでに一回聞いてみたのですが、一蹴されてしまいました(泣)。 |
Message#6 2016年10月19日(水)18時12分 From: ジャッカル | 返事 削除 変更 |
もう試してるかもしれないけど objIE.document.getElementById("items2_Setting").FireEvent ("change") とか、選択してからフォーカスさせるとかでもだめ? sendkeyを使いたくない理由がnumロックのオフになることならオンにする処理をいれるとか。 > ジャッカルのメッセージ(#4)への返事 > > > 単純にFocusやacitve、activateあたりを間に入れても処理されない? > > > > > > > できればSendkeyを使いたくないので、他の方法はないでしょうか。 > > ジャッカルさん、回答ありがとうございます。 > > objIE.document.getElementById("items2_Setting").Activeと > objIE.document.getElementById("items2_Setting").Activateを実行すると、 > 「オブジェクトは、このプロパティまたはメソッドをサポートしていません。」のエラーになりました。 > > objIE.document.getElementById("items2_Setting").Focusを実行するとエラーにはなりませんが、 > 事態は変わらないです(イベントは発生せず、隣のリストボックスに変化なし)。 > > せっかく教えていただいたのに・・・。 > > > > なお、よく見たら私の最初の質問文の間違いがありました。 > > ×リストボックス(id=items2_text) > ○リストボックス(id=items2_Setting) |
Message#5 2016年10月19日(水)09時51分 From: moku | 返事 削除 変更 |
ジャッカルのメッセージ(#4)への返事 > 単純にFocusやacitve、activateあたりを間に入れても処理されない? > > > > できればSendkeyを使いたくないので、他の方法はないでしょうか。 ジャッカルさん、回答ありがとうございます。 objIE.document.getElementById("items2_Setting").Activeと objIE.document.getElementById("items2_Setting").Activateを実行すると、 「オブジェクトは、このプロパティまたはメソッドをサポートしていません。」のエラーになりました。 objIE.document.getElementById("items2_Setting").Focusを実行するとエラーにはなりませんが、 事態は変わらないです(イベントは発生せず、隣のリストボックスに変化なし)。 せっかく教えていただいたのに・・・。 なお、よく見たら私の最初の質問文の間違いがありました。 ×リストボックス(id=items2_text) ○リストボックス(id=items2_Setting) |
Message#4 2016年10月18日(火)17時07分 From: ジャッカル | 返事 削除 変更 |
単純にFocusやacitve、activateあたりを間に入れても処理されない? > できればSendkeyを使いたくないので、他の方法はないでしょうか。 |
Message#3 2016年10月17日(月)14時57分 From: moku | 返事 削除 変更 |
できればSendkeyを使いたくないので、他の方法はないでしょうか。 |
Message#2 2016年10月17日(月)11時23分 From: moku | 返事 削除 変更 |
まだ即時関数を実行する方法は分かりませんが、 WSオブジェクトのSendKeysメソッドを使って イベントを起こすことができました。 SendKeysはあまり使いたくないですが。 ちなみにVBAのSendKeysステートメントでは うまくいきませんでした。 理由はわかりません。 Dim wobj As Object Dim WSオブジェクト As Object Set WSオブジェクト = CreateObject("WScript.Shell") Set wobj = IE.document.getElementById("items2_Setting") 'items2_Settingにフォーカスを移す wobj.Focus Application.Wait Now + TimeValue("00:00:01") WSオブジェクト.SendKeys (" ") 'スペースキーを送る Application.Wait Now + TimeValue("00:00:01") WSオブジェクト.SendKeys ("{DOWN}") '↓キーを送る Application.Wait Now + TimeValue("00:00:01") |
Message#1 2016年10月13日(木)10時24分 From: moku | 返事 削除 変更 |
いつも楽しく勉強させていただいております。 環境はWin7でIEは11、Officeは365です。 HTMLやJavaScriptはほとんど書いたことがないので、適切でない表現がありましたらお許しください。 あるリストボックス(id=items2_text)に値を設定した後でイベントを起こしたいのですが、うまく行きません。 items2_textが変更になるとその隣のリストボックスの選択肢が変わる仕様です。 この手の仕様ですとリストボックスにonchangeイベントが書いてあって関数名が記述してあるケースが多いと思います。 その場合はobjIE.document.getElementById("items2_Setting").FireEvent ("onchange")としたり、 objIE.navigate "JavaScript:XXXX()"のように直接関数名を指定したりしてきました。 ところがこのリストボックス(id=items2_text)にはその記述がないのです!! ソース全体を見てみるとこんな記述がありました。 $(function(){ $("#items1_Setting,#items2_Setting,#items3_Setting,#items4_Setting,#items5_Setting").change(function(){ 省略 }); }); 検索してみたのですが、これはおそらく即時関数という関数だと思います。 items2_Settingその他のリストボックスの値が変更になったらこれが実行されるのだろうと想像します。 即時関数や無名関数以外の名前のある関数なら、VBAからは関数名を指定して実行できますが、 即時関数の場合はどのように呼び出せばよいのでしょうか。 もしくは「VBAから即時関数は呼び出せない」のでしょうか。 |
昨日以降 2日前以降 3日前以降 4日前以降 5日前以降