ブラウザのデータをエクセルで表示させるには?

ブラウザでは株価がJavascriptで表示されています。
それをリアルタイムでエクセルに反映させたいのですが、何か良い方法はないでしょうか?
(楽天のRSSを使う方法はなしで)
私が思いつくのは、ブラウザのデータを全部コピー。
それをそのままエクセルに貼り付け、必要なところだけ抜き出し。
これを繰り返す!(重そう)

この程度です。
もしExcelVBA以外の方法で簡単に実現できるならその方法でもかまいません。
何かいい方法はないでしょうか?
ExcelVBAも初心者なので参考になるコードを書いていただければ大変助かります。

回答の条件
  • 1人50回まで
  • 登録:2011/07/06 00:58:29
  • 終了:2011/07/08 10:57:54

ベストアンサー

id:ken3memo No.7

ken3memo回答回数246ベストアンサー獲得回数772011/07/07 09:15:43

ポイント1000pt

>三流君 Ken3さん

具体的にはログイン後のサイトになるので例として

http://www.cyberagentfx.jp/

この上の方に表示されているレートを取得したいです。

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 空白を判断してセットする

そんな感じでした。

何かの参考となれば、幸いです。

id:lupink

ありがとうございます。

リアルタイム取得の部分・解析の部分が解決しました。

2011/07/08 10:50:28

その他の回答(6件)

id:SweetSmile1978 No.1

SweetSmile1978回答回数191ベストアンサー獲得回数292011/07/06 07:49:06

id:lupink

htmlをダウンロードしてそのなかの必要な情報を取り出すということでしょうか?

Javascriptをつかって表示される数字がソースには記載されないようでうまくいきませんでした。

解決策をご存知であれば教えてください。

2011/07/06 10:29:39
id:nikodesu No.2

ニコ回答回数1025ベストアンサー獲得回数392011/07/06 07:57:09

ポイント10pt

これでいけるんじゃないでしょうか?

いろいろできると楽しいですね。

http://www.atmarkit.co.jp/fwin2k/win2ktips/320webquery/webquery.html

http://office.microsoft.com/ja-jp/excel-help/HA010369709.aspx

id:lupink

この方法の場合、

>1分間に1度しか更新されないのでリアルタイムにならない。

>javascriptで書かれている部分が取得できない。

ので断念しました、これらの解決策があれば教えて欲しいです。

2011/07/06 10:25:30
id:taknt No.3

きゃづみぃ回答回数13539ベストアンサー獲得回数11982011/07/06 10:35:29

ポイント100pt
    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の内容を 解析して セルにセットすればいいです。

アドレスは 変更してください。

id:lupink

このソースはken3memoでも見たのですが、質問にあるとおり重そうでリアルタイムとはいかないとおもいました。

またjavascriptで書かれて表示されている株価はソースには記載されていないので拾うことが出来ないのではないでしょうか?

2011/07/06 11:03:40
id:a-kuma3 No.4

a-kuma3回答回数4563ベストアンサー獲得回数19082011/07/06 12:36:03

ポイント20pt

なるほど。ソースに無いものは取得できないのですね。

id:taknt さんのコメントを勘違いしてるよ。

javascript で、ページの内容が変わるとしても、ブラウザの表示として見えてるってことは、

innerHTML には反映されてる。


No.1、No.2 は http の応答をテキストとして取得してるだけだから、javascript が動作して

変化するところが反映できないけど、

No.3 は、IE のコントロールを使ってるので、それが javascript も解釈してくれている。


後は、リアルタイムで、ってところを、どう作るかですよね。

id:lupink

takntさんの回答でデータの取得部分は実現できるのですね。

私の勉強不足で理解できませんでした。

コメントありがとうございます。

2011/07/06 12:55:51
id:ryomachan No.5

さりょう™回答回数47ベストアンサー獲得回数12011/07/06 18:26:51

ポイント10pt

パソコンのことは少し詳しいですがすいません僕には分かりません

    (すいません)m(__)m

また今度調べますので少し待っていてくださいorz

id:lupink

回答ありがとうございます。

2011/07/07 01:50:34
id:TAKEKAI No.6

km副リーダー回答回数4ベストアンサー獲得回数02011/07/06 18:38:17

ポイント10pt

それでいいのでは!?

id:lupink

書いていただいたソースで試行錯誤しているところです。

回答ありがとうございます。

2011/07/07 01:51:03
id:ken3memo No.7

ken3memo回答回数246ベストアンサー獲得回数772011/07/07 09:15:43ここでベストアンサー

ポイント1000pt

>三流君 Ken3さん

具体的にはログイン後のサイトになるので例として

http://www.cyberagentfx.jp/

この上の方に表示されているレートを取得したいです。

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 空白を判断してセットする

そんな感じでした。

何かの参考となれば、幸いです。

id:lupink

ありがとうございます。

リアルタイム取得の部分・解析の部分が解決しました。

2011/07/08 10:50:28
  • id:taknt
    重そうといっても 普通に ブラウザを開いて ソースを持ってくるだけです。

    ソースになければ 拾うことは できないです。

    画面を表示する設定にして 開いたら 画面をキャプチャして テキストをクリップボードに転送させるしかないでしょう。
  • id:lupink
    なるほど。ソースに無いものは取得できないのですね。
    となると、「画面をキャプチャして テキストをクリップボードに転送」しか方法がなさそうですね。
    ありがとうございます。
  • id:SweetSmile1978
    http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1351390768
  • id:ken3memo
    証券会社のツールか何かで、自分の指定した銘柄の現値や出来高が
    >ブラウザでは株価がJavascriptで表示されています。
    なのかなぁ?
    証券会社名や使っているサイトを教えてもらえると、回答が付きやすいのかなぁ?
    ※あまり詳しく書くと、その会社の規約では データの~は認められていない..など別な回答も付く可能性はあるけど。

    あと気になるのは、分析ツール・銘柄表示ボードなどは、 Javaアプレット で 独自通信して高速表示を行っている会社が多いのですが、Javascriptで表示は、ソースか何かで確認されたのですか?
    逆にJavascriptでセットしているソースを出してもらえると、セットしているidや書き換えているDIVなどを横取り?とか、javascriptのプロの人たちが回答を書いてくれる可能性もあるかも。

    以上、回答じゃないので、コメントで失礼します。

  • id:a-kuma3
    >セットしているidや書き換えているDIVなどを横取り?とか、
    だから、innerHTML で取れる、って taknt さんが回答してくれてるじゃない :-(
  • id:lupink
    >SweetSmile1978さん
    私の勉強不足でリンク先の質問とどういう関連があるのかわかりません。
    すいません・・・。
    >三流君 Ken3さん
    具体的にはログイン後のサイトになるので例として
    http://www.cyberagentfx.jp/
    この上の方に表示されているレートを取得したいです。
  • id:lupink
    教えていただいたコードにURL
    http://www.cyberagentfx.jp/を当てはめると
    innerHTMLでは為替レートは取得できず。
    innerTEXTで取得できます。

    ですが、
    http://www.igmarkets.co.jp/のようなサイトの場合どの方法でも取得できません。

    Sub てすと()
    Dim objIE As Object '変数を定義します。
    Dim objINPUT As Object 'Inputタグ格納用

    'IEの起動
    Set objIE = CreateObject("InternetExplorer.Application") 'オブジェクトを作成します。
    objIE.Visible = False '可視、Trueで見えるようにします。

    '処理したいページを表示します。
    objIE.Navigate "http://www.cyberagentfx.jp/"

    'ページの表示完了を待ちます。
    While objIE.ReadyState <> 4 Or objIE.Busy = True '.ReadyState <> 4の間まわる。
    DoEvents '重いので嫌いな人居るけど。
    Wend

    Range("A1") = objIE.document.all(1).innerHTML

    End Sub
  • id:lupink
    私なりの理解ですが、takntさんがコメントで書いてくださった、
    「画面を表示する設定にして 開いたら 画面をキャプチャして テキストをクリップボードに転送させるしかないでしょう。」
    この方法が今回の質問の「リアルタイムでエクセルに反映させたい」に近いような気がします。
    サイトになんどもアクセスして取得するとサーバーに負荷をかけるような気がします。


    最初質問した時点では、
    〇〇という方法を使えば、ウエブサイトのデータとリアルタイム同期できるヨみたいな簡単なことだろうと思っていました。実際はかなり難易度が高いようですね。

    回答やコメントいただいたものにはすべて返事したいと思いますが、なにぶん私自身の知識が低いため的を得ない返答になっているかもしれません。ご理解ください、またその際はご指摘ください。
  • id:ryomachan
    これってリアルタイムですよね?
    (リアルタイム難しいな~~)
  • id:lupink
    さりょうさんコメントありがとうございます。
    三流君 Ken3さんの回答で解決しました。
  • id:lupink
    解決したので回答を締め切ります。
    皆様回答ありがとうございました。

    >takntさん
    「重そうでリアルタイムとはいかないとおもいました。」
    と返信したのは、私の勘違いです。
    その時点では、毎回ウエブサイトにアクセスする必要があるのだと思っていました。

    >a-kuma3さん
    ご指摘ありがとうございました

    >三流君 Ken3さん
    詳細なコードを書いていただきありがとうございました。
    とても役立ちました。
    また質問方法もアドバイスありがとうございました。

    >回答・コメントくださった皆様
    皆様のおかげで解決できました。
    ありがとうございました。

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

トラックバック

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

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

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません