Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


4851 / 13644 ツリー ←次へ | 前へ→

【53894】WEBからデータを取り込むには? あつし 08/2/13(水) 23:10 質問[未読]
【53895】Re:WEBからデータを取り込むには? かみちゃん 08/2/14(木) 0:37 発言[未読]
【53909】Re:WEBからデータを取り込むには? あつし 08/2/14(木) 14:31 質問[未読]
【53911】Re:WEBからデータを取り込むには? VBWASURETA 08/2/14(木) 15:08 発言[未読]
【53919】Re:WEBからデータを取り込むには? かみちゃん 08/2/15(金) 0:31 発言[未読]
【53920】Re:WEBからデータを取り込むには? あつし 08/2/15(金) 5:59 発言[未読]
【53945】Re:WEBからデータを取り込むには? かみちゃん 08/2/17(日) 17:12 発言[未読]
【53950】Re:WEBからデータを取り込むには? あつし 08/2/17(日) 23:57 発言[未読]
【54085】Re:WEBからデータを取り込むには? あつし 08/2/23(土) 22:49 お礼[未読]

【53894】WEBからデータを取り込むには?
質問  あつし  - 08/2/13(水) 23:10 -

引用なし
パスワード
   競馬のデータを自動で取り込むプログラムを作りたくて、本やネットで勉強中のものです。
現在 WININET.DLL を利用して、GETやPOST を使い必要なページを取り込むことは出来るようになりました。
と言っても、理解しているのではなく、サンプルのVBAのつぎはぎで何とか作動しているだけですが。

今回教えていただきたいのは、IPAT(JRAのネット投票)のページから投票締め切り時刻を取り込みたかったのですが、
必要な情報のあるページ(IPAT投票メインメニュー)は取り込むことに成功したのですが、
そこから必要な情報を取り出そうとコードを見たら、取り出したい情報が載っていない??
よくよく探すとどうやら 自分の欲しい情報のあるべきところに次のようなコードがありました

   <SCRIPT language=JavaScript>
<!--
    document.open();
    document.write(IPATselinf());
    document.close();
//-->
</SCRIPT>

今までのところオッズなどの欲しい情報データは全てコード表示した際には、テキストとして表示されていたので、
タグを利用して抜き出すことが容易だったのですが、
どうやら今回の情報はJavaScritをつかって、よそから情報を取り込んでいるようなので、お手上げになってしまいました。
どなたか、このページからデータを抜き出す方法を教えていただけないでしょうか。よろしくお願いします

【53895】Re:WEBからデータを取り込むには?
発言  かみちゃん E-MAIL  - 08/2/14(木) 0:37 -

引用なし
パスワード
   こんにちは。かみちゃん です。

私もIPATからExcelに情報を取得しています。

>今回教えていただきたいのは、IPAT(JRAのネット投票)のページから投票締め切り時刻を取り込みたかったのですが、
>必要な情報のあるページ(IPAT投票メインメニュー)は取り込むことに成功した

どのように取り込んでいますか?
情報としては取得できますよ。

>どうやら今回の情報はJavaScritをつかって、よそから情報を取り込んでいる

とりあえず、JavaScriptは関係ないと思います。

> このページからデータを抜き出す方法を教えていただけないでしょうか

以下の過去ログも、少しは参考になるかもしれません。
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=36113;id=excel

また、IPATを使うなら、以下の書籍も参考になると思います。
http://www.yannies.com/diy/index.htm

IPATログイン方法が変更になっているので、多少修正はいるかもしれませんが、
その場合は、以下の過去ログ(他の掲示板で恐縮ですが)も参考になると思います。
http://park7.wakwak.com/~efc21/cgi-bin/exqalounge.cgi?print+200708/07080069.txt

たぶん、経験者として微力ながらアドバイスはできると思います。

【53909】Re:WEBからデータを取り込むには?
質問  あつし  - 08/2/14(木) 14:31 -

引用なし
パスワード
   かみちゃん、こんにちは。
早速のレスありがとうございます。
掲示板を利用するのは、まだまだ初心者なので、必要な情報など上手く伝えられなくてすみません。
紹介していただいたところも見てみましたが、どうもピンと来ませんでした。

で、まず現在の状況ですが、かみちゃんにも案内された”DIY競馬プログラミング”を主に参考にしてプログラムを作りました。
簡単にどのようなプログラムなのかを説明しますと、

まず、本に紹介された方法で”IPAT情報メインメニュー”を取得し、このページの左上のリストボックスから、開催レースの回次と競馬場と日次情報を取り込みます。(回・日情報がオッズなどのデータを取るのに必要なため。)
次にJRAのHPのスケジュールのページを取り込み(手法は本のGETメッソドによるHTTP通信を利用)、各レースの出走時刻を取り出します。
取り出した出走時刻を昇順に並び替え並び替えた順番に出走時刻の5分前に、オッズ情報をやはり本に紹介された方法で取り込み、このオッズを元に自分の理論で買い目を算出し、
最後に、本の"ipatbet.DLL"を使って投票します。

以上の部分は既にほぼ完成し、自分の意図に合った動作をしてくれているのですが、この状態ですと、途中でのレースの中止や出走時刻の変更に対応できません。
JRAのスケジュールをレースごとに取得しなおし、出走時刻を確認しようかと思いましたが、リアルタイムに変更になるか分かりません。もしかしたら変更しないかも?
IPATからオッズ情報を取得できるので、こちらのページから出走時刻を抜き取ることも考えたのですが、よくよく考えると、本当に必要な情報は出走時刻ではなく、投票締め切り時刻だと気が付きました。
多くの競馬ファンの予想の集大成であるオッズ、最大限の精度を極めるならやはり締め切り直前のオッズが欲しいところです。
自分の知る限り締め切り時刻が分かるのは、”IPAT投票メインメニュー”だけでした。

そこで、”IPAT投票メインメニュー”から、締め切り時刻を抜き出そうと思ったのですが、先にも書いたように、締め切り時刻が表示されているべきところに、ダイレクトに時刻が出ていなかったので、焦ってしまいました。
”IPAT投票メインメニュー”のページそのものを読み込む方法は実際には、まだ試していませんが(現在開催日でないため)、最悪の場合、"ipatbet.DLL"を使って、取得できるのでそれを利用しようと思っています。

で、ココまで書いて気づいたのですが、この"ipatbet.DLL"をつかって、保存されたページ、ネットに接続されていない状況でもキチンと締め切り時刻などの情報が表示されている。
ということは、締め切り時刻などの情報は、自分の分からないところにキチンとしまってあるってことですよね。一体何処に隠れているのでしょうか?
これが分かれば、解決の鍵になるような気がしてきたのですが、、

と、そういうわけで、締め切り時刻を取り込む方法を知りたいのです。
自分の質問、この説明で分かっていただけますでしょうか?(少々不安)
もし、解決方法がお分かりでしたらよろしくお願いします。

ちなみに環境はWinXP、EXCELL2003です。

【53911】Re:WEBからデータを取り込むには?
発言  VBWASURETA  - 08/2/14(木) 15:08 -

引用なし
パスワード
   ▼あつし さん、かみちゃんさん:

こんにちは。
ちょっとあまりわからないところではありますが。
もし、JavaScriptのWriteしている部分にあたる場合は難しい
かも知れません。

というのはサーブレッドから取得して書いている可能性があります。
つまりサーバーから取得して書いている部分かも知れません。

後、ipatbet.DLLは何で作成されたものかわかりませんが。
公開している関数とかわかりますか?
エディタでも何でも良いですが開いてみて読める部分(関数)
があります。その関数内に取得する関数があれば使えます。

ただ、もしその部分になければ内部関数になるので、
取得は難しいかもしれません。

【53919】Re:WEBからデータを取り込むには?
発言  かみちゃん E-MAIL  - 08/2/15(金) 0:31 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>そこで、”IPAT投票メインメニュー”から、締め切り時刻を抜き出そうと思った
>のですが、先にも書いたように、締め切り時刻が表示されているべきところに、
>ダイレクトに時刻が出ていなかったので、焦ってしまいました。

たぶんできると思います。
IPATメニューは、利用時間が限られているため、動作確認ができませんが、
今週末でも確認でき次第、方法はお知らせできると思います。

> 締め切り時刻を取り込む方法を知りたいのです。

出走時刻の2分前ではいけないのでしょうか?
と思ってしまいます。

>自分の質問、この説明で分かっていただけますでしょうか?(少々不安)
>もし、解決方法がお分かりでしたらよろしくお願いします。

まぁ、すでにそういうツールを作って使っているという実績があるのですが・・・
それを提供させていただくことも可能です。

【53920】Re:WEBからデータを取り込むには?
発言  あつし E-MAIL  - 08/2/15(金) 5:59 -

引用なし
パスワード
   おはようございます。あつしです。

>出走時刻の2分前ではいけないのでしょうか?
>と思ってしまいます。

いけないわけでは無いのですが、なんだかの事情で出走時刻が繰り下げになったとき、締め切り時刻がそれに完全に連動すれば良いのですが、万が一そうならなかった場合に、備えて置きたいと思ったのです。
そのような事態があるのかどうかは、不明ですが。逆に言えば、100%必ず連動することが、確認できれば、出走時刻の2分前で問題ありません。

そうであれば、前回のレース後、毎レースごとに出走時刻をチェックし、変更があれば、その都度作動時刻を変更するように、コードをいじってはみたので、今度のレースで、その部分の作動確認をしてみようと思っています。(出走時刻の変更があるかは、分かりませんが)

【53945】Re:WEBからデータを取り込むには?
発言  かみちゃん E-MAIL  - 08/2/17(日) 17:12 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>>そこで、”IPAT投票メインメニュー”から、締め切り時刻を抜き出そうと思った
>>のですが、先にも書いたように、締め切り時刻が表示されているべきところに、
>>ダイレクトに時刻が出ていなかったので、焦ってしまいました。
>
>たぶんできると思います。
>IPATメニューは、利用時間が限られているため、動作確認ができませんが、
>今週末でも確認でき次第、方法はお知らせできると思います。

この土日は、あまり時間がなく中央競馬の全投票が終わってしまったあとの書き込み
で恐縮ですが、以下のようなコードでできると思います。

Sub Sample()
 Dim ID As String
 Dim str_para_uh As String
 Dim str_para_g As String
 Dim str_para_i As String
 Dim str_para_p As String
 Dim str_para_r As String
 
 Dim IE As Object
 
 Dim URL As String
 Dim Post() As Byte
 Dim strHeader As String
  
 Dim szBuf As String
 Dim ln As Long
  
 Dim FN As Integer
 Dim strFileName As String
 Dim rngResult As Range
 Dim WS1 As Worksheet
 Dim WS2 As Worksheet
 
 Set WS1 = Sheets("Sheet1")
 Set WS2 = Sheets("Sheet2")
 
 '==================================================
 '※IPATから情報呼び出しに必要な情報を設定
 '==================================================
 With WS2
  ID = .Range("B1").Value 'INET ID
  str_para_i = .Range("B2").Value '加入者番号
  str_para_p = .Range("B3").Value '暗証番号
  str_para_r = .Range("B4").Value 'P-ARS番号
  URL = .Range("B5").Value
  str_para_g = "080"  '自動付与
 End With
 
 Set IE = CreateObject("InternetExplorer.Application")

 With IE
  .Navigate URL
  Do While .Busy = True And .ReadyState <> 4
   DoEvents
  Loop
  szBuf = .document.body.innerHTML
 End With
 
 '==================================================
 '※IPATから情報呼び出しに必要な情報を抜き出す
 '==================================================
 ln = InStr(1, szBuf, "NAME=uh", vbTextCompare)
 If ln > 0 Then
  szBuf = Right$(szBuf, Len(szBuf) - ln)
  szBuf = Left$(szBuf, InStr(szBuf, ">") - 2)
  ln = InStr(1, szBuf, "VALUE=", vbTextCompare)
  If ln > 0 Then
   szBuf = Right$(szBuf, Len(szBuf) - ln - 6)
  Else
   szBuf = ""
  End If
 Else
  szBuf = ""
 End If
 If szBuf <> "" Then
  str_para_uh = szBuf '自動付与
 End If
   
 '==================================================
 'IPAT投票メインメニューの表示
 '==================================================
 '以下のhttpという文字は、全角になっているので、半角にしてください。
 URL = Replace(URL, "http://", "https://") & "pw_020_i.cgi"
 Post = StrConv("inetid=" & ID & "&uh=" & str_para_uh & "&g=" & str_para_g & "&u=" & str_para_i & str_para_p & str_para_r & "&i=" & str_para_i & "&p=" & str_para_p, vbFromUnicode)
 strHeader = "Content-type: application/x-www-form-urlencoded" + vbCrLf
 
 Set IE = CreateObject("InternetExplorer.Application")

 With IE
  .Visible = True
  .Navigate URL, , , Post, strHeader
  Do While .Busy = True And .ReadyState <> 4
   DoEvents
  Loop
 End With

 strFileName = ThisWorkbook.Path & "\pw_020_i.html"
 FN = FreeFile
 Open strFileName For Output As #FN
 Print #FN, IE.document.body.innerHTML
 Close #FN

 IE.Quit
 Set IE = Nothing
 
 With WS1
  With .QueryTables.Add(Connection:= _
   "URL;file:///" & strFileName, _
    Destination:=.Range("A1"))
   .Name = "OneDayShutubahyou"
   .PreserveFormatting = False
   .AdjustColumnWidth = False
   .WebFormatting = xlWebFormattingNone
   .WebPreFormattedTextToColumns = False
   .WebDisableDateRecognition = True
   .Refresh BackgroundQuery:=False
   Set rngResult = .ResultRange
  End With
  .Activate
 End With

 Kill strFileName
 
 MsgBox "IPAT投票メインメニュー情報を取得しました"
End Sub

Sheet2の
B1セルに IPATのINETID
B2セルに IPATの加入者番号
B3セルに IPATの暗証番号
B4セルに IPATのP-ARS番号
B5セルにIPATのURL "http://www.ipat.jra.go.jp/"(先頭4文字は全角になっているので半角にしてください)
を設定します。

その上で、上記マクロを実行すると、Sheet1に「IPAT投票メイメニュー」の内容
が取得されます。
ポイントは、
IE.document.body.innerHTML
で表示内容のHTMLを取得してし、Webクエリで読み込んでいますが、
それができていれば、内容を解析するなど、別の方法もあるかと思います。

なお、サンプルファイルを作成して動作確認していますので、差し上げることはできます。

【53950】Re:WEBからデータを取り込むには?
発言  あつし  - 08/2/17(日) 23:57 -

引用なし
パスワード
   こんばんは、あつしです。
かみちゃん、本当にありがとうございます。

Webクエリは使ったことが無いので、少々チンプンカンプンですが、教えていただいたコードをコピペして試してみました。

すでにログイン可能時刻を過ぎていたので、試しにコードと入力を少し変えて南関競馬の出走表(こちらも、HTMLのコードに直接時刻の文字が無い)を読み込んで見ました。結果、見事に表示されました。

次に、コードをたどると一度読み込んだHPをPCに保存して、そこからまた読み込んでいるようなので、以前に保存していた投票メインメニューのファイル名を”pw_020_i.html”に変え、コードのファイル保存の部分を削除して試してみたら、こちらは残念ながら表示に失敗してしまいました。しかし、これは実際に読み込んだファイルで無いので、来週時間内にきちんと試して、結果報告させていただきます。

それまで時間があるので、Webクエリについても少し勉強してみます。
最終的にはIEを起動せず、WININET.DLLを使って読み込みできるようにしたいと思っています。

【54085】Re:WEBからデータを取り込むには?
お礼  あつし  - 08/2/23(土) 22:49 -

引用なし
パスワード
   かみちゃん、こんばんは。あつしです。

本日投票時間中に確認したところ、教えていただいた方法で、投票締め切り時刻をし得することができました。本当にありがとうございました。

で、かみちゃんは分かっていらっしゃるとは、思いますが、今回分かったことを報告させて頂きます。

IEを起動、表示させたHPを  IE.document.body.innerHTML として、取り込むと、WINNET.DLL を利用してPCに取り込んだファイルと違い、投票締め切り時刻は、そのままHTMLのテキストとして保存されていました。したがって、WEBクエリを使わなくても、 IE.document.body.innerHTML として取り込んだファイルから直接時刻を抜き取ることができそうです。

逆に、WINNET.DLL を利用して取り込んだファイルには、投票締め切り時刻は直接テキストの形になっていないので、やはりIEを起動、操作する手順は必須のようです。
プログラムを動かしている間に、インターネットを使うこともあると思ったので、できれば、IEをプログラムで操作することは避けたかったのですが(動作が不安定になりそうなので)、やはりこの方法でやってみようと思います。

本当に、ありがとうございました。

4851 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free