2009年3月29日日曜日

03/29 THタグから 馬名 を探し、そのテーブルをコピー貼り付けする

やっと、表の取り込みです。
馬名を探し、テーブルを確定させます。

で、また、手前味噌サンプルの
document.body.createControlRange を使い、テーブルを指定する
http://www.ken3.org/cgi-bin/group/vba...
を使い、テーブルを選択して、コピーします。

そのコピーしたテーブルを貼り付けます。
そんな感じの処理を作ってみます。

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タグから 馬名 を探し、そのテーブルをコピー貼り付けする

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タグ 単・複・枠連オッズ を 選択

03/29 SELECTタグ 単・複・枠連オッズ を 選択 VBA IE操作 単勝表取込み
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日土曜日

情報メニューをクリックする

<pre>無事にログインできたので、
次は、情報メニューを起動したいです。

普通に操作する時は、クリック・画像のボタンを押す、なので、
リンクを探してみます。

リンクを探るには、イロイロな方法があるのですが、
今回は、
ウォッチ式に 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月17日火曜日

3/17 VBA IE 表を取り込む バグ001 BR改行に対応

動画編集ソフトで再生速度を上げて、10分以内にまとめてみた。

なんか、急いでいるけど、逆に面白い???

03/17 VBA IE 表を取り込む 初期バージョン 完成?

ブログに投稿 を テスト。

Outlook から 投稿テスト

Outlookからメールで投稿できるか、チェックする。

http://www.ken3.org/

↑アドレスを載せてみた。。。

メール投稿のテスト 画像

画像をメールから送ってみた。

メール投稿のテスト

メール投稿のテスト

動画を作った。。。

03/16 VBA IE 表の取り込み 基本設計書 要求設計書http://www.youtube.com/watch?v=a3aTClOAlUQ

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 サンプルを作った

VBA IE操作のサンプルを作ったけど、キレがないなぁ。
お時間のある人は、ここ→ 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



2009年3月4日水曜日

寒い

いろいろ な 意味で 寒い。
クール とは 違って 寒いの一言。