- ベストアンサー
VBAからWEB操作についての質問
- VBAからWEB操作についての質問です。具体的には、JavaScriptを使って他社が作ったWEBページのテキストボックスやオプションボタンを操作する方法についてわからない部分があります。
- VBAを独学してきたが、WEB操作については進め方がわからず困っています。WEBページのソースを確認し、テキストボックスの名前を調べたりデバッグしたりすることはできるが、より効率的な方法があれば教えていただきたいと思っています。
- 現在、VBAでWEB操作をしており、JavaScriptの勉強を開始しました。しかし、getelementsbytagnameの挙動についてわからない部分があります。特に、typeやnameの取得方法について知りたいです。また、VBAからのWEB操作について情報を得る方法が限られているため、幅広い回答をいただけると助かります。
- みんなの回答 (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で扱える訳ではありません)。 ---------------------- 尻切れトンボになってしまいましたが、簡単には書き尽くせませんので、思いつくままに書いて、この辺で失礼いたします。
その他の回答 (1)
- web2525
- ベストアンサー率42% (1219/2850)
VBAからのWEB操作について http://www.ken3.org/cgi-bin/group/vba_ie.asp ↑ ここ詳しい説明、動画付き (サイト自体は少し見にくいが)
お礼
web2525さん 早速の回答ありがとうございます。 教えていただいたページはよく見ています。 というか、このページでしか得られないことがたくさんありますね。
お礼
DOUGLAS_さん 早速の回答ありがとうございました。 理解するのに時間を頂き遅くなりました。 頭の整理&新しいことを勉強できる すごくためになる回答でした。 >まだまだ未開拓の分野で、余り豊富な資料はありません。 なるほど…そうなんですね。 資料がないのは残念ですが 少ないとわかっただけで、よかったです。 なんとなくで書いてみたのですが For Each myEl in objIE.document.getElementsByTagName("input") Range(行,列).myEl.outerText 行=行+1 Loop こんな感じでセルに書き出してみて、 Web画面と照らし合わせて検討をつけてみる といったことをしてみました。 始めて間もない模索中のときは とんでもないものに足を踏み入れている感じでしたが DOUGLAS_さんの回答を頂いて 自分が必要としているものに対しては なんとなくで使えるような感じになりました。 ひとつわかるとまたわからないことが出てきますので また目にとまったときに回答頂けると助かります。