VBAからWEB操作についての質問

このQ&Aのポイント
  • VBAからWEB操作についての質問です。具体的には、JavaScriptを使って他社が作ったWEBページのテキストボックスやオプションボタンを操作する方法についてわからない部分があります。
  • VBAを独学してきたが、WEB操作については進め方がわからず困っています。WEBページのソースを確認し、テキストボックスの名前を調べたりデバッグしたりすることはできるが、より効率的な方法があれば教えていただきたいと思っています。
  • 現在、VBAでWEB操作をしており、JavaScriptの勉強を開始しました。しかし、getelementsbytagnameの挙動についてわからない部分があります。特に、typeやnameの取得方法について知りたいです。また、VBAからのWEB操作について情報を得る方法が限られているため、幅広い回答をいただけると助かります。
回答を見る
  • ベストアンサー

VBAからWEB操作

わかりにくい質問でしたらすみません。 VBAからWEB操作ができることを最近知り、 VBAで操作できる範囲のことから JavaScriptの勉強を始めています。 JavaScriptを使って他社が作ったWEBページの テキストボックスに文字を入れたり オプションボタンをチェックしたり するように作っています。 VBAの記述では以下のように使っています。 For Each obj inobjie.document.getelementsbytagname("input") if obj.type="radio" and obj.value="2" then obj.checked=true endif next ホームページからもらった記述を自分の環境に合わせたものなのですが getelementsbytagnameに"input"を入れると typeが取れるという感覚がなくて Nameが取れたりもしますし、何をどこまで取れるのかわからないのです。 "option"を入れたら 何が取れているんだろう?など… "a"だと、<a></a>の中身が取れているんだな…くらいまではなんとなくわかりました。 WEBページのソースを確認して、 テキストボックスの名前を調べたりしていますが Nameが設定されていなかったりもしますし そのときは、デバックでobjをウォッチしてひとつひとつ見たりしてるんですが こんな方法しかないのかなぁ?と思っています。 VBAを独学していたときは、勉強できるホームページがたくさんあったりしましたが VBAからのWEB操作については 独学ではこんな感じで進めるしかないのでしょうか 幅広い回答いただけるとうれしいです。 ※JavaScriptのほうにも、同じ趣旨の質問を書かせていただきました

noname#201721
noname#201721

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

  • ベストアンサー
  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.2

#ひけらかすほどの知識もありませんが、思いつくままに書きましたら、案外、駄文の長文になってしまいました。 #ご参考までにお読みください。 #なお、文中のコードなどは、頭の中にあるものをそのまま書きましたので、スペルのミスや文法の誤りもあろうかと存じます。その辺は差し引いてお読みください。 >VBAからのWEB操作については >独学ではこんな感じで進めるしかないのでしょうか  まぁ、お解りにならないことがあれば、「WEB検索をしまくる」のが、私の場合は常套手段です。  #1さんがご紹介のページもよく見に行きました。というか、最近でも、よく拝見しております。  あと、技術的なことになると、Microsoft社のソフトウェア開発者向けサポートサービスMSDN(Microsoft Developer Network)で資料を漁ってみたりもします。 http://msdn.microsoft.com/ja-jp/library/w290k23d(v=vs.80).aspx ----------------------  ザクッとしたイメージでは、 ・エクセルからIEを起動する方法 ・読み込んだWEBページの内容を取得する方法 ・WEBページにデータを入力する方法 が基本かと存じますが、取り出したデータを解析して、必要なものを取り出すまでに手こずっている方も結構いらっしゃいます(この辺りはエクセル自体の操作です)。  こういうところ(質問掲示板)でよく尋ねられる内容が、皆さんが躓かれるポイントかと存じますが、ありがちなのは、 ●呼び出したWEBページが準備完了になったかどうかのタイミングが解らない。  これには、きちんとした回答が見あたりません。それらしいことを回答する方もいらっしゃいますが、WEBページは、「全て」と申してよいほど、それぞれのページの作りが異なりますので、AというページではイケてもBというページでイケるという確証は「0」です。 ●WEBフォームにIDとパスワードを入れたいけれども、どのエレメントを捕まえればよいのか解らない。  この点につきましては、htmlソース を勉強されたら、ご理解が早いかと存じます。  場合によっては、Javascript なども解析しなければ目的のエレメントを捕まえることができないこともありますので、そういう意味では、エクセルやVBAだけではなくて、html・CSS・JavaScript なども、多少は勉強された方がよいかとは存じますが、かと言って Perl・Ruby・PHP・Python・Java のようなものまで研究の対象に入れたのでは、「エクセルVBAで」という利便性を見失ってしまいます。 ●WEBから取り出したデータから目的の文字列を切り出す方法が分からない。  これにつきましては、WEB操作というよりは、エクセルのワークシート関数やVBAの関数の知識を深めることかと存じます。  よく使われるのは、配列・Split・Join・Filter・Instr といった関数などです。 ----------------------  また、WEBページの要素を捕まえる際、「getElement(s)By~~」というメソッドを使いますが、「getElementById」・「getElementsByName」・「getElementsByTagName」の他に「getElementsByClass」のようなものがないかなあ、というような疑問は湧いて当然です。  このような場合は、WEB検索すれば、ユーザー定義関数を作成していらっしゃる方もありますので、これを拝借することはたびたびあります。しかし、この場合は、javascript で書かれた関数とかが多いので、VBAに翻訳する知識も必要です。  お気付きかとは存じますが、WEBページ上では、「エクセルVBAでWEBページを操作する」ということは、まだまだ未開拓の分野で、余り豊富な資料はありません。  いずれにいたしましても、一つずつ作りの違うWEBページが相手ですので、ケースバイケースで、困ったときは、1にWEB検索、2にWEB検索、それでもお解りにならないようでしたら、こういうところでご質問されるのがよいかと存じます(勉強になります)。  最初から丸投げでご質問される方に限って、細かいコーディングの意味を理解していらっしゃらないのか、直ぐに別途のご質問をされます。 >getelementsbytagnameに"input"を入れると >typeが取れるという感覚がなくて >Nameが取れたりもしますし、何をどこまで取れるのかわからないのです。 >"option"を入れたら  getElementsByTagName は html タグでエレメントを捕まえるメソッドです。  html タグとは、html ソースの中で「<」で始まりスペースで区切られている文字列、つまり「<input 」・「<a 」・「<div 」・「<script 」などですが、「option」タグはあっても、「name」タグや「type」タグというものはありません。 http://www.htmq.com/html/index.shtml  したがって「getElementsByTagName("name")」は無効です。  なお、特に「name="~~"」・「id=~~」となっている場合などは、同じエレメントを捕まえるのに幾通りもの表現がありますので、要は、エレメントさえ捕まえればよいようなものですが、これも、ウォッチウィンドウで逐一、確認することが必要です。 例)http://okwave.jp/qa/q7908955.html ----------------------  あと、「デバックでobjをウォッチしてひとつひとつ見たりしてる」とお書きですが、これは、基本中の基本です。  例えば、html ソースの中に <input type="text" name="url" value ="/hoge/hoge.html" size ="60" /> のような記述があった場合は、「objIE.document.getElementsByTagName("input")」の下に、「type」・「name」・「value」・「size」などのプロパティがあることが想像できますので、ウォッチウィンドウで「objIE.document.getElementsByTagName("input").type」というものがあるかどうかを確認し、もしあれば、 For Each myEl in objIE.document.getElementsByTagName("input")  If myEl.type = "text" And myEl.name = "url" Then   Debug.Print myEl.outerText みたいな感じで、For ~ Next ループを回して、innerText・outerText・innerHTML・outerHTML などを捕まえることができます。  innerText・outerText・innerHTML・outerHTML の内のどれを捕まえるかは、ウォッチウィンドウで、それぞれの値を見て、自分が欲しいものかどうかを判断します。  あるいは、WEBフォームを捕まえるのに「objIE.document.form(0)」だと思ってしまっている方が結構多いようですが、なぜ「0」なのかがウォッチウィンドウで判断できます。  つまり、場合によっては「objIE.document.form(1)」になったり、「objIE.document.form(2)」になったりするということです。  そして、その配下の <input> 要素は、概ね「objIE.document.form(0)(1)」というようなことでキャッチできる場合が多いのですが、最近では、<input> で「ID]や「パスワード」を入力させないようにしているサイトも多いようですので、このような場合は、html ソースの解析が必要です。 ----------------------  話がコロコロ変わりますが、次によく見受けられるご質問が、ポップアップや新しいタブを捕まえるということです。  これもケースバイケースですが、大体は Shell.Application の Windows コレクションでタブを捕まえたり、「objIE.document.frames(0)」のような形でポップアップを捕らえます。  なお、「ファイルをアップロードするダイアログにファイル名を入れたい」というような操作の場合は、Sendkeys で逃げる方も多いかと存じますが、Sendkeys は、なかなか挙動不審で、必ずしもこちらの意図するタイミングで働いてくれないことが多いので、識者からは、API関数やデータオブジェクト(クリップボード)を使った回答が寄せられることが多いのですが、これも、年々、厳しくなるIEのセキュリティの前にはお手上げになる日も近いかと存じます。  この意味では、IEではなくて Sleipnir などの他のブラウザを操作する方がよい場合もあります(全てのブラウザがVBAで扱える訳ではありません)。 ----------------------  尻切れトンボになってしまいましたが、簡単には書き尽くせませんので、思いつくままに書いて、この辺で失礼いたします。

noname#201721
質問者

お礼

DOUGLAS_さん 早速の回答ありがとうございました。 理解するのに時間を頂き遅くなりました。 頭の整理&新しいことを勉強できる すごくためになる回答でした。 >まだまだ未開拓の分野で、余り豊富な資料はありません。 なるほど…そうなんですね。 資料がないのは残念ですが 少ないとわかっただけで、よかったです。 なんとなくで書いてみたのですが For Each myEl in objIE.document.getElementsByTagName("input")  Range(行,列).myEl.outerText  行=行+1 Loop こんな感じでセルに書き出してみて、 Web画面と照らし合わせて検討をつけてみる といったことをしてみました。 始めて間もない模索中のときは とんでもないものに足を踏み入れている感じでしたが DOUGLAS_さんの回答を頂いて 自分が必要としているものに対しては なんとなくで使えるような感じになりました。 ひとつわかるとまたわからないことが出てきますので また目にとまったときに回答頂けると助かります。

その他の回答 (1)

  • web2525
  • ベストアンサー率42% (1219/2850)
回答No.1

VBAからのWEB操作について http://www.ken3.org/cgi-bin/group/vba_ie.asp ↑ ここ詳しい説明、動画付き (サイト自体は少し見にくいが)

noname#201721
質問者

お礼

web2525さん 早速の回答ありがとうございます。 教えていただいたページはよく見ています。 というか、このページでしか得られないことがたくさんありますね。

関連するQ&A

  • VBAからWEB操作について

    カテゴリがずれていたらすみません。 JavaScriptを使って作った(他社が作られたもの)WEBページがあり そのページの ”テキストボックスに文字を入れる”動きや ”オプションボタンをチェック”などの動きを ExcelのVBAから行っています。 テキストボックスの名前を知ろうとして ソースを表示させ、Nameの確認をしているのですが Nameが設定されていなかったりします。 こんなときはどのようにしてテキストボックスを指定すればよいのでしょうか? その他プログラミングのカテゴリにも同じ趣旨の内容ですが VBAの角度からの質問をさせていただきました。 こんな風にすれば良いよなど、ありましたら幅広い回答お待ちしております。

  • VBAでIEで開いたダイアログのオブジェクトの操作

    VBAでIE(Edge)上のWebページのエディットボックスやボタンを操作するには、 ie(COMオブジェクト)を取得して、 For Each obj In ie.document.getElementsByTagName("input")  If obj.ID = "txtDenpyoNo" Then   obj.Value = d_no   Exit For  End If Next For Each obj In ie.document.getElementsByTagName("input")  If obj.ID = "btnSearch" Then   obj.Click   Exit For  End If Next というような感じで、 エディットボックスに値を入れたり取得したり ボタンをクリックしたりする仕方は分かりましたが、 サイト上のボタンをクリックすると、 別のウインドウやダイアログが表示されることがあります。 このような場合、HTMLコードがないため、 上記の方法では記述することができません。 新しいウインドウやダイアログのタイトルから、 IDは取得することはできましたが、この取得したIDで、 ウインドウやダイアログをアクティブにするには、 どのように記述すればよいのでしょうか。 また、ウインドウやダイアログ上のオブジェクトの 指定の仕方がよく分からないのですが、 ウインドウやダイアログ上のオブジェクトを操作するには、 どのように記述をすればよいのでしょうか。 よろしくお願いします。(Windows10,IE,Edge)

  • 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も効かない理由が知りたいです。 (上記は一例にすぎず、色んな場面(色んなサイト)でこういった現象に遭遇するので、今後の勉強のためにも。) そしてもし上記ケースの対処法が分かる方がいらっしゃればご教示いただければ幸いです。 よろしくお願いいたします。

  • VB6でWEBのラジオボタンの操作方法がわかりません

    始めまして、VB初心者です。 VB6でWEBのラジオボタンの操作方法が解りません。 以下のようなHTMLのWEBページがあります。 ラジオボタンをVB6にて操作(チェック)したいのですがどうしても出来ません。 テキスト入力の項目には入力できました。 IE.Document.All("test").Value = "テスト" 上記にてテストと入力できました。 HTMLソース <table> <tr> <td>選択してください </td> <td colSpan="2"><!-- <select name="j_type"> <option value="10">A</option> <option value="11">B</option> <option value="20">C</option> <option value="30">D</option> <option value="40">E</option> <option value="50">F</option> <option value="99">G</option> </select> <label><input type="checkbox" value="10" name="jArr[]">A</label>&nbsp; <label><input type="checkbox" value="11" name="jArr[]">B</label>&nbsp; <label><input type="checkbox" value="20" name="jArr[]">C</label>&nbsp; <label><input type="checkbox" value="30" name="jArr[]">D</label>&nbsp; <label><input type="checkbox" value="40" name="jArr[]">E</label>&nbsp; <label><input type="checkbox" value="50" name="jArr[]">F</label>&nbsp; <label><input type="checkbox" value="99" name="jArr[]">G</label>&nbsp;<br> </td> </table> </table> <p> </p> <table> <tr> <td>選択しましたか?</td> <td><label><input type="radio" CHECKED value="0" name="c_exp">はい</label> <label><input type="radio" value="1" name="c_exp">いいえ</label></td> </table> 自分で作った(ホームページ作成ソフト)WEBにVBから操作したいと思ったのですが、単純にvalueにて数値を入れてもだめなのでしょうか? 宜しくお願いいたします。

  • 一つのチェックボックスでテキストフィールドとプルダウンリストを制御

    現在以下のようなテキストフィールドとプルダウンがあります。 <form name="register" action="register_kakunin.php" method="post"> <input type="checkbox" name="name_check" onclick="fchk(this,1);" /> <input name="revenue" onChange="keisan()" type="text" id="revenue" size="6" readOnly="true"/> <input type="checkbox" name="chk" onclick="fchk2(this)" /> <select name="paymethod" disabled="disabled"> <option value="">Pay Method</option> <option value="cash">cash</option> <option value="card">card</option> <option value="point">point</option> <option value="coupon">coupon</option> </select> </form> これを function fchk(obj, name_check){ var frm=document.register; if(!obj.checked){ /* チェックされたら、テキストボックスを有効化 */ frm.revenue.readOnly=true; }else{ /* チェックが外されたら、テキストボックスを無効化 */ frm.revenue.readOnly=false; } } function fchk2(obj) { var frm=obj.form; var len=frm.elements.length; /* フォームの要素数 */ if(obj.checked==true){ /* チェックボックスが選択されている場合、   プルダウンを有効化(disabled=false) */ frm.elements["paymethod"].disabled=false; }else{ /* チェックボックスが選択されていない場合、   プルダウンを無効化(disabled=true) */ frm.elements["paymethod"].disabled=true; } } という2つのスクリプトで制御しているのですが、前者を操作するときには必ず後者も操作することになるため、一つのチェックボックスで2つとも制御できるようにしたいのですが、どうしたらいいのでしょうか? 上記のjavascriptはネットから拾ってきたもので、自作ではありません。 宜しくお願いします。

  • VBAをJavaScriptに変換したいです

    JSPとJavaScriptを使い、 フォーム1とフォーム2を連動させたいと考えています。 内容はフォーム1の中のキストボックス(複数行の中のどれか一つ)横のボタンをクリックすると、フォーム2が開きます。 フォーム2では検索が出来るようになっており、 検索画面で気に入る結果が見つかった場合は、 その内容(テキストボックス)横のボタンをクリックします。 するとフォーム2の検索結果が、フォーム1のボタンをクリックした行のテキストボックスに代入されるというものです。 VBAで記述すると以下のプログラムになります。(こちらは完璧に動作します) これをJSPとJavaScriptで記述するとどうなるでしょうか? VBA版の下にjavaScript版を記述してみたので、採点をお願いします。 しばらくプログラムを実行する環境から離れているため、 動作確認ができません。 けれどどう動くのか気になって仕方ないので…。 どうぞよろしくお願いします。 -----------VBA版--フォーム1(代入先)----------- Private Sub ボタン1_Click() DoCmd.OpenForm "フォーム2" End Sub -----------VBA版--フォーム2(検索)----------- Private Sub ボタン2_Click() Forms!フォーム1!詳細.Form!コード = Me!コード DoCmd.Close acForm, "フォーム2" End Sub ***** --------JavaScript版--フォーム1(代入先)-------- <form1> while(rs.next()){ ・・・ <input size="45" type="text" name="Name" value=""> <input type="hidden" name="CD" value=""> <input type="button" value="..." onClick="window.open("search.jsp" , "_blank");"> ・・・ } <input type="submit" value="設定"> </form1> --------JavaScript版--フォーム2(検索)-------- <Script Type="text/javascript"> <!-- function sub_catch(objName){ var fcd=document.form2.CD.value(); var fn=document.form2.Name.value(); if(objName == "value"){ document.form1.Name.value=fn;  document.form1.CD.value=fcd; } } //--> </Script> <form2> while(rs.next()){ ・・・ <input type="text" name="Name" value="<%= name %>"> <input type="text" name="CD" value="<%= code %>"> <input type="button" value="決定" onClick="sub_catch("value")"> ・・・ } </form2>

  • VBAでIEの操作をするうえで

    VBAでIEの操作中、webページからのメッセージが表示されるのですが このメッセージをOKする操作方法を教えてください。 ネットでいろいろと調べましたが、うまくできません。 操作に関係あると思われるソースは下記です。 <td colspan=2 class=xl888205><input name='WriteSheet=KanRegist2;Set_R7C1=1;Set_R9C26=-1;' type='SUBMIT' style='width:100%;font-Weight:bold;' OnClick="if(confirm('作業の登録を行います。よろしいですか?')!=true){return false;} if(DtmErrCheck(2)!=true){return false;}" value='登録'></td> 下記マクロで登録ボタンを押すと 作業の登録を行います。よろしいですか? のメッセージが表示されます。これをクリックしたいです。 For Each Obj In objIE.document.all.tags("INPUT") '登録 If Obj.Value = "登録" Then '.value値(ボタンの名称) Obj.Click '.Click Exit For 'ループを抜ける End If Next よろしくお願いします。

  • JavaScripsのDOMについてなんですが…

    閲覧ありがとうございます。 以前にSelectボックスで選んだ値の分だけテキストボックスの生成を行う方法を伺い、生成することが出来るようになりました。 (1)生成したテキストボックスを改行して表示がしたい。 (2)生成したテキストボックスの右隣にSelectボックスを生成し、Selectボックスで1~8の値を扱い、選んだ数値の分のテキストボックスをSelectボックスの右隣に生成するもの。 以下がSelectボックスで選んだ数値の分だけテキストボックスを生成するプログラムです。 <form name="form" action="index2.php"> <select id="factor" onchange="swicthForm(this)"> <option value="0">選んでください</option> <option value="1">1個</option> <option value="2">2個</option> <option value="3">3個</option> <option value="4">4個</option> <option value="5">5個</option> </select> </form> <br> <script type="text/javascript"> function swicthForm(obj){ var n=obj.nextSibling; while(n){ var m=n.nextSibling; if(n.nodeName=="INPUT" && n.type=="text") n.form.removeChild(n); n=m; } for(var i=0; i<parseInt(obj.value);i++){ var e=document.createElement("input"); e.setAttribute("type","text"); e.setAttribute("name","test"+(i+1).toString()); obj.form.appendChild(e); } } </script> よろしくお願いします。

  • name属性に[]付の名前を指定した処理

    理由があり、下記の様にname属性に配列(?)を指定しています。(下記はスクリプトエラーになります。) <HTML> <HEAD> <script language="JavaScript"><!-- function input(obj1, obj2) { obj2.value = obj1.value } // --></script> </HEAD> <BODY> <FORM name="myform"> <INPUT type="text" name="text[1]" onchange="input(this, document.myform.text[2])" /> <INPUT type="text" name="text[2]" onchange="input(this, document.myform.text[1])" /> </FORM> </BODY> </HTML> 当然ながら、text[1]をtext1にし、text[2]をtext2にすれば全く問題無く動作します。nameとしてこのままtext[n]のままでこのエラーを回避するにはどうしたらいいのでしょう。以上、よろしくお願いします。

  • AccessのVBAの記述について

    たびたびお世話になります AccessのVBAで、フォーム上にあるテキストボックス(CadrDate)のデータを同一フォーム内の別のテキストボックスに貼り付ける操作はできるのでしょうか? 出来るのであれば記述文を教えてください。