ブラウザでは株価がJavascriptで表示されています。
それをリアルタイムでエクセルに反映させたいのですが、何か良い方法はないでしょうか?
(楽天のRSSを使う方法はなしで)
私が思いつくのは、ブラウザのデータを全部コピー。
それをそのままエクセルに貼り付け、必要なところだけ抜き出し。
これを繰り返す!(重そう)
この程度です。
もしExcelVBA以外の方法で簡単に実現できるならその方法でもかまいません。
何かいい方法はないでしょうか?
ExcelVBAも初心者なので参考になるコードを書いていただければ大変助かります。
>三流君 Ken3さん
具体的にはログイン後のサイトになるので例として
この上の方に表示されているレートを取得したいです。
http://www.cyberagentfx.jp/ の レート取得なら、
ソースを見ると、
ratebox と id,識別の名前がついているので、
taknt さんのサンプルソースを改造して、
a-kuma さんのアドバイス、
>javascript で、ページの内容が変わるとしても、ブラウザの表示として見えてるってことは、innerHTML には反映されてる。
ってことなので、下記のようにテストしてみました。
Sub test() Dim objIE As Object '変数を定義します。 'IEの起動 Set objIE = CreateObject("InternetExplorer.Application") 'オブジェクトを作成します。 objIE.Visible = True '可視、Trueで見えるようにします。 '処理したいページを表示します。 objIE.Navigate "http://www.cyberagentfx.jp/" 'ページの表示完了を待ちます。 While objIE.ReadyState <> 4 Or objIE.Busy = True '.ReadyState <> 4の間まわる。 DoEvents '重いので嫌いな人居るけど。 Wend 'ページ表示後、テストで取得を繰り返す Dim y As Integer '行カウンター Dim x As Integer '列カウンター Dim c As String '現在の値 Dim strOLD As String '前の値を覚える Dim time10 As Date '10秒先を保存 Dim tmp As Variant 'スペース区切りで分割させたかったので Dim i As Integer 'ループのカウンター 'ループ前 の 初期処理 strOLD = "初期化" 'はじめは一致させたくないので、適当に初期化 y = 5 '気分で5行目からテストでセット time10 = DateAdd("s", 20, Now()) '20秒後を計算 Cells(3, 1) = time10 & " までテストする" While Now() <= time10 '20秒間だけ回りたいので c = objIE.document.all("ratebox").innerTEXT 'ID ratebox の テキストを取得 If c <> strOLD Then '前回の値と違ったら?※処理が重いと次を取りこぼすけど '値をセットする Cells(y, 1) = Now 'テストで時刻のセット Cells(y, 2) = Replace(c, vbCrLf, "") '("ratebox").innerTEXT 元の値を改行消してテストでセット '改行で区切って、テストでセット tmp = Split(c, vbCrLf) '改行区切りで取り出す x = 3 '列3からセット For i = 0 To UBound(tmp) 'ループで配列をセット If Trim(tmp(i)) <> "" Then 'データありの時セットする、空白は飛ばす Cells(y, x) = tmp(i) x = x + 1 End If Next i '次の準備 y = y + 1 '次の位置へ strOLD = c '値を覚える End If 'ふざけて現在時刻を描画? Cells(4, 1) = Now() & " テスト中" DoEvents Wend Cells(4, 1) = "テスト終了" objIE.Quit 'IEを閉じる End Sub
↑少し、テストが甘いけど、こんな感じで、
id=ratebox から データを抜き出してみました。
※抜くといっても、
c = objIE.document.all("ratebox").innerTEXT で 改行で区切られたテーブルデータを取得して、
tmp = Split(c, vbCrLf) Splitで分解
For i = 0 To UBound(tmp) で ループ
If Trim(tmp(i)) <> "" Then 空白を判断してセットする
そんな感じでした。
何かの参考となれば、幸いです。
このあたりが参考になるかと。
htmlをダウンロードしてそのなかの必要な情報を取り出すということでしょうか?
Javascriptをつかって表示される数字がソースには記載されないようでうまくいきませんでした。
解決策をご存知であれば教えてください。
これでいけるんじゃないでしょうか?
いろいろできると楽しいですね。
http://www.atmarkit.co.jp/fwin2k/win2ktips/320webquery/webquery.html
http://office.microsoft.com/ja-jp/excel-help/HA010369709.aspx
この方法の場合、
>1分間に1度しか更新されないのでリアルタイムにならない。
>javascriptで書かれている部分が取得できない。
ので断念しました、これらの解決策があれば教えて欲しいです。
Dim objIE As Object '変数を定義します。 Dim objINPUT As Object 'Inputタグ格納用 'IEの起動 Set objIE = CreateObject("InternetExplorer.Application") 'オブジェクトを作成します。 objIE.Visible = False '可視、Trueで見えるようにします。 '処理したいページを表示します。 objIE.Navigate "http://q.hatena.ne.jp/1309881508" 'ページの表示完了を待ちます。 While objIE.ReadyState <> 4 Or objIE.Busy = True '.ReadyState <> 4の間まわる。 DoEvents '重いので嫌いな人居るけど。 Wend c = objIE.document.all(1).innerHTML
指定してURLのソースを変数 c に 取得します。
このあと cの内容を 解析して セルにセットすればいいです。
アドレスは 変更してください。
このソースはken3memoでも見たのですが、質問にあるとおり重そうでリアルタイムとはいかないとおもいました。
またjavascriptで書かれて表示されている株価はソースには記載されていないので拾うことが出来ないのではないでしょうか?
なるほど。ソースに無いものは取得できないのですね。
id:taknt さんのコメントを勘違いしてるよ。
javascript で、ページの内容が変わるとしても、ブラウザの表示として見えてるってことは、
innerHTML には反映されてる。
No.1、No.2 は http の応答をテキストとして取得してるだけだから、javascript が動作して
変化するところが反映できないけど、
No.3 は、IE のコントロールを使ってるので、それが javascript も解釈してくれている。
後は、リアルタイムで、ってところを、どう作るかですよね。
takntさんの回答でデータの取得部分は実現できるのですね。
私の勉強不足で理解できませんでした。
コメントありがとうございます。
パソコンのことは少し詳しいですがすいません僕には分かりません
(すいません)m(__)m
また今度調べますので少し待っていてくださいorz
回答ありがとうございます。
>三流君 Ken3さん
具体的にはログイン後のサイトになるので例として
この上の方に表示されているレートを取得したいです。
http://www.cyberagentfx.jp/ の レート取得なら、
ソースを見ると、
ratebox と id,識別の名前がついているので、
taknt さんのサンプルソースを改造して、
a-kuma さんのアドバイス、
>javascript で、ページの内容が変わるとしても、ブラウザの表示として見えてるってことは、innerHTML には反映されてる。
ってことなので、下記のようにテストしてみました。
Sub test() Dim objIE As Object '変数を定義します。 'IEの起動 Set objIE = CreateObject("InternetExplorer.Application") 'オブジェクトを作成します。 objIE.Visible = True '可視、Trueで見えるようにします。 '処理したいページを表示します。 objIE.Navigate "http://www.cyberagentfx.jp/" 'ページの表示完了を待ちます。 While objIE.ReadyState <> 4 Or objIE.Busy = True '.ReadyState <> 4の間まわる。 DoEvents '重いので嫌いな人居るけど。 Wend 'ページ表示後、テストで取得を繰り返す Dim y As Integer '行カウンター Dim x As Integer '列カウンター Dim c As String '現在の値 Dim strOLD As String '前の値を覚える Dim time10 As Date '10秒先を保存 Dim tmp As Variant 'スペース区切りで分割させたかったので Dim i As Integer 'ループのカウンター 'ループ前 の 初期処理 strOLD = "初期化" 'はじめは一致させたくないので、適当に初期化 y = 5 '気分で5行目からテストでセット time10 = DateAdd("s", 20, Now()) '20秒後を計算 Cells(3, 1) = time10 & " までテストする" While Now() <= time10 '20秒間だけ回りたいので c = objIE.document.all("ratebox").innerTEXT 'ID ratebox の テキストを取得 If c <> strOLD Then '前回の値と違ったら?※処理が重いと次を取りこぼすけど '値をセットする Cells(y, 1) = Now 'テストで時刻のセット Cells(y, 2) = Replace(c, vbCrLf, "") '("ratebox").innerTEXT 元の値を改行消してテストでセット '改行で区切って、テストでセット tmp = Split(c, vbCrLf) '改行区切りで取り出す x = 3 '列3からセット For i = 0 To UBound(tmp) 'ループで配列をセット If Trim(tmp(i)) <> "" Then 'データありの時セットする、空白は飛ばす Cells(y, x) = tmp(i) x = x + 1 End If Next i '次の準備 y = y + 1 '次の位置へ strOLD = c '値を覚える End If 'ふざけて現在時刻を描画? Cells(4, 1) = Now() & " テスト中" DoEvents Wend Cells(4, 1) = "テスト終了" objIE.Quit 'IEを閉じる End Sub
↑少し、テストが甘いけど、こんな感じで、
id=ratebox から データを抜き出してみました。
※抜くといっても、
c = objIE.document.all("ratebox").innerTEXT で 改行で区切られたテーブルデータを取得して、
tmp = Split(c, vbCrLf) Splitで分解
For i = 0 To UBound(tmp) で ループ
If Trim(tmp(i)) <> "" Then 空白を判断してセットする
そんな感じでした。
何かの参考となれば、幸いです。
ありがとうございます。
リアルタイム取得の部分・解析の部分が解決しました。
ありがとうございます。
リアルタイム取得の部分・解析の部分が解決しました。