• ベストアンサー

VBA HTML要素または文字の座標を取りたい

VBAなんですが、 HTML要素または指定文字したの画面の座標を取得したいです。 ですが、全然みつけられずにいます!! IEやらDocumentやら検索してますが出てきません。 どなたかご存知の方、おしえてください。

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

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

「画面の座標を取得し」てどうされるおつもりでしょうか?  例えば、ご覧の ページ の「左から○○ピクセル、上から○○ピクセル」の「がんばろう日本!」の アイコン でも クリック されるおつもりでしょうか?  そのような操作もできないことはないのでしょうが、普通は、「キーボードやマウスの操作を記録する」フリーソフト や「WEB操作を記録する」フリーソフト に頼るのが無難かと存じます。  普通、この種のご質問の場合は、大概、「htmlタグ の中に "<table>" がたくさんあるのだが、上から7番目の <table> の左から2番目の <td> の中身を取りたい」というような内容ですが、どうでしょうか?  あるいは、WEB画面でのログイン操作などでしょうか。 ------------------------------------  例えば、リンク先 の URL は分かるのだけれども、[navigate メソッド] で直接、当該URL を呼び出すと、エラー になるので、どうしても、画面上の画像を クリック しなければならない、というような場合でしたら、下記のようになります。  ちなみに、下記は、この ページ の hamaa_2009 さんの上にある「がんばろう日本!」の アイコン を クリック する マクロ です。 Sub こんな感じ()  Dim strURL As String  Dim objIE As Object  Dim myLnk  strURL = "http://okwave.jp/qa/q6923883.html"  Set objIE = CreateObject("InternetExplorer.Application")  With objIE   .navigate strURL   While .Busy Or .ReadyState <> 4: DoEvents: Wend   .Visible = True   For Each myLnk In .Document.Links    If myLnk.href Like "*/profile/u1396884.html" Then     myLnk.Click     While .Busy Or .ReadyState <> 4: DoEvents: Wend     Exit For    End If   Next myLnk  End With  Set objIE = Nothing End Sub ------------------------------------  他にも htmlタグ名 で データ を取りたい、というような場合でしたら objIE.Document.getElementsByTagName("table") というようなことで、当該ページ にある <table> タグ の一覧を取得できますので、その中の要素を調べて objIE.Document.getElementsByTagName("table")(4).innerHTML というような指定で文字列を取得します。  「(4).innerHTML」の中の「(4)」の インデックス に付きましては、上記マクロ の中の For Each myLnk In .Document.Links の部分のように「For ~ Next」で回さなければ分かりません。  また「innerHTML」の部分は、VBE(Visual Basic Editor)で「objIE.Document」を ウォッチ式 に追加し、ステップ イン デバッグ しながら、その配下の プロパティ などの「値」を確認して、「innerHTML」が良いのか、それとも「innerText」・「outerHTML」・「outerText」が良いのかなどを決めていきます。  いずれにいたしましても、WEBページ の作りは、サイト によって全然違いますし、同じサイトでも、ガラッと更新する場合も多々ありますので、1度書いた マクロ がいつまでも通用するかどうかは判りません。 ------------------------------------  [getElementsByTagName メソッド] の他には、[getElementById メソッド]・[getElementsByName メソッド] などがあり、当該WEBページ の構成に応じて、使い分けます。

hamaa_2009
質問者

補足

DOUGLAS コードまで書いていただきありがとうございます。 現在、親会社のwebシステムに自動入力するツールを上司から言われつくっています。 親会社は別な会社に依頼してwebシステムをつくったのでセキュリティ処理がされているのか objIE.Document.Links.Click objIE.Document.forms(0).Click objIE.Document.all.[名前].Clickなどが使えません。 しかたないので SendKeys {enter},{TAB}などを使っていましたが Script生成リンク部分があり、SendKeys {enter},{SPACE}も効かず ----------------------------------------------- Option Explicit Declare Function SetCursorPos Lib "USER32" (ByVal x As Long, ByVal y As Long) As Long Declare Sub mouse_event Lib "USER32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long) Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long) Private Type POINTAPI x As Long y As Long End Type Private Sub クリックテスト() Call SetCursorPos(目標座標, 目標座標) Sleep 400 Call mouse_event(&H2, 0, 0, 0, 0) 'ダウン Call mouse_event(&H4, 0, 0, 0, 0) 'アップ End Sub  ----------------------------------------------- これを使うざるをえません。  フリーソフトも使うことが許されておりませんので、BVAでやるしかありません。 webシステムは親会社のシステムで頻繁に変わることはないです。 あとは座標をとるだけなんですが、 画面の解像度、画面は最大化して使う、文字サイズは全員統一でやらせる予定です。 ですので Script生成部分で、目標の文字列などのスクリーン座標などを取得してクリックさせたいのです。 webで文字を検索して、反転部分の座標とかでもいいんですが… 難しいものでしょうね。 沢山の説明ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

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

#2 >しかし、その「座標」を取得するのは、ちょっと。。。  WEBページ をいろいろと サーフィン して、[GetClassName 関数]・[GetCaretPos 関数]・[ClientToScreen 関数]・[GetCurrentThreadId 関数]・[GetWindowThreadProcessId 関数]・[AttachThreadInput 関数]・[SetForegroundWindow 関数]・[GetFocus 関数]・[GetGUIThreadInfo 関数]・[GetMessage 関数] などの [Win32API関数] を用いてどうにかならないかと模索いたしましたが、私の手には負えません。  キャレット 位置の座標を取得しようかと試みましたが、(IE の場合は)見当違いな座標が返ってきますし、フォーカスのある ウィンドウ ハンドル の ThreadID を代入しても ポジション が「0」になります。「IMR_QUERYCHARPOSITION」を キーワード に メッセージ のやりとりを試みるのですが、こちらは、さっぱり解りません。  ということで、 >>webで文字を検索して、反転部分 >にすることは、可能です。 と書きましたのは、下記のようなことですが、「Yahoo! JAPAN」の ホームページ を開き、画面右上の「カテゴリ一覧」を検索結果として、[ENTER] キー により開きます。 Sub webで文字を検索()  Const OLECMDEXECOPT_DODEFAULT = &H0  Const OLECMDID_FIND = &H20  Dim objIE As Object  Set objIE = CreateObject("InternetExplorer.Application")  With objIE   .Visible = True   .navigate "http://www.yahoo.co.jp/"   While .Busy Or .ReadyState <> 4: DoEvents: Wend   .ExecWB OLECMDID_FIND, OLECMDEXECOPT_DODEFAULT   Sleep 400   SendKeys "カテゴリ一覧{ENTER}{ESC}{ENTER}"  End With  Set objIE = Nothing End Sub

hamaa_2009
質問者

補足

DOUGLASさん jcctaira さんイロイロありがとうございます。 お二人のアイディアなど表示していただいた単語で私も調べてみましたが、 まだ解決していません。 ちょっと質問のカテゴリから外れちゃいますが… javaScriptは詳しくありませんがjavaScriptで出来ないか…も探っております。 エクセル⇒自分のjavaScriptで対象webの文字座標とれないか…     ⇒自分のweb上に表示⇒エクセルが取得とか… ちょっと探ってみます。 本当にお二人さんありがとうございます。(^^

全文を見る
すると、全ての回答が全文表示されます。
  • jcctaira
  • ベストアンサー率58% (119/204)
回答No.3

hamaa_2009さん はじめまして。 私も仕事で同じことを行いました。 IEを最大化して、クリックに位置に「SetCursorPos」で設定しマウス操作… ただHTMLから位置を求めるのは不可能だと思います。 画面解像度、文字フォント等、様々な条件があるからです。 私が行ったのは、実際にクリックしたい所にカーソルを移動して、位置を求めることです。 Declare Function GetCursorPos Lib "user32.dll" (ByRef pos As POINTAPI) As Boolea        :  MsgBox ("クリックしたい位置にマウスを合わせてください")  Call GetCursorPos(point)  ' 位置をシート等にメモ   あまりお役に立てないかも知れませんが、一つのアイデアとご検討ください。

全文を見る
すると、全ての回答が全文表示されます。
  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.2

>webで文字を検索して、反転部分 にすることは、可能です。  しかし、その「座標」を取得するのは、ちょっと。。。 >~~~.Clickなどが使えません。 >Script生成リンク部分があり、 >SendKeys {enter},{SPACE}も効かず  どんな ページ なのか見てみたいものです。  「親会社のwebシステム」ということで、URL は晒せませんよねぇ。  「Script生成リンク部分」とお書きなのが、どのような「Script」なのかによっては、objIE でも アクセス 可能なはずです。  そもそも、hamaa_2009 さんが、どのようにして、その サイト の html を分析されているのでしょうか?  可能でしたら、 1)元々の ページ の ソース(URL 文字列は伏せていただいて結構です。) 2)クリック すべきトコロに表示されている「文字列」 をお知らせいただけるようでしたら、こちらで分析してみます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ExcelのVBAでHTMLのソースのタグの部分を小文字で取得したい

    HTMLのソースコードを取得する下記のVBAを実行すると タグの部分が大文字(<H1>等)になってしまいます。 どうすれば小文字のタグのまま取得することが出来るのでしょうか? 使用OS:Windows XP 使用ソフト:Microsoft Excel 2003 ご存知の方がおられましたらご回答をよろしくお願いします。 Sub sample() Set IE = CreateObject("InternetExplorer.Application") IE.Navigate ("http://www.yahoo.co.jp/") While IE.busy: Wend While IE.Document.readyState <> "complete": Wend HTML = IE.Document.body.innerHTML MsgBox HTML IE.Quit End Sub

  • HTMLの要素の間が空いてしまうのはなぜ??

    HTMLの要素の間が空いてしまうことがあります。firefoxで空いてしまい、IEでは空かないのですが、なぜでしょうか?それぞれの要素のwidthやheightを指定しても解消されません。marginでマイナス設定すると逆にIEで要素が重なってしまうのです。どなたかご教示くださいお願いいたします。

    • ベストアンサー
    • HTML
  • VBA:HTML から文字列を取得したい

    エクセルのVBAを使ってHTMLの操作をしようとしています。 実際のHTMLではなくて恐縮ですが、以下のようなテーブルがあります。 <tr class="hoge"> <td>ABC</td> <td>fuga</td> <td>piyo</td> <td>テキスト:いろは</td> <td>hogehoge</td> </tr> 四つ目のtd要素に含まれている文字列「いろは」で、目的のtr要素を特定し(「いろは」はHTML中一回しか使われません)、一つ目のtd要素にある「ABC」を取得して変数に収め、利用したいと考えています。 このクラス名「hoge」を用いたtr要素は複数あって、かつその並び順は新しいデータの更新・追加に従って変わるので、添え番で指定することが出来ません。 このとき、GetElementsByClassName でクラス名「hoge」のエレメントコレクションを取得するところまでは判りますが、その後どういった処理を行えば希望する結果が得られるか思いつきません。 どういう方法を使えばよいか、なんらかヒントをご教示頂ければ助かります。 なにとぞよろしくお願い致しますm(__)m

  • 座標のみでクリックする方法

    DOMで取得した要素ではなく、座標のみでクリックすることは可能でしょうか? フラッシュなどの、要素を取得できないサイトでクリックをさせたいと思っております。 (私が知らないだけでフラッシュの要素が取り出せるかもしれませんが・・・) 要素を指定するのに、座標を指定する引数がある意味がよくわかりません。 下記の例だと■■■の記述方法が分かりませんでした。 ご教授のほど宜しくお願い致します。 e = document.createEvent("MouseEvents"); e.initMouseEvent("click",true,true,window,1,0,0,0,0,false,false,false,false,0,null); ■■■.dispatchEvent(e);

  • VBAでHTMLファイルを扱うにはどうしたらいいですか?

    VBAでHTMLファイルを扱うのにはどうしたらいいのですか? open では、うまくいかないようで、どうしたらいいか困っています。 HTMLファイル内の文字列を検索し、見つかった文字列の後ろの何文字かを検出したいのですが、よい方法がありましたら教えてください。

  • class指定したHTML要素の背景色を変えるには

    HTML文書中で,class指定した要素の背景色を変更するには,どのようにしたら良いのでしょうか。 例: <div id="HOGE"> <p class="hoge"> Hellow! </p> </div> id指定の要素に対しては, document.getElementById('HOGE').style.backgroundColor="red"; として成功しましたが,class="hoge"に対してはどのように指定すれば良いのかわかりません。 よろしくお願いします。

  • ExcelのVBAでHTML内の特定のタグの出現回数を調べたい

    たとえばYahoo!JapanのサイトのHTMLのTDタグの出現回数を調べる場合 下記のVBAに何を付け加えればよいのでしょうか? Sub tagCount() Dim cnt As Integer Dim IE As Object Dim HTML As String Set IE = CreateObject("InternetExplorer.Application") IE.Navigate ("http://www.yahoo.co.jp/") While IE.busy: Wend While IE.Document.readyState <> "complete": Wend HTML = IE.Document.body.innerHTML IE.Quit 'td_count = ここの部分がわかりません。 '文字列の出現回数をカウントする関数はないのでしょうか? MsgBox td_count End Sub ご存知の方がおられましたらご回答をよろしくお願いします。 使用OS:Windows XP 使用ソフト:Microsoft Excel 2003

  • HTML要素のid/class名の長さについて

    HTML要素のid/class名の長さについて HTML要素のid/class名についてですが、この名前の長さは何文字まで指定できるのでしょうか? 特に制限はなく、ブラウザなどの実装に依存するのでしょうか? <div id="so-loooooooooong-id-name"></div>

    • ベストアンサー
    • HTML
  • VBSでHTMLソースの取得方法で

    VBScriptでBODY部のHTMLソースを取得したいのですが出来ない場合があって悩んでいます。 msgbox objIE.Document.Body.InnerTextというかたちで表示させています。 ほとんどのページで問題なく出来るのですが・・・・ フレームで出来ているページに関して取得が出来ません。 そういった場合どうすればよいのでしょうか? 極論を言えば指定HTMLソースの中に文字検索が出来れば問題はないのですがソースが取得できないので検索しようがありません。

  • VBA(EXCELマクロ)でHTMLを表示

    VBA(EXCELマクロ)で次の処理を行うことは可能でしょうか? 指定したURLのホームページからHTMLファイルを出力する。 出力形式はIEのツールバーから「表示 - ソースの表示」で表示されるようなタグ形式です。また、表示の際にエンコードの指定を行いたいのですが可能でしょうか? 以上、ご存知の方がいらっしゃいましたらお教えてください。

印刷ができない
このQ&Aのポイント
  • 今まで印刷できていたのに突然印刷ができなくなりました。どうすれば再度印刷できるようになるでしょうか。
  • お使いのブラザー製品(DCP-J1200N)で印刷ができなくなりました。Windows10を使用しており、無線LANで接続しています。再度印刷できるようにする方法を教えてください。
  • 印刷ができないトラブルに関して質問です。以前は正常に印刷できていましたが、最近急に印刷ができなくなりました。どのような対策をすれば再び印刷できるようになるでしょうか。
回答を見る