• 締切済み

VBAでjavascriptを操作

カテゴリが違っていたら申し訳ありません。 VBAでIEを制御する際、色々調べているとjavascriptを使うシーンが たびたび出てくるのですが、あれはIEで読み込んだページ内にあるものを使っているのですか? それともIEの中に基本的な関数やメソッドが入っていて それも含め呼び出して使っているのでしょうか。 HTMLのソースを見てjavascriptのソースが分かるものについては、 それをVBAを使って動かすことはできるのは理解しています。 ページ内に存在しない基本的なjavascriptのコードは vbaだけで呼び出せたりするのですか? たとえば下記のページのOKボタンをクリックする場合、 http://kamicha1.web.fc2.com/Excel/Test20090726.html 下記のコードをVBEに記載しました。 このclick()はjavascriptの関数(メソッド?)なのでしょうか。 HTMLをclick()で検索しても該当はありませんでした。 ie.document.Script.setTimeout "javascript:document.getElementById('popOK').click()", 200 分かりにくい文章で申し訳ないのですが、 上記のコードはIDの部分を変えてればどんなページにも使えるものなのでしょうか。 恐れ入りますが、ご教示お願いします。

みんなの回答

  • kumatti1
  • ベストアンサー率60% (73/121)
回答No.3

>下記はjavascriptに制御を渡しているということなのでしょうか。 IEのJavaScriptエンジン( Chakra )で実行されるって事なのでは。 http://msdn.microsoft.com/en-us/library/aa752642%28v=vs.85%29.aspx ちなみに JavaScript での配列の添字は、()ではなくて、[]で指定します。 (getElementsByClassNameからgetElementByIdに変更されたのはその辺が理由かなと)

回答No.2

>それをVBAを使って動かすことはできるのは理解しています。 と、いいはってもね。結局理解してないってことだと思いますよ。 IEのインスタンスを作成して、IEのオブジェクトを操作しているってことを理解していないですよね。 IEのオブジェクトおよびHTMLオブジェクト、JavaScriptのオブジェクトのツリー構造は理解していますでしょうか? 見た事無い??? で、あれば、リファレンスサイトをちゃんと0から見るか、本屋いって、サル本を買って読んでください。 IEにロードされた、HTML文書は、IEのオブジェクトのツリー構造の配下にあります。当然、そこにJavaScriptオブジェクトのツリー構造もあります。なので、IEのインスタンスを作成したってことは、IEオブジェクトをドットで区切って、HTML, CSS, JavaScript オブジェクト、メソッド、プロパティーを操作する事になります。 その下には、VBAのオブジェクトも、メソッドも、プロパティーも在りません。 ただし、new 演算子等、 VBAのオブジェクトの下に他のオブジェクトのインスタンスを割り当てると、いかにも、VBAの関数が使えそうな、気になりますが、気になるだけで、使えません。その配下は、他のオブジェクトのツリー構造になっています。 上記で >その場合、javascriptのコンパイルをしているのはブラウザでしょうか? >それともWEBサーバー側でしょうか。 この、あほな質問の回答になっているかと思いますよ。サーバーサイトスクリプトで動作しているなら、ともかく、クライアントのブラウザにロードされたら、そのクライアントのオブジェクトの配下であって、サーバーオブジェクトにはなりません。そのようなやり方もありますが、内容的に、それらのサーバーサイドスクリプトの質問ではないですよね。

  • kumatti1
  • ベストアンサー率60% (73/121)
回答No.1

>このclick()はjavascriptの関数(メソッド?)なのでしょうか。 clickメソッドは、(getElementByIdメソッドが返す)IHTMLElementオブジェクトのメンバですね。 http://msdn.microsoft.com/en-us/library/aa752277%28v=vs.85%29.aspx >上記のコードはIDの部分を変えてればどんな getElementByIdに限らず、getElementsByTagNameやgetElementsByClassNameでも大丈夫なのでは。

momomo100
質問者

補足

さっそくの返答ありがとうございます。 ie.document.getElementById('popOK').click 申し訳ありませんが、上記との違いがよく分かりません。 上記がVBAで制御していて、下記はjavascriptに制御を渡しているということなのでしょうか。 その場合、javascriptのコンパイルをしているのはブラウザでしょうか? それともWEBサーバー側でしょうか。 ie.document.Script.setTimeout "javascript:document.getElementById('popOK').click()", 200

関連するQ&A

  • VBAからjavascriptに値を渡す

    VBAでIEを操作しております。 一部javascriptを使って以下のようなコードで、リンクをクリックしています。 ie.document.Script.setTimeout "javascript:document.getElementById(""ID"").click()}", 10 getElementById(""ID"")のID部分を変数にしたいのですが、 Dim ID as String ID=○○ ie.document.Script.setTimeout "javascript:document.getElementById(○○).click()}", 10 としてもうまく動きません。 javascriptの中身をfunctionにして、引数に○○を持っていっても動きませんでした。 どうすれば引数を渡すことができますか。 jscriptを使えばできそうな気がしたのですが、 js.CodeObject.関数名(引数)で渡せる引数が1つだけ?のようで こちらも頓挫しております。どうかご教示お願いします。

  • JscriptでsetTimeout

    JscriptでIEを操作してあるページのリンクをクリックしたいです。 リンクにjavascriptが入っているため同期処理でクリックすると、 その先に進みません。 そのため非同期処理でクリックしたく、setTimeoutを使って 関数を作りましたが動きません。 setTimeout('function ck(ie,ID){ ie.document.querySelector(ID).click();}',10); ※ieはIEオブジェクト、iDはリンクのID属性です。 ちなみに上記をVBAから呼び出して動かしています。 setTimeoutをはずせば普通に動きました。 setTimeoutはwindowオブジェクトが必要なので、 それを省略しているのが悪いとも考えましたが、 VBAでどうやってIEのwindowオブジェクトを作るのかが分かりません。 setTimeout以外にも非同期実行できる方法があれば それでも構いません。 どうかご教授お願いいたします。

  • VBAでリンクを踏みたい

    とあるサイトにログインした後に、「このページを印刷する」というリンクをVBAでクリックしたいのですが ソースは <div class="section sideinfo"> <a href="#" class="print" onClick="JavaScript:openPrintWindow('CG017_001', 'CG018'); return false;">このページを印刷する</a> </div> こうなっています。 VBAコードで objIE.Document.all.Item("JavaScript:openPrintWindow('CG017_001', 'CG018')").Click をすると、「オブジェクト変数または With ブロック変数が設定されていません。」になります。 For i = 0 To objIE.Document.Links.Length - 1 'Debug.Print objIE.Document.Links(i).innerHTML If objIE.Document.Links(i).innerHTML = "このページを印刷する" Then objIE.Document.Links(i).Click Exit For End If Next i これで踏むことはできるのですが、 ソースから文字を探してそれをVBAコードにあてて踏むことはできないのでしょうか?

  • JavaScriptからVBAの関数を呼び出し

    Accessのフォームに 、WebBrowserコントロールを貼り付けて、 JavaScript が記述されている、HTML を表示させているのですが、 その HTML内の JavaScriptから、Access VBAの関数を呼び出したり、 イベントを発生させることは、可能でしょうか? 以上、宜しくお願い致します。

  • VBAでWebページのボタン操作ができない

    IEの操作を自動化するVBAを作っています。 色んなサイトでログイン、ログアウト、・・・など様々なボタンがあるかと思いますが、 VBAからボタン操作ができずに困っています。 例えば、gooメールのログイン画面にログインボタンがあり、ソースは <INPUT value=ログイン type=submit> です。 これに対し、VBAで以下の記述をしました。  For Each objContents In IE.document.getElementsByTagName("INPUT")   If objContents.Value = "ログイン" Then     objContents.Click '←※1     objContents.submit '←※1     Exit For   End If  Next  'ボタンは2番目のフォームの3番目の要素  IE.document.forms(1).submit '←※1  IE.document.forms(1).getElementsByTagName("input")(2).Click '←※1 しかしながら、※1の操作に何の反応もありません(ページが切りわらない) ただ、セットしていたIDとパスワードが消えました。・・・ここに何かヒントがある?? 自分はVBA以外は知識があまり無く、HTMLソースも見てみましたが、よく分かりませんでした。 まずはClickもSubmitも効かない理由が知りたいです。 (上記は一例にすぎず、色んな場面(色んなサイト)でこういった現象に遭遇するので、今後の勉強のためにも。) そしてもし上記ケースの対処法が分かる方がいらっしゃればご教示いただければ幸いです。 よろしくお願いいたします。

  • VBAでのFlashページ操作

    VBAでのFlashページ操作 はじめまして。教えてください。 VBAでIEを起動させてあるページを表示させるところまでは、 できたのですが、 そのページ内にあるFlash動画をクリック方法がわかりません。 (ちなみにそのFlushページにあるリンク先は1つのみです。) 使用している環境は、 Excle2003とIE7になります。 HTMLで書かれているリンク先へのクリックすることはできました。 よろしくお願いします。

  • VBAでIEを操作 画面遷移について

    HTMLに詳しくないのでわかり難く申し訳ありませんが、 メニューが左側に並んでいて、メニューをクリックすると右側に内容が展開されるようなページを操作しようとしています。 展開された内容(テキスト)を取得する操作ができません。 展開前と展開後ではソースの内容は変わっているのですが、なぜが展開まえのソースを操作しているようです。 VBAは展開後のソースを認識していないようです。 手順は、IEを起動→webを開く→待機→リンクをクリック→待機→テキスト取得  という概要で行いました。 画面全体が変わる(ページ移動)の場合は同じ手順で成功したのですが、この場合の操作がわかりません。 アドバイスをお願いします。

  • VBAからieが発行するmsgboxを操作

    EXCEL2007のvbaを使用してieを操作してます。 あるie画面を自動的に閉じる際、ie画面の「戻る」を自動クリックするとMsgboxが表示され「ok」「キャンセル」を要求されとまります。 自動的に「ok」を押して画面を閉じたいのですが・・・・・ どうすればよいのでしょうか? <ieソース> <TD nowrap align="right" height="20" CLASS="NAVBAR" width="224"><INPUT type=image src="/Suite/AAA/BBB/CCC/Returnja_JP.gif" alt="戻る" name="btnReturn1" id="btnReturn1" height="15" onclick="javascript:returnConfirm();" border="0" haht-alt-type="NLS" width="34"></TD> </TR> <VBA> IE.Script.setTimeout "javascript:returnConfirm();" ,200 Sleep 5000 SendKeys "{ENTER}" msgboxは表示されたまま、「ENTER」が押されず次の処理に進む よろしくお願いいたします。

  • VBAでのIE操作・HTML操作について

    VBAを独学で学んでいる者です。IEを操作させたく、学んでいます。 色々と検索などをしていましたが行き詰ってしまいました。 どうぞご助力願います。 学び始めて1週間程度ですので、うまく説明できないかもしれませんがご容赦ください。 VBAでIEを操作し、特定のURLを表示。←これは大丈夫です 表示されたウェブサイトのHTML内の特定の文字列(リンク)と、 アクティブなセル内のテキストが合致したリンクをクリックする、 ・・・といったマクロは書けるものでしょうか? <INPUT TYPE="submit" NAME="btn01" VALUE="ログイン"> 上記のようなHTMLソースですと「NAME="btn01"」を探せば、「objIE.document.all.btn01.Click」というものでできるかと思いますが、 動的に変化するウェブサイトの文字列と、あらかじめ用意していたセル内の文字列が合致した時にだけクリックするような方法を求めています。 例えば ・夏にしか出現しないウェブサイトコンテンツ「水着」。 ・エクセルのシートC2に「水着」。 ・IE起動。サイト内に「水着」という文字列があり、セルと合致するので「水着(リンク)」の箇所をクリック。 ・・・といった感じなのですが・・・。やはり難しいでしょうか・・・。 「水着」といった単語ではなく、もっと複雑な文字列を扱う予定です。 稚拙な表現ですみません。 皆様、どうぞ宜しくお願いいたします。

  • IE操作 ソース内のjavascriptを表示後、

    VBAでIE操作をしているのですが、 javascriptのURLを踏んだ後に、そのページをオブジェクトに格納して値の取得等をしたいのですが、 うまくいきません。 For Each myObj In objIE.document.all.tags("a") If myObj.href Like "*affiliateUrl1*" Then objIE.navigate myObj.href ' Call IE_wait Exit For End If Next 上記のコードで、 javascript:show_rakuten_linkcd('linkUrl1','imageUrl_S1','imageUrl_M1','title1','price1','reviewCount1','affiliateUrl1'); を見つけて、objIE.navigate myObj.href で、ページを表示することは出来たのですが、 Call IE_wait で Sub IE_wait() Const READYSTATE_COMPLETE As Long = 4 Do Until objIE.readyState = READYSTATE_COMPLETE Loop Do While objIE.Busy = True DoEvents Loop End Sub をすると、無限ループに入ります。 javascriptでページを表示させても、 objIEに格納されているURLは、javascriptを踏む前の元のページだからと思います。 なので、表示されるまで待つのは手動でやるとしたのですが、 その後、 For Each myObj In objIE.document.all.tags("testarea") If myObj.Name = "code" Then      ’ソース取得 End If Next とやろうとしても、objIEに格納されているURLがjavascriptで表示させているページでない為、 取得できません。 objIE.navigate myObj.href を実行した後に、javascriptのページ(小窓)を格納する方法があれば教えてください。 よろしくお願いします。