わかりにくい質問でしたらすみません。
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のほうにも、同じ趣旨の質問を書かせていただきました
No.1
- 回答日時:
web2525さん 早速の回答ありがとうございます。
教えていただいたページはよく見ています。
というか、このページでしか得られないことがたくさんありますね。
No.2ベストアンサー
- 回答日時:
#ひけらかすほどの知識もありませんが、思いつくままに書きましたら、案外、駄文の長文になってしまいました。
#ご参考までにお読みください。
#なお、文中のコードなどは、頭の中にあるものをそのまま書きましたので、スペルのミスや文法の誤りもあろうかと存じます。その辺は差し引いてお読みください。
>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で扱える訳ではありません)。
----------------------
尻切れトンボになってしまいましたが、簡単には書き尽くせませんので、思いつくままに書いて、この辺で失礼いたします。
DOUGLAS_さん 早速の回答ありがとうございました。
理解するのに時間を頂き遅くなりました。
頭の整理&新しいことを勉強できる
すごくためになる回答でした。
>まだまだ未開拓の分野で、余り豊富な資料はありません。
なるほど…そうなんですね。
資料がないのは残念ですが
少ないとわかっただけで、よかったです。
なんとなくで書いてみたのですが
For Each myEl in objIE.document.getElementsByTagName("input")
Range(行,列).myEl.outerText
行=行+1
Loop
こんな感じでセルに書き出してみて、
Web画面と照らし合わせて検討をつけてみる
といったことをしてみました。
始めて間もない模索中のときは
とんでもないものに足を踏み入れている感じでしたが
DOUGLAS_さんの回答を頂いて
自分が必要としているものに対しては
なんとなくで使えるような感じになりました。
ひとつわかるとまたわからないことが出てきますので
また目にとまったときに回答頂けると助かります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- HTML・CSS ただいま勉強始めたての初心者です。フォームを縦並べにしたいです。 2 2022/11/20 17:18
- Instagram HTML5の廃止とJavaScript 2 2022/04/13 21:05
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- JavaScript sessionStorageを調べています。 1 2023/06/20 12:41
- JavaScript Javascriptが機能せず原因が分からないので教えて頂きたいです 3 2023/06/04 14:50
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- JavaScript javascriptで移動ボタンを押した際に遷移するボタンを追記したい 1 2022/11/29 03:02
- JavaScript html javascriptにてWeb SQLを操作したい。 2 2022/12/16 17:43
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
- JavaScript HTMLでJavaScriptを使ってパスワードの強化判定のプログラムを作成しています。 一通り作っ 2 2022/10/19 01:41
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
子ウィンドウの操作
-
送信ボタン押下時に値が未入力...
-
mailtoについて
-
プルダウンメニュー項目のフォ...
-
プルダウンの切り替えについて
-
<a href=**?***=***>をGET方式で
-
複数のフォームを一括で送信す...
-
セレクトボックスを切り替える...
-
同じ名前が複数あるインプット...
-
リストボックス全選択について
-
inputタグのclass名にコロン「:...
-
jQuery if文の条件分岐 (。ノд...
-
スマートフォンサイトからのメ...
-
1アクションでPOST・GET、両方...
-
メールフォームを開いて、任意...
-
1つのformで複数のactionを実...
-
「リセット」ボタンを「画像」...
-
type="hidden"を使って時刻を送信
-
submitをボタン以外にするには
-
グーグルでの化け文字対策は?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
親ページからインラインフレー...
-
入力フォームの javascript で ...
-
画像をボタンのようにフォーカ...
-
JavaScript の 「showDialog」
-
[onClick]ボタンを押すことで入...
-
パスワードをIPする際見えな...
-
submit時に違うページに飛びたい
-
確認ダイアログ表示後、他のペ...
-
a.href の href を有効か無効に...
-
submitをボタン以外にするには
-
1アクションでPOST・GET、両方...
-
送信ボタン押下時に値が未入力...
-
複数のフォームを一括で送信す...
-
URL パラメータを使ってフォー...
-
HTMLのoptionタグ部分に画像を...
-
【html】)パスワード認証フォー...
-
フォーム要素以外にもname属性...
-
リンクをクリックした時にform...
-
1つのformで複数のactionを実...
-
GETをPOSTに変更したところ 送...
おすすめ情報