プロが教える店舗&オフィスのセキュリティ対策術

わかりにくい質問でしたらすみません。

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のほうにも、同じ趣旨の質問を書かせていただきました

A 回答 (2件)

VBAからのWEB操作について



http://www.ken3.org/cgi-bin/group/vba_ie.asp

ここ詳しい説明、動画付き
(サイト自体は少し見にくいが)
    • good
    • 0
この回答へのお礼

web2525さん 早速の回答ありがとうございます。

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

お礼日時:2013/02/02 21:36

#ひけらかすほどの知識もありませんが、思いつくままに書きましたら、案外、駄文の長文になってしまいました。


#ご参考までにお読みください。
#なお、文中のコードなどは、頭の中にあるものをそのまま書きましたので、スペルのミスや文法の誤りもあろうかと存じます。その辺は差し引いてお読みください。


>VBAからのWEB操作については
>独学ではこんな感じで進めるしかないのでしょうか
 まぁ、お解りにならないことがあれば、「WEB検索をしまくる」のが、私の場合は常套手段です。

 #1さんがご紹介のページもよく見に行きました。というか、最近でも、よく拝見しております。

 あと、技術的なことになると、Microsoft社のソフトウェア開発者向けサポートサービスMSDN(Microsoft Developer Network)で資料を漁ってみたりもします。
http://msdn.microsoft.com/ja-jp/library/w290k23d …

----------------------

 ザクッとしたイメージでは、
・エクセルから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://oshiete.goo.ne.jp/qa/7908955.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で扱える訳ではありません)。

----------------------

 尻切れトンボになってしまいましたが、簡単には書き尽くせませんので、思いつくままに書いて、この辺で失礼いたします。
    • good
    • 0
この回答へのお礼

DOUGLAS_さん 早速の回答ありがとうございました。

理解するのに時間を頂き遅くなりました。

頭の整理&新しいことを勉強できる
すごくためになる回答でした。

>まだまだ未開拓の分野で、余り豊富な資料はありません。
なるほど…そうなんですね。
資料がないのは残念ですが
少ないとわかっただけで、よかったです。

なんとなくで書いてみたのですが

For Each myEl in objIE.document.getElementsByTagName("input")

 Range(行,列).myEl.outerText
 行=行+1

Loop

こんな感じでセルに書き出してみて、
Web画面と照らし合わせて検討をつけてみる
といったことをしてみました。

始めて間もない模索中のときは
とんでもないものに足を踏み入れている感じでしたが
DOUGLAS_さんの回答を頂いて
自分が必要としているものに対しては
なんとなくで使えるような感じになりました。

ひとつわかるとまたわからないことが出てきますので
また目にとまったときに回答頂けると助かります。

お礼日時:2013/02/02 21:35

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!