プロが教えるわが家の防犯対策術!

VBAなんですが、 HTML要素または指定文字したの画面の座標を取得したいです。
ですが、全然みつけられずにいます!!

IEやらDocumentやら検索してますが出てきません。
どなたかご存知の方、おしえてください。

A 回答 (4件)

「画面の座標を取得し」てどうされるおつもりでしょうか?



 例えば、ご覧の ページ の「左から○○ピクセル、上から○○ピクセル」の「がんばろう日本!」の アイコン でも クリック されるおつもりでしょうか?
 そのような操作もできないことはないのでしょうが、普通は、「キーボードやマウスの操作を記録する」フリーソフト や「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://oshiete.goo.ne.jp/qa/6923883.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ページ の構成に応じて、使い分けます。

この回答への補足

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で文字を検索して、反転部分の座標とかでもいいんですが…
難しいものでしょうね。

沢山の説明ありがとうございます。

補足日時:2011/08/06 10:37
    • good
    • 0

#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

この回答への補足

DOUGLASさん
jcctaira さんイロイロありがとうございます。
お二人のアイディアなど表示していただいた単語で私も調べてみましたが、
まだ解決していません。
ちょっと質問のカテゴリから外れちゃいますが…

javaScriptは詳しくありませんがjavaScriptで出来ないか…も探っております。

エクセル⇒自分のjavaScriptで対象webの文字座標とれないか…
    ⇒自分のweb上に表示⇒エクセルが取得とか… ちょっと探ってみます。
本当にお二人さんありがとうございます。(^^

補足日時:2011/08/08 15:02
    • good
    • 0

hamaa_2009さん


はじめまして。

私も仕事で同じことを行いました。
IEを最大化して、クリックに位置に「SetCursorPos」で設定しマウス操作…
ただHTMLから位置を求めるのは不可能だと思います。
画面解像度、文字フォント等、様々な条件があるからです。

私が行ったのは、実際にクリックしたい所にカーソルを移動して、位置を求めることです。
Declare Function GetCursorPos Lib "user32.dll" (ByRef pos As POINTAPI) As Boolea
       :
 MsgBox ("クリックしたい位置にマウスを合わせてください")
 Call GetCursorPos(point)
 ' 位置をシート等にメモ
 
あまりお役に立てないかも知れませんが、一つのアイデアとご検討ください。
    • good
    • 0

>webで文字を検索して、反転部分


にすることは、可能です。

 しかし、その「座標」を取得するのは、ちょっと。。。


>~~~.Clickなどが使えません。
>Script生成リンク部分があり、
>SendKeys {enter},{SPACE}も効かず
 どんな ページ なのか見てみたいものです。

 「親会社のwebシステム」ということで、URL は晒せませんよねぇ。

 「Script生成リンク部分」とお書きなのが、どのような「Script」なのかによっては、objIE でも アクセス 可能なはずです。


 そもそも、hamaa_2009 さんが、どのようにして、その サイト の html を分析されているのでしょうか?


 可能でしたら、
1)元々の ページ の ソース(URL 文字列は伏せていただいて結構です。)
2)クリック すべきトコロに表示されている「文字列」
をお知らせいただけるようでしたら、こちらで分析してみます。
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています