uwscを使っていまして、あるサイトのページを開いて、カーソル下のデーターを取得しています。

この場合、あるサイトのページを最小化してもカーソル下のデーターを取得するにはどのようにすれば良いでしょうか。

あるいは、あるサイトをバックグランドで動かして、そのページからテキストデーターを取る方法があるでしょうか。
宜しくお願い致します。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2013/10/06 18:58:14
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:Mook No.2

回答回数1314ベストアンサー獲得回数393

ポイント1000pt

取ったデータをどう表示したいのかが分かりませんが、
今回の内容だと UWSC を使わなくともEXCEL だけでできそうな気がします。

Web からのデータ取得はフォームやタグから位置を特定して値をとるのが定石です。
今回の場合スポットには id="spot" が付いていますから、getElementByID で取得
出来ます。

VBAでスポット値をとるサンプルです。

Sub Sample()
  MsgBox GetSpotValue()
End Sub

Function GetSpotValue()
  Dim ie As Object
  Set ie = CreateObject("InternetExplorer.Application")
    
  ie.navigate "https://www.binary.com/d/trade.cgi?l=JA"
  Do While ie.Busy Or ie.ReadyState < 4
    DoEvents
  Loop
  GetSpotValue = ie.Document.getElementById("spot").innerText
  ie.Quit
End Function

5分ごとにセルを更新するなら OnTime で記録する処理を呼び出せばこんな感じで
できるでしょうか。
http://officetanaka.net/excel/vba/tips/tips114.htm

Sub StartUpdate()
    Dim sp
    sp = GetSpotValue()
    Range("A1").Value = Now()
    Range("B1").Value = sp
    Range("C1").Value = sp
    Range("D1").Value = sp
    Range("E1").Value = sp
    Application.OnTime Application.Ceiling(Now, TimeValue("00:05:00")), "UpdateSpot"
End Sub

Sub StopUpdate()
    Application.OnTime Application.Ceiling(Now, TimeValue("00:05:00")), "UpdateSpot",,False
End Sub

Sub UpdateSpot()
    Dim sp
    sp = GetSpotValue()

    Range("A1").Value = Now()
    If sp > Range("C1").Value Then Range("C1").Value = sp
    If sp < Range("D1").Value Then Range("D1").Value = sp
    Range("E1").Value = sp

    Application.OnTime Application.Ceiling(Now + TimeValue("00:00:01"), TimeValue("00:05:00")), "UpdateSpot"
End Sub

Function GetSpotValue()
    Dim ie As Object
    Set ie = CreateObject("InternetExplorer.Application")
    
    ie.navigate "https://www.binary.com/d/trade.cgi?l=JA"
    Do While ie.Busy Or ie.ReadyState < 4
        DoEvents
    Loop
    GetSpotValue = ie.Document.getElementById("spot").innerText
    ie.Quit
End Function

IE の更新自体それほど高速ではないので、秒単位の処理はあまり意味がないと
思いますが、もともと EXCEL で何かしらの処理をしているようですから、
そこに組み込んだ方が効率がよさそうな気がします。




期待通り動くかどうかわかりませんが、毎秒のコード例です。

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

'//----------------------------
Sub UpdatingSpot()
'//----------------------------
    Dim ie As Object
    Set ie = CreateObject("InternetExplorer.Application")
    
    Dim sp As Double
    With Worksheets("Sheet1")
    
        MsgBox "終了するときは A2 を消去してください。"
        .Range("A2").Value = "更新中"
        .Activate
        .Range("A2").Activate
        .Range("A1").NumberFormat = "hh:mm:ss"
        sp = GetSpotValue(ie, "https://www.binary.com/d/trade.cgi?l=JA")
        .Range("A1").Value = Now()
        .Range("B1").Value = sp
        .Range("C1").Value = sp
        .Range("D1").Value = sp
        .Range("E1").Value = sp
        
        Do While .Range("A2").Value <> ""
            Sleep 1000 '// msec
            sp = GetSpotValue(ie, "")
        '   sp = GetSpotValue(ie, "REFRESH") '// 毎回再読み込みするときは "REFRESH" を指定
            .Range("A1").Value = Now()
            If sp > .Range("C1").Value Then .Range("C1").Value = sp
            If sp < .Range("D1").Value Then .Range("D1").Value = sp
            .Range("E1").Value = sp
            DoEvents
            DoEvents
            DoEvents
        Loop
    End With
    ie.Quit
End Sub

'//----------------------------
Function GetSpotValue(ie, URL As String)
'//----------------------------
    Select Case UCase(URL)
        Case "REFRESH": ie.refresh
        Case "":
        Case Else
            ie.navigate URL
    End Select
    ie.visible = False
    Do While ie.Busy Or ie.ReadyState < 4
        DoEvents
    Loop
    
    GetSpotValue = ie.Document.getElementById("spot").innerText
End Function
他9件のコメントを見る
id:iwana1999

回答を頂きまして有り難うございます。
データーの更新は1~4秒程度で更新されますが、更新してからデーターを取得する方法が分かりませんので1秒前後毎に取得しています。

回答頂きましたコードでいろいろ試してみたいと思います。
有り難うございました。m(_ _)m

2013/10/06 18:55:01
id:iwana1999

spotデーターが1行目のセルに表示されています。
いままで長い間無い知恵を絞ってuwscで取得していましたが、セクセル単体で取得する事が出来て感激しています。
今後も質問する事があると思いますが宜しくお願い致します。

2013/10/06 19:13:28

その他の回答1件)

id:taknt No.1

回答回数13539ベストアンサー獲得回数1198

http://www.uwsc.info/sample.html

ここにあるサンプルが役に立ちます。

// IE上に表示されている文字 「です」を 「だす」に書き換える、カラーも変更  #n62

IE = GETACTIVEOLEOBJ("InternetExplorer.Application")
s = IEGETSRC(IE, "body")
s = Replace(s, "です", "<font color='#FFFFFF' style='background-color:#996633'>だす</font>")
IESETSRC(IE, s, "body")



s = IEGETSRC(IE, "body")
ここで ホームページの内容を 変数のsに取得します。

これが
>あるいは、あるサイトをバックグランドで動かして、そのページからテキストデーターを取る方法があるでしょうか。

ですね。

私は 1000ポイント欲しいので回答しますが、私が回答することにより
ポイントが減る可能性があるから コメントしている人も回答するかもしれないですね。

他3件のコメントを見る
id:iwana1999

きゃづみい様
回答を頂きまして有り難うございました。
補足質問をさせて頂きましたが、他の方から回答を頂きましたので、今回はこれで終了とさせて頂きます。 
悪しからずご了承下さい。

2013/10/06 10:12:26
id:taknt

やり方としては idから取得するのと ホームページのソースから取得するという二通りのやり方が あると思います。

サンプルソースもいろいろ提示されていますので、いろいろ試してみたらいいと思いますよ。

2013/10/06 14:29:32
id:iwana1999

私のつたないスクリプトを書きます。

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

IE = CREATEOLEOBJ("InternetExplorer.Application")

IE.visible = true

IE.navigate("https://www.binary.com/d/trade.cgi?l=JA")


//エクセルのファイルを開く

EXCEL = CREATEOLEOBJ("Excel.Application")

EXCEL.visible = true

Excel.WorkBooks.Open(FileName :="C:\Users\Hsuzuk\Desktop\UWSC\4本値.xlsm")

OO =0

HH =0

CC =0

LL =9000000000


while true

GETTIME

SS = G_TIME_SS

mm = G_TIME_nn

mmm = mm mod 5

//取得したデーターをエクセルのセルE1に入力する。

ifb mmm=0 and ss=0 then

EXCEL.RANGE("B1").value = OO

EXCEL.RANGE("C1").value = HH

EXCEL.RANGE("D1").value = LL

EXCEL.RANGE("E1").value = CC

OO=0

HH =0

LL =9000000000

endif

atai = PosACC(0, 304, 400) // マウスカーソル下の文字取得

sleep(0.1)

print "ss =" + ss

//print "atai =" +atai


if OO = 0 then OO = atai

if HH < atai then HH = atai

if LL > atai then LL = atai

CC= atai


sleep(0.1)

print "O = " + OO

print "H = " +HH

print "L = " + LL

print "C = " + CC

sleep(0.5)

wend

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

上記のatai(スポットの数値)をバックグランド又はIE画面を最小化させて稼動したいのですが、どのようにすれば良いでしょうか?

スクリプトを書いて頂けると助かります。

id:Mook No.2

回答回数1314ベストアンサー獲得回数393ここでベストアンサー

ポイント1000pt

取ったデータをどう表示したいのかが分かりませんが、
今回の内容だと UWSC を使わなくともEXCEL だけでできそうな気がします。

Web からのデータ取得はフォームやタグから位置を特定して値をとるのが定石です。
今回の場合スポットには id="spot" が付いていますから、getElementByID で取得
出来ます。

VBAでスポット値をとるサンプルです。

Sub Sample()
  MsgBox GetSpotValue()
End Sub

Function GetSpotValue()
  Dim ie As Object
  Set ie = CreateObject("InternetExplorer.Application")
    
  ie.navigate "https://www.binary.com/d/trade.cgi?l=JA"
  Do While ie.Busy Or ie.ReadyState < 4
    DoEvents
  Loop
  GetSpotValue = ie.Document.getElementById("spot").innerText
  ie.Quit
End Function

5分ごとにセルを更新するなら OnTime で記録する処理を呼び出せばこんな感じで
できるでしょうか。
http://officetanaka.net/excel/vba/tips/tips114.htm

Sub StartUpdate()
    Dim sp
    sp = GetSpotValue()
    Range("A1").Value = Now()
    Range("B1").Value = sp
    Range("C1").Value = sp
    Range("D1").Value = sp
    Range("E1").Value = sp
    Application.OnTime Application.Ceiling(Now, TimeValue("00:05:00")), "UpdateSpot"
End Sub

Sub StopUpdate()
    Application.OnTime Application.Ceiling(Now, TimeValue("00:05:00")), "UpdateSpot",,False
End Sub

Sub UpdateSpot()
    Dim sp
    sp = GetSpotValue()

    Range("A1").Value = Now()
    If sp > Range("C1").Value Then Range("C1").Value = sp
    If sp < Range("D1").Value Then Range("D1").Value = sp
    Range("E1").Value = sp

    Application.OnTime Application.Ceiling(Now + TimeValue("00:00:01"), TimeValue("00:05:00")), "UpdateSpot"
End Sub

Function GetSpotValue()
    Dim ie As Object
    Set ie = CreateObject("InternetExplorer.Application")
    
    ie.navigate "https://www.binary.com/d/trade.cgi?l=JA"
    Do While ie.Busy Or ie.ReadyState < 4
        DoEvents
    Loop
    GetSpotValue = ie.Document.getElementById("spot").innerText
    ie.Quit
End Function

IE の更新自体それほど高速ではないので、秒単位の処理はあまり意味がないと
思いますが、もともと EXCEL で何かしらの処理をしているようですから、
そこに組み込んだ方が効率がよさそうな気がします。




期待通り動くかどうかわかりませんが、毎秒のコード例です。

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

'//----------------------------
Sub UpdatingSpot()
'//----------------------------
    Dim ie As Object
    Set ie = CreateObject("InternetExplorer.Application")
    
    Dim sp As Double
    With Worksheets("Sheet1")
    
        MsgBox "終了するときは A2 を消去してください。"
        .Range("A2").Value = "更新中"
        .Activate
        .Range("A2").Activate
        .Range("A1").NumberFormat = "hh:mm:ss"
        sp = GetSpotValue(ie, "https://www.binary.com/d/trade.cgi?l=JA")
        .Range("A1").Value = Now()
        .Range("B1").Value = sp
        .Range("C1").Value = sp
        .Range("D1").Value = sp
        .Range("E1").Value = sp
        
        Do While .Range("A2").Value <> ""
            Sleep 1000 '// msec
            sp = GetSpotValue(ie, "")
        '   sp = GetSpotValue(ie, "REFRESH") '// 毎回再読み込みするときは "REFRESH" を指定
            .Range("A1").Value = Now()
            If sp > .Range("C1").Value Then .Range("C1").Value = sp
            If sp < .Range("D1").Value Then .Range("D1").Value = sp
            .Range("E1").Value = sp
            DoEvents
            DoEvents
            DoEvents
        Loop
    End With
    ie.Quit
End Sub

'//----------------------------
Function GetSpotValue(ie, URL As String)
'//----------------------------
    Select Case UCase(URL)
        Case "REFRESH": ie.refresh
        Case "":
        Case Else
            ie.navigate URL
    End Select
    ie.visible = False
    Do While ie.Busy Or ie.ReadyState < 4
        DoEvents
    Loop
    
    GetSpotValue = ie.Document.getElementById("spot").innerText
End Function
他9件のコメントを見る
id:iwana1999

回答を頂きまして有り難うございます。
データーの更新は1~4秒程度で更新されますが、更新してからデーターを取得する方法が分かりませんので1秒前後毎に取得しています。

回答頂きましたコードでいろいろ試してみたいと思います。
有り難うございました。m(_ _)m

2013/10/06 18:55:01
id:iwana1999

spotデーターが1行目のセルに表示されています。
いままで長い間無い知恵を絞ってuwscで取得していましたが、セクセル単体で取得する事が出来て感激しています。
今後も質問する事があると思いますが宜しくお願い致します。

2013/10/06 19:13:28
  • id:windofjuly
    うぃんど 2013/10/05 20:47:19
    1000ポイントもいらないからコメントにしておきます。

    表示させた状態でまずは作って動作確認の後、
    IEオブジェクト.visible = False で非表示にしてもう一度動作確認

    手馴れてくれば最初から非表示でもかまわないけれど、
    困ったときは表示状態に変えて確認することになるのは同じです。


  • id:windofjuly
    うぃんど 2013/10/05 21:50:33
    IEGETSRC はソースをそのまま読み込む場合に使うものだから、
    「バックグランドで動かして」には該当しないとだけコメントしておきます。

    >ポイントが減る可能性

    それはどうでしょうね。
    本題とかけ離れてる話しか含まれてない回答のままではキャンセルかもしれませんよ。
  • id:iwana1999
    コメントを頂きまして有り難うございます。

    あるサイトで、カーソル下のデーター取得を行っています。
    IE = CREATEOLEOBJ("InternetExplorer.Application")
    IE.visible = true
    IE.navigate("https://www.binary.com/d/trade.cgi?l=JA")
    atai = PosACC(0, 304, 400) // マウスカーソル下の文字取得

    このサイトを非表示にして画面上で他の仕事したいと考えて、IE.visible=falseにした結果、
    IE.visible=trueにして、サイト画面を最小化したときと同じ結果になりました。
    因みに取得データーは「デスクトップ画面」でした。

    そこで、やり方がまずかったのかなと思って質問した次第です。

    もしお判りでしたら、回答をお願いしたいのですが。。。
    宜しくお願い致します。
  • id:taknt
    やはり IEオブジェクト.visible = False なんて回答では ぜんぜん役に立たないですね。

    ま、だから コメントにしたんだろうと思うけど。

    理解できていないくせに、他人の回答にケチをつける人がいて困りますよね。
  • id:windofjuly
    うぃんど 2013/10/06 00:51:10
    なるほどカーソルではなく、マウスカーソルだったのですね。
    非表示や最小状態だとマウスで指せないので無理ですが、
    対象がはっきりしているのでid指定を使えば取りに行けそうです。

    「バックグランドで動かして」と書いてあったので、
    javascriptか何かで動いていることを気にしていたのですが、
    スポットの部分を取るだけであれば次のような形でやってみてください。

    atai = IEGetData( IE, "TAG=span" , "id=spot" )

    動作確認してませんし、
    きゃづみぃ(id:taknt)にいくつかの質問で難癖付けられたりして困ってますので、
    この件はひとまず退きます。ごきげんよう。
  • id:taknt
    毎回、上記の人に 難癖をつけられているのは 私のほうなんですけどね。
    ま、わからないなら そういえばいいのに、人のせいにして 逃げるというのも ひきょうですよね?


    マウスカーソル下の文字取得とありますが、そのクライアント座標Xとクライアント座標Yは
    どういう決め方で その位置なんでしょうか?
  • id:iwana1999
    ういんど 様

    コメントを頂きまして有り難うございます。
    >atai = IEGetData( IE, "TAG=span" , "id=spot" )

    上記の通りに行いましたら、ウィンドウを最小化しても見事にデーターを連続取得する事ができました。

    ういんど様の回答は私の欲していた内容そのものですが、このままではお礼が出来ません。

    カーソルとマウスカーソルの違いも分からない初心者ですが、回答欄で教えて頂けませんでしょうか。
    宜しくお願い致します。
  • id:Mook
    上記が欲しい回答でしたら、
    質問キャンセルでポイント送信でもいいかと思います。
  • id:taknt
    そうですね。本人ももう書きこまないことを宣言されていますので、ぜひキャンセルすることを おすすめします。
  • id:Mook
    本来の質問である UWSC での Web 情報の取得に対しては、
    ういんどさんが最初に回答されていますので、
    ポイントの一部はういんどさんに送りました。

    ブラウザから情報を取得するという機能ではUWSC でも EXCEL でも
    実行している内容は一緒ですので、表示を EXCELにこだわらず UWSC の
    吹き出しなどを使えば逆に UWSC のみの実現も出来たかと思います。
  • id:Mook
    過去の質問を見たら、取得した値をさらに列で管理しているんですね。

    イベント処理をするより最初から追加しながら記録した方がよさそうですね。

        .Range("A1").NumberFormat = "hh:mm:ss"
        .Range("D5:D" & Rows.Count).NumberFormat = "hh:mm:ss" '<< 追加
    ループの中に
        .Range("E1").Value = sp
        r = Application.Max(5, .Cells(Rows.Count, "E").End(xlUp).Row) '<< 追加
        If DateDiff("s", Cells(r, "D").Value, Now) > 300 Then '<< 追加
          .Cells(r + 1, "D").Value = Now '<< 追加
          .Cells(r + 1, "E").Value = sp '<< 追加
        End If '<< 追加
    を追加すれば、今実行している(?)シートイベント処理は不要になると思います。
    (というか、消しておいた方がいいかな。)
  • id:iwana1999
    Mook様

    ポイント一部をういんど様へ送って頂いた件、お手数をお掛けして申し訳ありませんでした。 はてなの使い方も良くわからずにコメント頂いた方にもポイントを送る事が出来ることを知りませんでしたので大変助かりました。

    また、上記コメントでコードの一部変更をご教示頂きまして有り難うます。
    VBAは敷居が高いのですが、試して見たいとおもいます。

  • id:taknt
    ポイントの送信の仕方は 簡単です。

    https://www.hatena.ne.jp/shop/point/sendpoint

    このページにきて 送信先はてなIDと送信ポイント、メッセージを記載して 送信すればいいだけです。
  • id:iwana1999
    きやづみい様

    ポイント送信をご教示頂きまして有り難うました。
    次回からは、キャンセルとポイント送信を用途に応じて使用したいと思います。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません