人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

●質問者: iwana1999
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● きゃづみぃ
●0ポイント

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ポイント欲しいので回答しますが、私が回答することにより
ポイントが減る可能性があるから コメントしている人も回答するかもしれないですね。


iwana1999さんのコメント
他の方もコメントして頂いていま卯が、上記の回答は私の質問から外れているように思います。 私は初心者ですので詳しいことは分かりません。 ポイントを1000にしたのは、具体的なスクリプトコードを教えて頂きたいとの重いからです。 宜しくお願い致します。

きゃづみぃさんのコメント
カーソルの位置は どうやって 決めているのでしょうか? ホームページの内容を すべて 取得すれば、それらの どこかにある可能性もあります。 なので、やり方によっては 回答のようにしても やれるはずです。

きゃづみぃさんのコメント
あと >あるサイトをバックグランドで動かして、そのページからテキストデーターを取る方法 そのページの内容をテキストとして取得ととらえましたが、別の意味があるのでしょうか? それでしたら、そのように 質問の補足を していただけませんでしょうか?

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

きゃづみぃさんのコメント
やり方としては idから取得するのと ホームページのソースから取得するという二通りのやり方が あると思います。 サンプルソースもいろいろ提示されていますので、いろいろ試してみたらいいと思いますよ。

質問者から

私のつたないスクリプトを書きます。
------------------------------------------------------------------
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画面を最小化させて稼動したいのですが、どのようにすれば良いでしょうか?
スクリプトを書いて頂けると助かります。


2 ● Mook
●1000ポイント ベストアンサー

取ったデータをどう表示したいのかが分かりませんが、
今回の内容だと 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

a-kuma3さんのコメント
ループで回すんだったら、ie = Nothing するか、最初に一回だけ作るようにしておかないと。

Mookさんのコメント
コメントどうも。 厳密に言えばその方がお行儀いいのでしょうけれど、変数のスコープは関数 内ですから、適当なタイミングでガベコレされるからいいや。 と、ちょっと適当です。 以前 MSでVBのプログラム開発者(だった気がする)が Set xx=Nothing の 要否論の記事を書いていて 「End Sub でリリースされるリソースを終了前にわざわざ解放宣言するのは 意味がない」というような論旨だったと思うのですが、それ以降 ループ内で重複生成するような場合以外は私は Nothing 不要派ですw。

Mookさんのコメント
これだったかな? http://blogs.msdn.com/b/ericlippert/archive/2004/04/28/when-are-you-required-to-set-objects-to-nothing.aspx C#の開発者でしたね。 記事は VBS に関するものですが、書かれているポイントはVBAでも同じこと だと思います。 特に OnTime は単独の処理ですから、Public 変数でもスコープ外かな。

a-kuma3さんのコメント
なるほどー。 ぼくはつい書いちゃう方だなあ。 泣かされたことも多いので、イマイチ、信用できません。 # 信用できないのは、M$ の実装の方...

iwana1999さんのコメント
回答を頂きまして有り難うます。 本来なら、Mook様の仰る取りエクセル単体でデーター取得するのが良いと思いますので、VBAでスポット値をとるサンプルです。」を実行してみましたが、エクセル上なにも出てきませんでした。 初歩的なことで済みませんが、このコードをどのようにエクセルに貼り付けたら良いか教えて頂けませんでしょうか? 宜しくお願い致します。

Mookさんのコメント
あら、EXCEL の拡張子が XLSM だったのでマクロを使っていたかと思った のですが勘違いだったでしょうか。 EXCEL で ALT+F11 を押し、表示されたウィンドウで 「挿入」⇒「標準モジュール」で開いたウィンドウに上記をコピー。 ウィンドウを閉じてEXCEL に戻りALT+F8で、 StartUpdate か Sample を実行です。 停止する場合は同じように StopUpdate を実行です。

Mookさんのコメント
MS が信用できないのは、わかります。 未だに EXCEL にもたくさんのバグもどきがありますしw。 ADO など明示的に開放しないと残ってしまうなどいろいろな不具合が過去に ありましたしね。 ですが、そのあたりも流石にそろそろ枯れただろう、と。 もし、バグがあったらあったで、未知のことに関して、仕様外は気にしても キリがないとあきらめました。

iwana1999さんのコメント
Mook様 メッセージボックスにスポットの値を取ることが出来ました。 出来ましたら、データーを1秒毎に連続的に取得してE1セルに表示するまでを教えて頂けませんでしょうか。 現在この部分の処理をuwscで行っています。

Mookさんのコメント
そもそも元データが毎秒更新されていないと思うのですがどうなのでしょう。 また提示されたコードはページの更新をしていないように見えるのですが、 取得データはリアルタイムで変化しているのですか? そのあたりはご自身で調整ください。

iwana1999さんのコメント
回答を頂きまして有り難うございます。 データーの更新は1~4秒程度で更新されますが、更新してからデーターを取得する方法が分かりませんので1秒前後毎に取得しています。 回答頂きましたコードでいろいろ試してみたいと思います。 有り難うございました。m(_ _)m

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

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ