やっと、表の取り込みです。
馬名を探し、テーブルを確定させます。
で、また、手前味噌サンプルの
document.body.createControlRange を使い、テーブルを指定する
http://www.ken3.org/cgi-bin/group/vba...
を使い、テーブルを選択して、コピーします。
そのコピーしたテーブルを貼り付けます。
そんな感じの処理を作ってみます。
2009年3月29日日曜日
03/29 THタグから 馬名 を探し、そのテーブルをコピー貼り付けする
03/29 SELECTタグ 単・複・枠連オッズ を 選択 VBA IE操作 単勝表取込み
手前味噌サンプルですが、
http://www.ken3.org/cgi-bin/group/vba...
で 'Form(0) の アイテム(名前がKUBUN) の 値(.Value) を 24Hにする(24Hを選択する) objIE.Document.Forms(0).Item("KUBUN").Va lue = "24H"
でセットできました。
これを応用して、 'SELECT タグから 単・複・枠連オッズ を 選択 Dim tagSELECT As Object 'タグ保存用 Set tagSELECT = Me.WebBrowser1.Document.all.tags("SELECT ") 'SELECTのタグを抜き出す tagSELECT.Item("g").Value = "Ota01" 'アイテム g に Ota01 を セット、選択されている値を直接代入で変更で、セットしました。
03/29 THタグから 馬名 を探し、そのテーブルをコピー貼り付けする
http://www.youtube.com/watch?v=uZV6V27LVak
<object width="500" height="405"><param name="movie" value="http://www.youtube.com/v/uZV6V27LVak&hl=ja&fs=1&color1=0xcc2550&color2=0xe87a9f&border=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/uZV6V27LVak&hl=ja&fs=1&color1=0xcc2550&color2=0xe87a9f&border=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="500" height="405"></embed></object>
表を取り込む 試作・テスト実行
やっと、表の取り込みです。
<TH>馬名</TH>
を探し、テーブルを確定させます。
で、また、手前味噌サンプルの
document.body.createControlRange を使い、テーブルを指定する
http://www.ken3.org/cgi-bin/group/vba_ie.asp#createControlRange
を使い、テーブルを選択して、コピーします。
そのコピーしたテーブルを貼り付けます。
そんな感じの処理を作ってみます。
Private Sub CommandButton1_Click()
Debug.Print Me.WebBrowser1.Document.URL
Debug.Print Me.WebBrowser1.Document.Title
'テーブル取り出しのテスト
Dim n As Integer
'表示完了後、THタグ 馬名を探す
Dim tagTH As Object 'THのタグを保存する
Dim nTHNo As Integer '見つけたオブジェクトの場所
Set tagTH = Me.WebBrowser1.Document.all.tags("TH") 'THのタグを取り出す
nTHNo = -1 'エラーの-1で初期化する
For n = 0 To tagTH.Length - 1 'THのタグを頭から探る
If tagTH(n).InnerText = "馬名" Then
nTHNo = n '見つけた番号をセットする。
Exit For '見つけたのでループを抜ける。
End If
Next n
'エラーの判断
If nTHNo = -1 Then '-1のまま、見つからなかったら、エラーにする。
MsgBox "馬名の表が見つかりません、システム管理者に連絡してください"
Exit Sub '関数を抜ける
End If
'見つけた場所 nTHNoから上のTABLEオブジェクトを探す
Dim objOYA_TAG As Object '親のオブジェクトを入れる
Set objOYA_TAG = tagTH(nTHNo).parentElement '見つけたTH馬名 その上.parentElementを代入
While objOYA_TAG.tagname <> "TABLE" 'タグの名前がTABLEになるまで(TABLE以外の間まわる)
Set objOYA_TAG = objOYA_TAG.parentElement 'さらに、一つ上の親タグを代入
Wend
'↑必ずTHの上にTABLEがあると仮定して、エラー処理はしてないけど・・・
'テーブルが見つかったので、コピーする。
Dim r As Object
Set r = Me.WebBrowser1.Document.body.createControlRange
r.Add objOYA_TAG '上で見つけたテーブルを指定する。
r.Select 'セレクト 選択
Me.WebBrowser1.ExecWB 12, 0 'コマンド発行 OLECMDID_COPY = 12 コピー
'テスト用に新規のブックを追加する
Workbooks.Add '新規ブックを追加
'形式を選択して貼り付け HTML貼り付けのテスト
Sheets.Add 'テスト用のシートを新規追加する
ActiveSheet.Name = "HTML形式で貼り付け" 'シートに名前を付ける
Range("A1").Select
ActiveSheet.PasteSpecial Format:="HTML"
'形式を選択して貼り付け Unicode テキスト貼り付けのテスト
Sheets.Add 'テスト用のシートを新規追加する
ActiveSheet.Name = "FormatUnicode テキスト" 'シートに名前を付ける
Range("A1").Select
ActiveSheet.PasteSpecial Format:="Unicode テキスト"
'形式を選択して貼り付け テキスト貼り付けのテスト
Sheets.Add 'テスト用のシートを新規追加する
ActiveSheet.Name = "Formatテキスト" 'シートに名前を付ける
Range("A1").Select
ActiveSheet.PasteSpecial Format:="テキスト"
End Sub
まぁ、ポイントは、
Set tagTH = Me.WebBrowser1.Document.all.tags("TH") 'THのタグを取り出す
で、いつものようにTHを取り出して、
For n = 0 To tagTH.Length - 1 'THのタグを頭から探る
If tagTH(n).InnerText = "馬名" Then
nTHNo = n '見つけた番号をセットする。
Exit For '見つけたのでループを抜ける。
↑、テキスト の 馬名を探します。
探し終わったら、そのテーブルを見つけるために、
.parentElement を 使って、親のテーブルまでたどり着きます。
'見つけた場所 nTHNoから上のTABLEオブジェクトを探す
Dim objOYA_TAG As Object '親のオブジェクトを入れる
Set objOYA_TAG = tagTH(nTHNo).parentElement '見つけたTH馬名 その上.parentElementを代入
While objOYA_TAG.tagname <> "TABLE" 'タグの名前がTABLEになるまで(TABLE以外の間まわる)
Set objOYA_TAG = objOYA_TAG.parentElement 'さらに、一つ上の親タグを代入
Wend
'↑必ずTHの上にTABLEがあると仮定して、エラー処理はしてないけど・・・
テーブルを見つけたら、
'テーブルが見つかったので、コピーする。
Dim r As Object
Set r = Me.WebBrowser1.Document.body.createControlRange
r.Add objOYA_TAG '上で見つけたテーブルを指定する。
r.Select 'セレクト 選択
Me.WebBrowser1.ExecWB 12, 0 'コマンド発行 OLECMDID_COPY = 12 コピー↑、テーブル全体をコピーします。
コピーしたら、貼り付けって感じで、あとは、
'形式を選択して貼り付け HTML貼り付けのテスト
Sheets.Add 'テスト用のシートを新規追加する
ActiveSheet.Name = "HTML形式で貼り付け" 'シートに名前を付ける
Range("A1").Select
ActiveSheet.PasteSpecial Format:="HTML"
こんな感じで貼り付けました。
さてと、あとは、1レースから最終レースまで繰り返して 貼り付けますか。
03/29 SELECTタグ 単・複・枠連オッズ を 選択
http://www.youtube.com/watch?v=RDrrHMwQ4Ho
<object width="445" height="364"><param name="movie" value="http://www.youtube.com/v/RDrrHMwQ4Ho&hl=ja&fs=1&color1=0xcc2550&color2=0xe87a9f&border=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/RDrrHMwQ4Ho&hl=ja&fs=1&color1=0xcc2550&color2=0xe87a9f&border=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="445" height="364"></embed></object>
単・複・枠連オッズ を 選択する
次は、単・複・枠連オッズ の 選択です。
<SELECT name="g">
<OPTION value="Ota01">単・複・枠連オッズ</OPTION>
<OPTION value="Oum01" selected>馬連オッズ</OPTION>
<OPTION value="Out01">馬単オッズ</OPTION>
↑ここから、単・複・枠連オッズ を 選択したいです。
タグがSELECTで名前が"g"かぁ
手前味噌サンプルですが、
http://www.ken3.org/cgi-bin/group/vba_ie_form.asp#Select_Value
で
'Form(0) の アイテム(名前がKUBUN) の 値(.Value) を 24Hにする(24Hを選択する)
objIE.Document.Forms(0).Item("KUBUN").Value = "24H"
でセットできました。
これを応用して、
'SELECT タグから 単・複・枠連オッズ を 選択
Dim tagSELECT As Object 'タグ保存用
Set tagSELECT = Me.WebBrowser1.Document.all.tags("SELECT") 'SELECTのタグを抜き出す
tagSELECT.Item("g").Value = "Ota01" 'アイテム g に Ota01 を セット、選択されている値を直接代入で変更
で、セットしました。
次は、決定ボタンを押したいので、決定ボタンのフォームを探します。
わざわざ、難しくすることも無いのですが、
<Form>
<タグA>
<タグB>
<SELECT name="g">
<OPTION value="Ota01">単・複・枠連オッズ</OPTION>
みたいに、階層構造になっているので、
tagSELECT.Item("g") の 上、上、上、と<FORM>まで、親のオブジェクトをたどります。
※これも手前味噌なんだけど、
[No.180 IE操作 .parentElement で親のタグを参照?]
http://www.ken3.org/vba/backno/vba180.html
で、 .parentElement で親のタグを参照できたので、
.TagNameが"FORM"となるまで、探り、.Submitしてみます。
'上の階層、Formを探して、.Submitする。
Dim objOYA_TAG As Object '親のオブジェクトを入れる
Set objOYA_TAG = tagSELECT.Item("g").parentElement
While objOYA_TAG.tagname <> "FORM" 'タグの名前がFORMになるまで(FORM以外の間まわる)
Set objOYA_TAG = objOYA_TAG.parentElement 'さらに、一つ上の親タグを代入
Wend
objOYA_TAG.Submit '上へ行き、見つけたフォームを.Submit 送信処理
↑なんか、無理やり 作った感があるなぁ・・・
※後で直しておこう。。今回も無理やり .parentElement を使いました。
2009年3月28日土曜日
情報メニューをクリックする
次は、情報メニューを起動したいです。
普通に操作する時は、クリック・画像のボタンを押す、なので、
リンクを探してみます。
リンクを探るには、イロイロな方法があるのですが、
今回は、
ウォッチ式に Me.WebBrowser2 を セットして、
その下の .Document .links を 探ってみました。
探っていくと、6番目に、
.title に タイトル(そのままかよ)が入ってました。
? Me.WebBrowser2.Document.links(6-1).title
情報メニュー
なので、そのまま、テストで
Me.WebBrowser2.Document.links(6-1).Click
と、.Clickしてみました。
文字で説明するより、今回は下記の動画を見てもらったほうがいいのかなぁ。
</pre>
03/28 Document.Linksを探り 情報メニューを探す :
<a href='http://www.youtube.com/watch?v=ke-Kgfms6tk'>http://www.youtube.com/watch?v=ke-Kgfms6tk</a><br>
<object width="500" height="405"><param name="movie" value="http://www.youtube.com/v/ke-Kgfms6tk&hl=ja&fs=1&color1=0xe1600f&color2=0xfebd01&border=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/ke-Kgfms6tk&hl=ja&fs=1&color1=0xe1600f&color2=0xfebd01&border=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="500" height="405"></embed></object>
<hr>
2009年3月27日金曜日
03/22 VBA IE操作 単勝表取込み 受付時間外の処理
全体の流れやソース・解説は : http://ie.vba-ken3.jp/sample/003/2009-03-22.html を 見てください。
時間外の判断
よし、あと少し・・・と思ったら、時間外のメッセージが。。。
当日の最終投票までしか、使えないみたいですね。。。
※朝からやってて、ここまでしかできなかった。
で、終わってしまうと、悔しいので、
"投票のお申込みを受け付けておりません"
を見つけたら、メッセージを表示して、userformを閉じる、そんなコードを書いてみました。
Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
If InStr(Me.WebBrowser1.Document.body.innerTEXT, "投票のお申込みを受け付けておりません") > 0 Then
MsgBox "投票のお申込みを受け付けておりません 時間内に実行してください。"
Unload Me 'フォームを閉じる
End If
End Sub
↑単に、InStr で .Document.body を 探っただけでした。
次の土日で決めないとなぁ。。。
03/22 VBA IE操作 単勝表取込み 受付時間外の処理 : http://www.youtube.com/watch?v=QY0NE1GPWKo
03/22 VBA IE操作 単勝表取込み 加入者情報のセット
全体の流れやソース・解説は : http://ie.vba-ken3.jp/sample/003/2009-03-22.html を 見てください。
加入者情報 入力
>[加入者番号・暗証番号・P-ARS入力](ボタン)bINFO-SET
>加入者情報 入力
> C10 加入者番号
> C12 暗証番号
> C14 P-ARS入力
> ログインボタン を押す(ユーザーが自分で押す)
Private Sub bINFO_SET_Click()
'名前が i,p,r にそれぞれセットする。 セットする場所がWebBrowser2 2に注意
Me.WebBrowser2.Document.forms("FORM1").Item("i").Value = Range("C10") '加入者番号
Me.WebBrowser2.Document.forms("FORM2").Item("p").Value = Range("C12") '暗証番号
Me.WebBrowser2.Document.forms("FORM3").Item("r").Value = Range("C14") 'P-ARS
'↑同じ名称が使われているので、forms("FORM1"),2,3を指定しました。
End Sub
↑Me.WebBrowser2.Document.all が 同じ名前があったので、使えなかったので、
.forms("フォーム名").Item("INPUTの名前") で データをセットしました。
03/22 VBA IE操作 単勝表取込み 加入者情報のセット : http://www.youtube.com/watch?v=YCyV-YBDQp0
03/22 VBA IE操作 単勝表取込み NewWindow2で捕まえる
全体の流れやソース・解説は : http://ie.vba-ken3.jp/sample/003/2009-03-22.html を 見てください。
新規のウインドウ(IE)が起動する。
シートのC8から転記する Or 心配だからユーザーが入力する。
どちらのルートを通っても、次は、ログインのボタンを押します。
ここで、一つ問題が、ログインのボタンが押されると、新規のウインドウが起動します。。。
コイツを回避したいなぁ。。。ってことで、IE WebBrowser の イベントを探ってみます。
新規で、WebBrowser2 の オブジェクトを作ります。
いきなり、プライドの高いSE様が作った仕様を変更します。
(※話を通さないでやると、本当にヘソ曲げるよ設計したプライドの高いSE様が、
なので、原因を話して、一言ことわってから変更してね。)
WebBrowser1のNewWindow2 新しくウインドウが作られる処理で、
Set ppDisp = Me.WebBrowser2
と1つ呪文を書きます。
Private Sub WebBrowser1_NewWindow2(ppDisp As Object, Cancel As Boolean)
Debug.Print "_NewWindow2 に 入りました。"
Set ppDisp = Me.WebBrowser2 '新しいウインドウはWebBrowser2を代入
End Sub
↑この1行で、新しく開かれるウインドウを Me.WebBrowser2 で開くことができます。
あとは、Me.WebBrowser2 で捕まえているので、
Me.WebBrowser2 に対して処理を書きます。(処理をかけます。)
なんか、小細工だけど、ゆるしてね。。。
03/22 VBA IE操作 単勝表取込み NewWindow2で捕まえる : http://www.youtube.com/watch?v=GZyAdkBVAik
03/22 VBA IE操作 単勝表取込み INET-IDのセット
全体の流れやソース・解説は : http://ie.vba-ken3.jp/sample/003/2009-03-22.html を 見てください。
INET-ID 入力
>[INET-ID 入力](ボタン)bINET-ID-SET
>INET-ID 入力
> C8 の データをINET-IDにセット
> ログインボタンを押す(ユーザーが自分で押す)
Htmlソースから、HTML入力FormのInput項目を探り、名前を取り出します。
その名前を使用して、セルC8のデータをセットします。
Private Sub bINET_ID_SET_Click()
'C8のデータセット name="inetid"
Me.WebBrowser1.Document.all("inetid").Value = Range("C8")
'↑Document.allから名前inetidのオブジェクトを指定して値.Valueをセットした。
End Sub
↑名前が重複していないので、単純に .All("名前")でオブジェクトを指定して、
データをセットしました。
03/22 VBA IE操作 単勝表取込み INET-IDのセット : http://www.youtube.com/watch?v=YrcVPFbtwZY
03/22 VBA IE操作 単勝表取込み Excel UserForm 作成
全体の流れやソース・解説は : http://ie.vba-ken3.jp/sample/003/2009-03-22.html を 見てください。
プログラムの作成に入る
上記のかなりラフな設計から、プログラムの作成に入ります。
コーディング
画面に(Formに)オブジェクトを配置します。
03/22 VBA IE操作 単勝表取込み Excel UserForm 作成 : http://www.youtube.com/watch?v=BMFB6hbnjI4
03/22 VBA IE操作 単勝表取込み ラフな基本設計と詳細設計
全体の流れやソース・解説は : http://ie.vba-ken3.jp/sample/003/2009-03-22.html を 見てください。
いいかげんな 基本設計
基本設計・要求設計を兼ねて、
^^^^^^^^^^^^^^^^^^
システム名:JRA IPADのページから単勝の表を取り込む
概要: WebBrowserをExcel User Form に 貼り、
ログイン処理を操作しながら、
JRA IPADのページから単勝の表を取り込む。
必要な環境 : Excel2003 と Windows XP SP2 + IE7 (随時、対応環境をチェックする)
作業日数・費用:
開発スケジュール:
↑こんな概要・要求設計だと、見積もり誤差が、、、あとあと、要求が増えないように(笑)
さてと、発注されたら、詳細設計に入りますか。
さらにいいかげんな 詳細設計
詳細設計
^^^^^^^^
ファイル一覧 : なし ファイルの設計は無し
ファイルI/Oイメージ: 無し
ファイル詳細 : 無し
※データをシートに書き込むので、基本的に無し
画面一覧: Main001 Webの表示画面 ※UserFormに貼った WebBrowserを操作する。
画面遷移図: 1画面なので無し
画面詳細(入出力)
Main001詳細
画面名: 入力画面の表示 と 各処理の実行ボタン
処理概要: Webページを表示 したり、各処理の起動ボタンを作成する。
Excel UserFormに下記のイメージでFormを作成する
------------------------------
| WebBrowser1 |
| WebBrowserコントロール |
| |
| |
| |
| |
------------------------------
[INET-ID 入力](ボタン)bINET_ID_SET
[加入者番号・暗証番号・P-ARS入力](ボタン)bINFO_SET
[単勝オッズ取り込み](ボタン)bGET_TAN
------------------------------------
オブジェクトの説明(入力・処理・出力)
フォーム全体:
初期処理: 初期状態として、
初期ページ http://www.ipat.jra.go.jp/ を表示する。
加入者番号 の ボタンを使用不可にする
単勝オッズ取り込み の ボタンを使用不可にする
終了処理: 特になし
WebBrowser1:
オブジェクトの種類: WebBrowser
機能:表示が完了したら(表示完了のイベントで)
タイトルと中身を判断して、
ア. [加入者番号・暗証番号・P-ARS入力](ボタン) を 使用可能にする、
[INET-ID 入力](ボタン)を使用不可とする
イ.[単勝オッズ取り込み](ボタン)を使用可能取る
[加入者番号・暗証番号・P-ARS入力](ボタン) を 使用不可にする
[INET-ID 入力](ボタン)bINET-ID-SET
INET-ID 入力
C8 の データをINET-IDにセット
ログインボタンを押す(ユーザーが自分で押す)
[加入者番号・暗証番号・P-ARS入力](ボタン)bINFO-SET
加入者情報 入力
C10 加入者番号
C12 暗証番号
C14 P-ARS入力
ログインボタンを押す(ユーザーが自分で押す)
[単勝オッズ取り込み](ボタン) bGET-TAN
情報画面を開き、単勝オッズをシートに取り込む
03/22 VBA IE操作 単勝表取込み ラフな基本設計と詳細設計 : http://www.youtube.com/watch?v=6FiMjjjMltk
03/21 VBA IE操作 単勝表取込み 事前準備で現物操作
全体の流れやソース・解説は : http://ie.vba-ken3.jp/sample/003/2009-03-22.html を 見てください。
現物を操作して、システム化の構想を練る。
システム名 JRA IPATのページから単勝の表を取り込む
客先、ユーザーからの要望・希望を聞く
今回は(今回も)かなり、ラフな日本語で、
「JRA IPATのページから単勝の表を取り込みたい」
と、口頭で言われました。。。
まぁ、まずは現物を動かして確認しますか。
※今回、私もIPATの会員だったので、操作しながらデバッグできたので、
その点は、良かったです。現物が操作できない処理だと精神的にもツラかったり。
特に月末の振込み処理とか、CSVデータから連続振込みなど、お金がからむと・・・
※※今回、自動投票じゃないので、失敗しても(おいおい)気が楽かなぁ。
そんな、プレッシャー話は置いといて、現物を確認してみます。
03/21 VBA IE操作 単勝表取込み 事前準備で現物操作 : http://www.youtube.com/watch?v=mxyL2OQPgzQ
2009年3月24日火曜日
IE8 で objIE = CreateObject InternetExplorer.application が 動いた?
IE8 で objIE = CreateObject("InternetExplorer.application") が 動いたのに驚く・・・
Vista + IE8 で VBA IE操作の動作不可の画像を作成しようとしたら、 objIE = CreateObject("InternetExplorer.application") で 普通に動いたので少しびっくり。。。テストしてみるもんですね(ってぉぃぉぃ) いきなり進めるとまずいので、みなさんは、もっと確認してから行ってください。。。
2009年3月18日水曜日
2009年3月17日火曜日
動画を作った。。。
03/16 VBA IE 表の取り込み 詳細設計書 テスト仕様書http://www.youtube.com/watch?v=vNP1XZmdhBQ
03/16 URL を指定して IEをShell関数で起動するhttp://www.youtube.com/watch?v=et2GPUioe80
03/16 VBA IE 表を取り込む STOPで止め TABLEを探るhttp://www.youtube.com/watch?v=U8M6423Io6I
2009年3月11日水曜日
3/11 サンプルを作った
お時間のある人は、ここ→ http://ie.vba-ken3.jp/sample/001/2009-03-07.html 見て笑ってください。
2009年3月7日土曜日
3/5
.Show で UserFormを表示できるので、標準モジュールに .Show を行うモジュールを書きます。
Sub open_test()
UserForm1.Show
End Sub
↑このモジュールをシートに貼ったボタンから起動するようにしました。
http://www.youtube.com/watch?v=vfOhOAwuzG8