Excelで、指定したセルに画像や数値をHPから引っ張って来たいのですが、もし出来る方がおりましたらお願いします。


目的はその日の天気や気温をボタン一つでエクセル(日報等)に記入したいのです。
下記のHPで言えば左側のお天気マークや最高気温をボタン一つで表示させたいのですが。
http://weather.livedoor.com/area/20/72.html

HPの方は上記以外でも構いません。
天気と気温があれば良いです。

よろしくお願いします。

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

ベストアンサー

id:SALINGER No.2

回答回数3454ベストアンサー獲得回数969

ポイント200pt

説明不足で申し訳ありませんでした。

前に回答したものはインターネットからソースを取得してメッセージボックスに表示する基本的な部分だけでした。

まず、シートにコマンドボタンをつけるには以下のような感じです。

http://sigoto.co.jp/excel/activex/lesson07/activex2.htm

同時に画像を表示させるためのイメージをシート上の好きなところに配置します。(名前はそのままImage1です)

ボタンを押したときにコードが実行されるようにするには、ボタンをダブルクリックして開くところに以下のコードをコピペします。


そして天気の画像をエクセルのブックと同じところに用意します。

画像は1~30まで次のところにあります

http://image.weather.livedoor.com/img/icon/1.gif


Private Sub CommandButton1_Click()
    Dim ieo As Object
    Dim txt As String
    Dim pos As Long
    Dim pos2 As Long
    Dim tenki As String
    Dim kion As String
    Dim sp As Shape
    
    'IEオブジェクトの取得
    Set ieo = CreateObject("InternetExplorer.Application")
    ieo.Visible = False
    
    'ホームページを指定します
    ieo.NaviGate "http://weather.livedoor.com/area/20/72.html"

    '読みこまれるまでループさせます
    Do Until ieo.Busy = False
        Application.Wait Now + TimeValue("00:00:01")
    Loop
    
    'HTMLソースを取得します
    txt = ieo.Document.Body.InnerHtml
    
    '取得したソースから天気と最高気温を探します。
    'この部分はホームページの変更によってうまく動作しなくなることがあります。
    pos = InStr(InStr(1, txt, "今日の天気", vbTextCompare), txt, "<small>", vbTextCompare) + 7
    pos2 = InStr(pos, txt, "<")
    tenki = Mid(txt, pos, pos2 - pos)
    pos = InStr(InStr(pos, txt, "最高気温", vbTextCompare), txt, "<small>", vbTextCompare) + 7
    pos2 = InStr(pos, txt, "<")
    kion = Mid(txt, pos, pos2 - pos)
    
    'イメージの大きさを画像の大きさに合わせます
    Image1.AutoSize = True
    
    '以下は天気によって条件分岐して画像を表示するところです
    '2つの場合しか作っていませんが30個必要になります。
    Select Case tenki
        Case "晴れ"
            Image1.Picture = LoadPicture(ThisWorkbook.Path & "\1.gif")
            
        Case "曇時々雨"
            Image1.Picture = LoadPicture(ThisWorkbook.Path & "\10.gif")
    End Select
    
    '最高気温をA1セルに表示
    Range("A1").Value = kion
     
    Set ieo = Nothing
End Sub

ボタンを押すと、最高気温をA1セルに、天気を貼り付けたイメージに表示します。

id:bakuto

早速挑戦しました。うまく行きませんでした。


コマンドボタンを作りそこにコードはコピーしました。


>天気の画像をエクセルのブックと同じところに用意します。

これは同じ「フォルダ」に入れると言う意味で良いのですか?

とりあえず画像(30個)とエクセルファイルを同じフォルダに入れて回したところ、「実行時エラー'424' オブジェクトが必要です」と表示され

て、デバックを選択するとImage1.AutoSize = Trueの部分が黄色で表示されます。


私レベルでは原因が何か皆目検討もつかないので、すみませんが再回答の方よろしくお願いします。

2008/04/27 21:31:11

その他の回答1件)

id:SALINGER No.1

回答回数3454ベストアンサー獲得回数969

ポイント50pt

HTMLソースを取得して天気と気温を取得するVBAです。

ただし、IE6以下での方法です。(IE7の場合はちょっと変わります)

Sub Macro()
    Dim ieo As Object
    Dim txt As String
    Dim pos As Long
    Dim pos2 As Long
    Dim tenki As String
    Dim kion As String
    
    Set ieo = CreateObject("InternetExplorer.Application")
    ieo.Visible = False
    ieo.NaviGate "http://weather.livedoor.com/area/20/72.html"

    Do Until ieo.Busy = False
        Application.Wait Now + TimeValue("00:00:01")
    Loop
    
    txt = ieo.Document.Body.InnerHtml
    pos = InStr(InStr(1, txt, "今日の天気", vbTextCompare), txt, "<small>", vbTextCompare) + 7
    pos2 = InStr(pos, txt, "<")
    tenki = Mid(txt, pos, pos2 - pos)
    pos = InStr(InStr(pos, txt, "最高気温", vbTextCompare), txt, "<small>", vbTextCompare) + 7
    pos2 = InStr(pos, txt, "<")
    kion = Mid(txt, pos, pos2 - pos)
    
    MsgBox "今日の天気 : " & tenki & vbCrLf & "最高気温 : " & kion
    
    Set ieo = Nothing
End Sub

コードをボタンに貼り付けたり、変数tenki と kion にそれぞれ代入されるので、

それをシートのセルに表示したり、天気で条件分岐してアイコンを表示するなどいろいろできると思います。

id:bakuto

ブラボー!!

早速、挑戦してみます。

結果はコメント欄で。

2008/04/26 19:41:09
id:SALINGER No.2

回答回数3454ベストアンサー獲得回数969ここでベストアンサー

ポイント200pt

説明不足で申し訳ありませんでした。

前に回答したものはインターネットからソースを取得してメッセージボックスに表示する基本的な部分だけでした。

まず、シートにコマンドボタンをつけるには以下のような感じです。

http://sigoto.co.jp/excel/activex/lesson07/activex2.htm

同時に画像を表示させるためのイメージをシート上の好きなところに配置します。(名前はそのままImage1です)

ボタンを押したときにコードが実行されるようにするには、ボタンをダブルクリックして開くところに以下のコードをコピペします。


そして天気の画像をエクセルのブックと同じところに用意します。

画像は1~30まで次のところにあります

http://image.weather.livedoor.com/img/icon/1.gif


Private Sub CommandButton1_Click()
    Dim ieo As Object
    Dim txt As String
    Dim pos As Long
    Dim pos2 As Long
    Dim tenki As String
    Dim kion As String
    Dim sp As Shape
    
    'IEオブジェクトの取得
    Set ieo = CreateObject("InternetExplorer.Application")
    ieo.Visible = False
    
    'ホームページを指定します
    ieo.NaviGate "http://weather.livedoor.com/area/20/72.html"

    '読みこまれるまでループさせます
    Do Until ieo.Busy = False
        Application.Wait Now + TimeValue("00:00:01")
    Loop
    
    'HTMLソースを取得します
    txt = ieo.Document.Body.InnerHtml
    
    '取得したソースから天気と最高気温を探します。
    'この部分はホームページの変更によってうまく動作しなくなることがあります。
    pos = InStr(InStr(1, txt, "今日の天気", vbTextCompare), txt, "<small>", vbTextCompare) + 7
    pos2 = InStr(pos, txt, "<")
    tenki = Mid(txt, pos, pos2 - pos)
    pos = InStr(InStr(pos, txt, "最高気温", vbTextCompare), txt, "<small>", vbTextCompare) + 7
    pos2 = InStr(pos, txt, "<")
    kion = Mid(txt, pos, pos2 - pos)
    
    'イメージの大きさを画像の大きさに合わせます
    Image1.AutoSize = True
    
    '以下は天気によって条件分岐して画像を表示するところです
    '2つの場合しか作っていませんが30個必要になります。
    Select Case tenki
        Case "晴れ"
            Image1.Picture = LoadPicture(ThisWorkbook.Path & "\1.gif")
            
        Case "曇時々雨"
            Image1.Picture = LoadPicture(ThisWorkbook.Path & "\10.gif")
    End Select
    
    '最高気温をA1セルに表示
    Range("A1").Value = kion
     
    Set ieo = Nothing
End Sub

ボタンを押すと、最高気温をA1セルに、天気を貼り付けたイメージに表示します。

id:bakuto

早速挑戦しました。うまく行きませんでした。


コマンドボタンを作りそこにコードはコピーしました。


>天気の画像をエクセルのブックと同じところに用意します。

これは同じ「フォルダ」に入れると言う意味で良いのですか?

とりあえず画像(30個)とエクセルファイルを同じフォルダに入れて回したところ、「実行時エラー'424' オブジェクトが必要です」と表示され

て、デバックを選択するとImage1.AutoSize = Trueの部分が黄色で表示されます。


私レベルでは原因が何か皆目検討もつかないので、すみませんが再回答の方よろしくお願いします。

2008/04/27 21:31:11
  • id:bakuto
    ID:SALINGERさん。
    大変申し訳御座いません。
    VBAの知識が「ほぼ0」なのでもう少し回答欄でご指導お願いします。
    とりあえず、コードをコピーして貼り付けて回してみたのですが、上手い具合に行きませんでした。


    表示したいセルのアドレスは何処に入れれば良いですか?
    出来ればもう少し詳しくご指導お願いします。

  • id:SALINGER
    一つだけ確認
    Internet Exploreのバージョンは7でしょうか?6以下でしょうか?
  • id:bakuto
    Ver6.0.2・・・・・ですね。
    私も試行錯誤してみますが(無駄な努力かもしれないですが)よろしくお願いします。
  • id:bakuto
    もしかしてこのコードは小さく表示されるだけですか?

    今日の天気:曇時々雨
    最高気温:---

    と小さく出てきてOKを押さないとエクセルを操作できないのですが、それが正常なのですか?
  • id:SALINGER
    それで正常ですw
    HTMLソースを取得して、天気と気温を抜き出すだけのサンプルです。
    ボタンで動くようにしたり、セルに表示したりするのは難しくないと思ったのではぶきました。

    画像を表示させることで一つだけ注意しますと、画像をそのつど直接ホームページ上から取得するのは
    あまりよい方法ではありません。
    これは人のホームページの画像を自分のホームページで直接使うのと同じ行為だからです。
    その場合、全ての画像パターンを保存してから使うか自分で用意します。
    コードでは天気によって分岐させて、画像を表示させることになります。
  • id:bakuto
    >ボタンで動くようにしたり、セルに表示したりするのは難しくないと思ったのではぶきました。
    すみません、私のレベル(ド素人)では難しかったです。
    もし宜しければ回答の方でセルに表示させるやり方を教えていただけないでしょうか?


    >画像をそのつど直接ホームページ上から取得するのはあまりよい方法ではありません。
    そうなのですか。知りませんでした。
    個人的に使用するだけなのですが、あまり良くないのですね。
    それは法律上でダメなのですか?モラルとしてだめなのですか?
    こちらの方も宜しければおしえていただけますか?
  • id:SALINGER
    サイト上の文章を引用することは、もともとサイトは不特定多数に
    公開することを目的にしていますから問題はないのですが、サイト上の画像を
    直接リンクさせて自サイトなどで使うのは、本来と違う目的でリンク先のサイトに
    付加をかけることになるのでモラルとして駄目であると認識しています。
    EXCELの場合でもそのつど自動的に取得する機能というのは同じであると思えます。
    まあ、でも著作権なんてあって無いような物。
    サイト上のデータを自由に取得するのは面白いし、みんなやってることですね。
  • id:SALINGER
    >これは同じ「フォルダ」に入れると言う意味で良いのですか?
    エクセルのブックと同じフォルダにいれるという意味でいいです。
    >実行時エラー'424' オブジェクトが必要です
    ということはImage1がシート上に無いということです。
    作ったり消したりしてるとImage2とかImage3という名前がついていくので、
    イメージを選択状態にして右クリックのプロパティから(オブジェクト名)というところが
    Image1になっているか確認してみてください。
  • id:bakuto
    >Image1がシート上に無いということです。
    その通りでした。

    >同時に画像を表示させるためのイメージをシート上・・・・・・・
    これを作成する工程が抜けておりました。(と言うか理解しておりませんでした。)

    それと、
    >'2つの場合しか作っていませんが30個必要になります。
    これも作成しておりませんでした。


    こちらのミス及び理解不足で御手数を掛けてしまい、申し訳御座いませんでした。
    申し訳ないついで一つ質問ですが、下記の部分が今回のHPから天気と気温を抽出する大事な部分と思うのですが、この部分を理解するのに有用な書籍やHPをご存知ですか?
    今後HPの変更等の場合や他のHPから数値を引っ張って来るのに必須の知識と思うので、もし参考になる物を知っていたら教えていただけないでしょうか?
    よろしくお願いします。(返信は解答欄にお願いします。)


    '取得したソースから天気と最高気温を探します。
    'この部分はホームページの変更によってうまく動作しなくなることがあります。
    pos = InStr(InStr(1, txt, "今日の天気", vbTextCompare), txt, "<small>", vbTextCompare) + 7
    pos2 = InStr(pos, txt, "<")
    tenki = Mid(txt, pos, pos2 - pos)
    pos = InStr(InStr(pos, txt, "最高気温", vbTextCompare), txt, "<small>", vbTextCompare) + 7
    pos2 = InStr(pos, txt, "<")
    kion = Mid(txt, pos, pos2 - pos)
  • id:SALINGER
    コードの意味するところを日本語にしていみると、
    ソースから"今日の天気"が出てくる位置から調べて、"<small>"が出てくる位置に7を足してposにいれます。
    そこから調べて"<"が出てくる位置をpos2にいれます。
    ソースからposからpos2-pos文字("曇時々雨"とかの文字数)を抜き出してtenkiにいれます。
    ソースから"最高気温"が出てくる位置から調べて、"<small>"が出てくる位置に7を足してposにいれます。
    そこから調べて"<"が出てくる位置をpos2にいれます。
    ソースからposからpos2-pos文字("17℃"とかの文字数)を抜き出してkionにいれます。

    この部分はプラウザのソースの表示でソースとにらめっこして、どこらへんに必要なデータが出てくるかを考えて適当に作ります。
    ソースを見てみると"今日の天気"が最初に出てきた後に、最初に"<small>"が出てきたときに"曇時々雨"が出るみたいな感じです。

    ここで使っている文字列関数はinstrとmidの2つだけ。
    http://excelvba.pc-users.net/func/func3.html
  • id:bakuto
    丁寧な説明有難う御座いました。
    紹介していただいたHPも参考にして頑張ってみます。

    有難う御座いました。

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

トラックバック

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

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

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