三流君 VBAで楽しくプログラミング (Excel/Access VBAの解説/サンプルです)
[VBA系のバックナンバー ]
[質問/感想 掲示板 ]
[メルマガ登録/解除 ]
[VBA系 TOP ]
[サイトマップ ]
<Webクエリで書籍の売れ筋データを抜き取る>
どうも、三流プログラマーのKen3です。
今回は、私的なことなのですが、
Webから売れ筋の書籍データを抜き出して、販売用のHPを作成する。
そんな手助けツールを作ってみたいと思います。
http://www.ken3.org/p/a/office-037.lzh
に、
今回使用した、テストプログラム(Excel2002版)が圧縮されてます。
動かしてテストしてみてください。
/*
* 1. 今日の狙い・・・
*/
本をいっぱい売って、儲けてやる・・・そんな夢を追ってみます。
本を売るには・・売れている本を皆さんに紹介して、売ろう。
そんな安易な考えで行ってみたいと思います。
/*
* 2.まず、コンピュータ書籍のランキングを見る
*/
コンピュータの専門書籍のランキングページをまず探します。
http://www.cbook24.com/
から
http://www.cbook24.com/pubinclude/salesrank/salesrank_main.asp
に、売れ筋のコンピュータ関係の本が載ってます。
このデータをExcelに取り込みたいと思います。
方法として、簡単なのが、Webクエリーがあります。
メニューからデータ・外部データの取り込み・新しいWebクエリを選択します。
↑新しいWebクエリを作成する
アドレスを入力して、移動ボタンを押します。
↑目的のページへ移動する
次は、取り込む範囲を選択して、取り込みボタンを押します。
↑目的のテーブルを選択する。
取り込みボタンを押すと、取り込み位置を聞いてきます。
ここでは、左上のa1を選択しました。
↑目的のテーブルを選択する。
無事にデータを取り込むことが出来ました。
A列 B列 C列 D列 E列 F列
順位 書名 出版社名(略称) 価格 ISBN 発売日
1 CPUの創りかた 毎コミ 2800 4-8399-0986-5 2003/9/30
2 速効!図解 ホームページ 1280 4-8399-0997-0 2003/3/13
3 平成15年度版 CAD利用技 3333 4-87193-916-2 2003/2/28
4 写真・イラスト入りはが 1280 4-7980-0455-3 2003/1/30
と、簡単に読み込むことが出来ました。
/*
* 3.このデータを使用して、販売ページを作成する
*/
さてと、これを紹介するだけでは、お金になりません。
自分のHPから申し込まれたよ、、などの情報を付けないと。
バナー広告は、各会社によって違いますが、
バリューコマース社の楽天ブックを使用してみます。
( 作成方法のページ http://books.rakuten.co.jp/afvc/afinfo/page05.html )
必要なのは、パターン的に、自分のIDなどと本を識別するIDです。
私のIDは、バリューコマース社だと、sid=38866&pid=871611930
で、本の識別は通常、ISBNコードなので、
下記の本を紹介したい場合は、
1 CPUの創りかた 毎コミ 2800 4-8399-0986-5 2003/9/30
のISBNコードは、4-8399-0986-5なので、
http://books.rakuten.co.jp/afvc/r.jsp?sid=38866&pid=871611930&i=4839909865
と、作ることが出来ます。
これだと、何がなんだかわからないので、
本のタイトルとリンクする下記のHTMLを作成します。
<html>
<body>
<A HREF="http://books.rakuten.co.jp/afvc/r.jsp?sid=38866&pid=871611930&i=4839909865">
CPUの創りかた
</a><br>
<A HREF="http://books.rakuten.co.jp/afvc/r.jsp?sid=38866&pid=871611930&i=4839909970">
速効!図解 ホームページ・ビルダー7
</a><br>
</body>
</html>
なんて感じの、タイトルとリンクを作成します。
このHTMLを作成するデータとして必要なのは
A列 B列 C列 D列 E列 F列
順位 書名 出版社名(略称) 価格 ISBN 発売日
1 CPUの創りかた 毎コミ 2800 4-8399-0986-5 2003/9/30
2 速効!図解 ホームページ 1280 4-8399-0997-0 2003/3/13
B列のタイトルとE列のISBN番号です。
まずは、テキストファイルを作成するテストを作ります。
Sub test_filemake()
'ファイルの作成テストを行う
Dim nFNO As Integer
Dim strFNAME As String 'ファイル名
'ファイル名を作成する、ブックの位置+test.html
strFNAME = ThisWorkbook.Path & "\test.html"
nFNO = FreeFile '空いているファイル番号をもらう
Open strFNAME For Output As #nFNO '新規にファイルをオープン
Print #nFNO, "<html><head><title>TEST</title></head>"
Print #nFNO, "<body>"
Print #nFNO, "<h1>書籍販売ページのテスト</h1>"
Print #nFNO, "</body>"
Print #nFNO, "</html>"
Close #nFNO
MsgBox strFNAME & "に書き込みました"
End Sub
普通に、ファイルをオープンして、HTMLファイルを作成してみました。
あとは、ループでリンクのデータを作成したいので、
Sub test_filemake()
'ファイルの作成テストを行う
Dim nFNO As Integer
Dim strFNAME As String 'ファイル名
Dim nYLINE As Integer '行番号
'ファイル名を作成する、ブックの位置+test.html
strFNAME = ThisWorkbook.Path & "\test.html"
nFNO = FreeFile '空いているファイル番号をもらう
Open strFNAME For Output As #nFNO '新規にファイルをオープン
Print #nFNO, "<html><head><title>TEST</title></head>"
Print #nFNO, "<body>"
Print #nFNO, "<h1>書籍販売ページのテスト</h1>"
'データシートを選択する
Sheets("DATA").Select
'ループで書籍データを作成する
For nYLINE = 2 To 31
'書籍のリンクデータを作成する
Print #nFNO, "<A HREF='http://books.rakuten.co.jp/afvc/r.jsp";
Print #nFNO, "?sid=38866&pid=871611930";
'-を除いたISBN番号を書き込む(Replaceで取り除く)
Print #nFNO, "&i=" & Replace(Cells(nYLINE, "E"), "-", "");
Print #nFNO, "'>"
'タイトルを書き込む
Print #nFNO, Cells(nYLINE, "B")
'タグを閉める
Print #nFNO, "</A><br>"
Next nYLINE
Print #nFNO, "</body>"
Print #nFNO, "</html>"
Close #nFNO
MsgBox strFNAME & "に書き込みました"
'メニューシートに戻る
Sheets("Menu").Select
End Sub
ループで回して、Printステートメントで単純に書き込みました。
あとは、Webクエリの更新作業をマクロ記録して、
Sub DATA_Refresh()
Sheets("DATA").Select
Range("A2").Select
'Webクエリのデータを更新する
Selection.QueryTable.Refresh BackgroundQuery:=False
MsgBox "更新終了、データを確認してください"
Sheets("MENU").Select
End Sub
と、
ランキングが更新されたら、シートも更新するように作成しました。
/*
* 3.終わりの挨拶
*/
今回は、Webクエリを使用して、Webからデータを抜き出し、
そのデータを使用して、新たなデータを作成してみました。
コンピュータの書籍ページでしたが、
いろいろなランキングを抜き出して、
売れ筋ランキングの販売ページを作成できると思います。
こんな方法もあるってことで、何か読者の心に残れば、うれしいです。
*私の独り言をうまく消化してくださいね。
偉そうな感じ悪い人になりかけてる不親切なKen3でした。
~~~~~~~(↑オイオイ、また攻撃食らうぞ(笑))
作成した関数がそっくりそのまま使っていると、メールで指摘されました。
googleで検索して、参考にしたコードを変数名だけが違うだけで、コピーをして
自分が作ったような記事を書いてしまいました。
掲示板に連続で書き込みやメールが来た時点で気が付くべきでした。
軽率な行動をお詫びするとともに、この記事を削除します。
スミマセンでした。
<固定処理を見直してみませんか?>
どうも、三流プログラマーのKen3です。
こんにちは、三流プログラマーのKen3です。
今回は、私がやっと気が付いたことを書きたいと思います。
/*
* 1. 今日の狙い・・・
*/
私がやっと気が付いたこと?
^^^^^^^^^^^^^^^^^^^^^^^^^^
どんなこと?
くだらないことでしょ・・・と話を引っぱって置いて、
/*
* 2.値を受け取り、処理を行う、そんな作りにする
*/
私が、関数作りヘタだなぁと自分で思ったことがあって、
少し前のメルマガで、ftp.exeを使用して、サーバーにファイルを書き込む、
そんな処理を作ってました。
Sub test()
Dim strPNAME As String 'パラメーターファイル名
Dim nFNO As Integer 'ファイル番号
strPNAME = ThisWorkbook.Path & "\ftptest.txt" 'ファイル名作成
nFNO = FreeFile '空いてるファイル番号を取る
Open strPNAME For Output As #nFNO 'ファイルを新規作成
'データ書き込み
Print #nFNO, "open plaza14.mbn.or.jp" 'openホスト名
Print #nFNO, "user ken3 XXXXXX←パス" 'userコマンド ユーザー名 パスワード
Print #nFNO, "cd www"
Print #nFNO, "pwd"
Print #nFNO, "get index.html " & ThisWorkbook.Path & "\index.html"
Close #nFNO '開いたら閉じようね
'shellでFTPを起動 -nのオプションを付ける
Shell "ftp -n -s:" & strPNAME
End Sub
みたいに、作ってましたが、
Print #nFNO, "open plaza14.mbn.or.jp" 'openホスト名
など、ホスト名は、プログラムに埋め込み、
Print #nFNO, "user ken3 XXXXXX←パス" 'userコマンド ユーザー名 パスワード
Print #nFNO, "get index.html " & ThisWorkbook.Path & "\index.html"
などのファイル名も、そのまま書いてました。
まぁ、Constで定数を宣言なんて書いた時期もありましたが、
Const strHOST = "plaza14.mbn.or.jp"
として、
Print #nFNO, "open " & strHOST
と書く方法もあると思います。
必要な固定データをConst宣言して、変更を容易にする。
その方法もありなのですが、
必要なデータは変数で、受け取るようにする。
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
この作りにしているほうが、流用性・汎用性があがることに最近やっと気が付く。
'ホスト名,ユーザー名、パスワード,ディレクトリ,書き込みファイル
'を受け取り、ftp.exeを起動して、ファイルをUPLOADする
Sub ftp_upfile(strHNAME As String, _
strUSERNAME As String, _
strPASS As String, _
strDIR As String, _
strUPFILE As String)
End Sub
このように、引数を受け取るように関数化して、
Sub TEST()
Dim strFILENAME As String 'ファイル名受け取り用
'ファイル名を選択する
strFILENAME = Application.GetOpenFilename
'プログラムの中にパスワード埋め込むのよくないけど
'作った関数をコールする
Call ftp_upfile("ftp.xxxx.jp", "username", "pass", "data/pc/", strFILENAME)
End Sub
とメインのルーチンで呼ぶ、すると、変更やテストも容易です。
さらにTESTのメインルーチンでConstを使い、
Sub TEST()
Const strHOST = "ftp.xxxx.jp"
Const strUSER = "username"
Const strPASS = "pass"
Const strUPDIR = "data/001/"
Dim strFILENAME As String 'ファイル名受け取り用
'ファイル名を選択する
strFILENAME = Application.GetOpenFilename
'作った関数をコールする
Call ftp_upfile(strHOST, strUSER, strPASS, strUPDIR, strFILENAME)
End Sub
これが、いいんだなぁ、、、とやっと感じました。
※皆さんからみれば、当たり前かもしれませんが。
--- 余談 作成した、Ftp.exeを使ったサンプル ----
'ホスト名,ユーザー名、パスワード,ディレクトリ,書き込みファイル
'を受け取り、ftp.exeを起動して、ファイルをUPLOADする
Sub ftp_upfile(strHNAME As String, _
strUSERNAME As String, _
strPASS As String, _
strDIR As String, _
strUPFILE As String)
Dim strPNAME As String 'パラメーターファイル名
Dim nFNO As Integer 'ファイル番号
'パラメータファイル名をブック位置\ftppara.datとする
strPNAME = ThisWorkbook.Path & "\ftppara.dat" 'ファイル名作成
'ファイルを新規作成する
nFNO = FreeFile '空いてるファイル番号を取る
Open strPNAME For Output As #nFNO 'ファイルを新規作成
'コマンドデータを書き込む
Print #nFNO, "open " & strHNAME 'open ホスト名
Print #nFNO, "user " & strUSERNAME & " " & strPASS 'user ユーザー名 パスワード
Print #nFNO, "cd " & strDIR 'cd xxxx 書き込みディレクトリへ移動
Print #nFNO, "put " & strUPFILE 'put ファイル名 で、ファイルをアップする
Print #nFNO, "quit" 'bay で コマンド終了
'ファイルを閉じる(作成が終了したので)
Close #nFNO '開いたら閉じようね
'shellでFTPを起動 -n,-s:ファイル名 のオプションを付ける
Shell "ftp -n -s:" & strPNAME
End Sub
※問題点は、スペースありのフォルダー名と複数ファイルのUPです。
まだまだ、改良の余地があるけど、
引数で受け取るようにすると、変更するときもデータを気にしないでOKなので、
楽ですね。
データの管理部分と処理部分を分ける、基本と言われそうだけど、
なんかやっと気が付いた感じがします。
(なんていいつつ、次作るときは、今の心境を忘れて昔に戻ったりして)
/*
* 3.過去の資産の見直し
*/
って、ことは、
私が過去に作ったモージュールは、
データ部分と処理部分が分かれていない、そんなモジュールが多いと思う。
※過去の自分の弁護すると(笑)、テストとしては一緒のほうが見やすいんだけど。
皆さんも、過去の資産を見直してみてください。
私も、見直して、汎用性のあるモジュールの例を書いてみたいと思います。
/*
* 4.終わりの挨拶
*/
今回は、
やっと気が付いた、データと処理を分ける。
そんな話でした。
※ツール作りを目標にしているので、
汎用性のある部品を作っていきたいですね。
こんな方法もあるってことで、何か読者の心に残れば、うれしいです。
*私の独り言をうまく消化してくださいね。
最近、偉そうで感じ悪いと評判の不親切なKen3でした。
~~~~~~~(↑オイオイ、また攻撃食らうぞ(笑))
<HTML JavaScript onchangeで選択後内容を変更する>
こんにちは、三流プログラマーのKen3です。
今回は、
掲示板に来た質問を処理してみたいと思います。
※またまた、先に来た質問より、後に来た質問を処理してます・・・
ヤバイよね、、信用なくしそう・・・
/*
* 1. 今日の狙い・・・
*/
掲示板に下記の質問をもらう
----
<FORM name=form1 onsubmit="mai('s');return false;">
<TBODY>
<TR>
<TD><B>場名</B><BR>
<DIV align=right><SELECT onchange=Rdp(); name=JYO>
<OPTION value=0 selected>選択項目 </OPTION></SELECT></DIV></TD></TR>
<TR>
<TD><B>レース</B><BR>
<DIV align=right><SELECT onchange=Hdp(); name=Race>
<OPTION value=0 selected>選択項目 </OPTION></SELECT></DIV></TD></TR>
<TR>
あるサイトの一部ぬきだしました。
ここで、おそわったのを、まねして
WB1.Document.form1.jyo.selectedIndex = 1
WB1.Document.form1.jyo.Options(1).selected = "selected"
WB1.Document.form1.jyo.Options(1).selected = True
と、やると、コンボに選択された文字がでました。成功!と
おもいきや、つぎのレースの選択項目が、からっぽです。
ためしに、マウスでクリックすると、選択項目が、
ふくまれます。documentも、かわるようです。
どうやら、onchangeが、おきてないためらしい。
これについて、いろいろ、しらべたけど、わかりません。
疑問1:rdp()という関数は、どこにあるんでしょうか。
このhtmlの、最後に、なにか、
scriptが、あるのですが、(よめない)
どうも、それではないみたいです。
疑問2: onchangeを、vbから、起こしてやることは
できないでしょうか。
----
値は変えられるけど、
スクリプトが呼ばれなくて、目的の動作をしないってヤツですね。
/*
* 2.敵を知るか
*/
まずは、敵を知るか。
^^^^^^^^^^^^^^^^^^^^
えっと、関西遠征の藤沢厩舎の馬は、自信があるから遠征してるので買い?
デサーモ?の複勝率がいいので要チェック(裏読むと1・2に着てないの?)
砂のアンカツ?実は芝の長距離が得意?
なんて、競馬好きの実兄に聞きました。
って、違うか。
少し、まじめに話すと、
関東には、中山・東京・・
関西には、阪神・京都・・
と
レース場があり、レースは、京都11Rとか東京9Rとか指定します。
馬券を買うときは、レース場に注意ですね。
<TD><B>場名</B><BR>
<DIV align=right><SELECT onchange=Rdp(); name=JYO>
<OPTION value=0 selected>選択項目 </OPTION></SELECT></DIV></TD></TR>
<TR>
<TD><B>レース</B><BR>
<DIV align=right><SELECT onchange=Hdp(); name=Race>
<OPTION value=0 selected>選択項目 </OPTION></SELECT></DIV></TD></TR>
<TR>
優秀なHTMLフォームで1つのフォームを切り替えて選択させてるみたいですね。
(私ならフォームをtokyo11.htmlやnakayama06.htmlとレースごとに分けそう・・・
あっ、これだと、切り替えるたびに読み込みが走り、レスポンスがわるいのか)
2003年5回京都6日 2003年4回東京6日
9R もみじステークス 9R 昇仙峡特別
10R古都ステークス 10R 奥多摩ステークス
11Rマイルチャンピオンシップ(GI) 11R 霜月ステークス
まぁ、こんな感じで、
京都と東京が場名で、
もみじステークスやマイルチャンピオンシップってのが、レースとしましょう。
なんかリアルすぎるな(笑)
だから何?って学生さんや普通のOLさんの声が聞こえたり、
そんなこたぁわかっているよなんてオジサン・お姉さん居ると思いますが、
予備知識ってことで。(長いか)
※競馬、私もよくわかっていないので、例が間違っていたらスミマセン。
アンカツって外国人?と兄にギャグかましてる、私はそんなレベルなので。
ペリエって誰?歴史上の人物?
/*
* 3.JavaScriptで切り替えるHTMLを書いてみた
*/
質問と少し離れてしまうが、
自分が興味あったので、連動して選択肢が変わる、そんなフォームを作ってみた
~~~~~~~~~~~~~~~~~~~~~~ ※場名を京都と選択すると京都のレースが表示される
ソースをパクって、空のフォームをまず作成する。
<FORM name=form1 onsubmit="mai('s');return false;">
<TABLE BORDER="1">
<TR>
<TD><B>場名</B><BR>
<DIV align=right>
<SELECT onchange=Rdp(); name=JYO>
<OPTION value=0 selected>選択項目 </OPTION>
</SELECT></DIV></TD>
</TR>
<TR>
<TD><B>レース</B><BR>
<DIV align=right><SELECT onchange="Hdp();" name=Race>
<OPTION value=0 selected>選択項目 </OPTION></SELECT></DIV></TD>
</TR>
<TR><TD><INPUT TYPE="submit" VALUE="送信"></TD></TR>
</TABLE>
</FORM>
この選択肢、
場名 JYO
と
レース Race
に対して、変更するスクリプトを作成する。
( onchange=Rdp(); などで、選択肢を変更したときに走る)
<script type="text/javascript">
<!-- //ここからJavaの関数を書いてみる
function Rdp(){ // Rdp 場所が選択されたらレース内容を変更する
//レース内容を場所に合わせて変更
document.form1.Race.length = 3; //強引にオブジェクトを3にする(ホントは12R)
var n = document.form1.JYO.selectedIndex //場名選択位置を代入
alert("開催選択後、Rdp呼ばれたよn="+n);
switch (n) {
case 1: //東京なら
document.form1.Race.options[0].text = "9R 昇仙峡特別";
document.form1.Race.options[1].text = "10R 奥多摩ステークス";
document.form1.Race.options[2].text = "11R 霜月ステークス";
break;
case 2: //京都なら
document.form1.Race.options[0].text = "9R もみじステークス";
document.form1.Race.options[1].text = "10R古都ステークス";
document.form1.Race.options[2].text = "11Rマイルチャンピオンシップ(GI)"; break;
case 3: //中山なら
alert("開催してないよ");
break;
case 4: //阪神なら
alert("開催してないよ");
break;
}
}
function Hdp(){ // Hdp レースが選択されたら次は?(今回は省略)
alert("Hdp呼ばれたよ(レース選択後)");
}
function mai(parapara){ // maiイベントのテスト
// Submitボタンが押されると、ここが走るのでテストする
alert("受け取ったのは"+parapara);
}
// -->
</script>
JRAのシステムがどうなっているか、わかりませんが、
こんな感じで、レース名を変更させることが出来ます。
http://www.ken3.org/vba/test153.html
で
テストできます。
/*
* 4.終わりの挨拶
*/
オマエ、日本語読めないだろう?
えっ、なんで?
私は、東京の田舎生まれ(神奈川の近く)ですよ。
だってさ、質問は、
>疑問1:rdp()という関数は、どこにあるんでしょうか。
> このhtmlの、最後に、なにか、
> scriptが、あるのですが、(よめない)
> どうも、それではないみたいです。
>疑問2: onchangeを、vbから、起こしてやることは
> できないでしょうか。
ですよ。
だれも、JavaScriptのonchangeなんて聞いてないんだよ!!
onchange=Rdp();
のRdp()がソースのどこにも無いって話だろ。
あっ、、、そうでした。
自分が興味があったので、勝手に進めてたけど。
えっと、予想では、本体のファイルと別に外部スクリプトの呼び込みで、
<html>
<head>
<title>タイトル、競馬で儲けよう</title>
<script type="text/javascript" src="jra_script.js">
</script>
</head>
<body>
みたいな感じで、
<script type="text/javascript" src="jra_script.js">
と
src="jra_script.js"
SRC=ファイル名で、その日のファイルを差し替えているのでは?
と深読みしてみました。
まぁ、百歩譲って、それはよしとしようか。
次のイベントが発生しないのは?なんでなの?
えっと、テストのHTML作れたので、次回のメルマガで結果報告します。
また、次回の先送りかよ、ホントに発行するの?逃げんなよコラ!!
今回は、テスト用のHTMLファイルを作成しただけでした。
JavaScriptで選択肢を変えながらのFORM作れることを脱線してやってみました。
本線のイベントが発生しない件は、次回に持越しです。
http://www.ken3.org/vba/test153.html
でテストできるので、
読者質問の本線、
^^^^^^^^^^^^^^^^
イベント処理が発生しない/発生させたいをテストしてくれる猛者は、
VBで、
京都を選択後にJavaScriptで変更されたレース名、
マイルチャンピオンシップを選択するプログラムを書いてみてください。
※けんぞうより先に掲示板にUPしてくれる猛者、募集中です。
(連休明けなので、本業の業務がかたずいたら、
ヒマみて私より早くやってくれるとうれしいです。)
最近、偉そうで感じ悪いと評判の不親切なKen3でした。
~~~~~~~(↑オイオイ、また攻撃食らうぞ(笑))
<IE SELECTタグの選択 .SelectedIndex=nで選択>
どうも、三流プログラマーのKen3です。
今回は、
SELECT タグを探ってみます。
今回の、サンプルファイルは、
http://www.ken3.org/vba/lzh/vba154.lzh
にvba154.xls(Excel2000版)が保存されています。
※自分でテストページを作ったりして、遊んでみてください。
関連項目、
VBAでInternetExplorer.Applicationを操作する(IE操作)
http://www.ken3.org/cgi-bin/group/vba_ie.asp
もヨロシクね。
/*
* 1.今回のキッカケ
*/
VBA系の掲示板
http://www.ken3.org/cgi-bin/bbs/vba/wforum.cgi
で、SELECTタグOPTIONの選択でJavaScriptが起動しない、
そんな問題にぶちあたりました。
もらった質問に対して、いつものように、違う方向に進んでいるんだけど。
今回、
実は、読者からの質問で、
自分だけが得してしまった情報/気が付いたプロパティを書いてみます。
^^^^^^^^^^^^^^^^^^^^^^^^
下記がもらった質問です。
----
<FORM name=form1 onsubmit="mai('s');return false;">
<TBODY>
<TR>
<TD><B>場名</B><BR>
<DIV align=right><SELECT onchange=Rdp(); name=JYO>
<OPTION value=0 selected>選択項目 </OPTION></SELECT></DIV></TD></TR>
<TR>
<TD><B>レース</B><BR>
<DIV align=right><SELECT onchange=Hdp(); name=Race>
<OPTION value=0 selected>選択項目 </OPTION></SELECT></DIV></TD></TR>
<TR>
あるサイトの一部ぬきだしました。
ここで、おそわったのを、まねして
WB1.Document.form1.jyo.selectedIndex = 1
WB1.Document.form1.jyo.Options(1).selected = "selected"
WB1.Document.form1.jyo.Options(1).selected = True
と、やると、コンボに選択された文字がでました。成功!と
おもいきや、つぎのレースの選択項目が、からっぽです。
ためしに、マウスでクリックすると、選択項目が、
ふくまれます。documentも、かわるようです。
どうやら、onchangeが、おきてないためらしい。
これについて、いろいろ、しらべたけど、わかりません。
疑問1:rdp()という関数は、どこにあるんでしょうか。
このhtmlの、最後に、なにか、
scriptが、あるのですが、(よめない)
どうも、それではないみたいです。
疑問2: onchangeを、vbから、起こしてやることは
できないでしょうか。
----
/*
* 2.またまた、脱線昔話、いつになったら本題が完成するの?
*/
http://www.ken3.org/vba/test110.html
の
入力フォーム
<SELECT name="ken"> と 項目名はkenにして6球団を選択
<option value="1">阪神</option>
<option value="2">中日</option>
<option value="3">ヤクルト</option>
<option value="4">巨人</option>
<option value="5">広島</option>
<option value="6">横浜</option>
</SELECT><br>
<SELECT name="kansou"> と 項目名はkansouにして3〜0を選択
<option value="3">IE最高</option>
<option value="2">MSは日本語技術情報ハヤク作れ</option>
<option value="1">イヤもっと英語力付けろ</option>
<option value="0">メルマガふざけないで・・・まじめに書け</option>
</SELECT>
に対して、SELECT OPTIONを選択する時、
私は、下記のような感じで選択してました。
No.110 IE SELECTタグ OPTIONを選択する.Document.all(n).Selected=True
http://www.ken3.org/backno/backno_vba23.html#110
で、やった方法は、
いま、どのSELECTタグを通過したかを覚えて、
下記のように処理しました。
Sub ie_test()
Dim objIE As Object 'IEオブジェクト参照用
'インターネットエクスプローラーのオブジェクトを作る
Set objIE = CreateObject("InternetExplorer.application")
objIE.Visible = True '見えるようにする(お約束)
'文字列で指定したURLに飛ぶ
objIE.Navigate "http://www.ken3.org/vba/test110.html"
'表示終了まで待つ
Do While objIE.Busy = True
'何もしないループ(笑)
DoEvents
Loop
'項目名を探して、データをセットする
Dim i As Integer
Dim strSTAG As String '最近のSELECTタグの名前を保存
'全ての項目を調べる
For i = 0 To objIE.Document.all.Length - 1
'インプットのタグか?.tagnameを見る
Debug.Print i & ":" & objIE.Document.all(i).tagname
If objIE.Document.all(i).tagname = "SELECT" Then
strSTAG = objIE.Document.all(i).Name 'SELECT名前を代入
End If
If objIE.Document.all(i).tagname = "OPTION" Then
'さらに、値が2と保存したSELECTがKenかチェックする
If objIE.Document.all(i).Value = "2" And strSTAG = "ken" Then
'ここまで調べて、チェックを付ける
objIE.Document.all(i).Selected = True
End If
'さらに、値が1と保存したSELECTがkansouかチェックする
If objIE.Document.all(i).Value = "1" And strSTAG = "kansou" Then
'ここまで調べて、チェックを付ける
objIE.Document.all(i).Selected = True
End If
End If
Next i
End Sub
ポイントは、
~~~~~~~~~~~~
.tagname = "SELECT"の時、
strSTAG = objIE.Document.all(i).Name 'SELECT名前を代入
と、名前を保存します。
OPTIONよりも先にSELECTタグが現れるHTMLの仕様を利用してます。
※OPTIONだけはありえないので。
で、あとは、保存されたstrSTAGと値を比べて、
必要なデータを選択してます。
/*
* 3..SelectedIndexを使ってみた
*/
と、やって済ませてたけど、
今回の読者の質問見ると、あれ?これなんだ?って反応したのが、
>WB1.Document.form1.jyo.selectedIndex = 1
>WB1.Document.form1.jyo.Options(1).selected = "selected"
>WB1.Document.form1.jyo.Options(1).selected = True
の、
.selectedIndex = 1
^^^^^^^^^^^^^^^^^^
これって、SELECTタグの選択位置じゃないの?
私は、OPTIONタグを一生懸命探して、
objIE.Document.all(i).Selected = True
なんてやってたけど、
.SelectedIndexなんてのが使えるなら、
~~~~~~~~~~~~~~
上から0番目、上から3番目とか指定した選択が出来そうですね。
上からn番目なので、valueの値とは、連動しないことに注意してくださいね。
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
<SELECT name="ken"> と 項目名はkenにして6球団を選択
<option value="1">阪神</option>
<option value="2">中日</option>
<option value="3">ヤクルト</option>
<option value="4">巨人</option>
<option value="5">広島</option>
<option value="6">横浜</option>
</SELECT><br>
<SELECT name="kansou"> と 項目名はkansouにして3〜0を選択
<option value="3">IE最高</option>
<option value="2">MSは日本語技術情報ハヤク作れ</option>
<option value="1">イヤもっと英語力付けろ</option>
<option value="0">メルマガふざけないで・・・まじめに書け</option>
</SELECT>
テストで、
Ken3が好きなヨハコマベイスターズ
と
某掲示板で言われた最新情報ほしかったら英語のドキュメント読め
を選択するために、
SELECTタグの.SelectedIndexに値をセットしてみます。
objIE.Document.all.Ken.SelectedIndex = 5
objIE.Document.all.kansou.SelectedIndex = 2
と、上から(0から数えたインデックス)でデータを選択してます。
下記が、ソースファイルです。
option valueと連動していない(残念)なことも含めて確認してみてください。
Sub ie_test()
Dim objIE As Object 'IEオブジェクト参照用
'インターネットエクスプローラーのオブジェクトを作る
Set objIE = CreateObject("InternetExplorer.application")
objIE.Visible = True '見えるようにする(お約束)
'文字列で指定したURLに飛ぶ
objIE.Navigate "http://www.ken3.org/vba/test110.html"
'表示終了まで待つ
Do While objIE.Busy = True
'何もしないループ(笑)
DoEvents
Loop
'SELECTタグに付いた名前(Name)がKen上から6番目(5)をテストでセット
'.SelectedIndexに5をセット(012345で6番目となる)
objIE.Document.all.Ken.SelectedIndex = 5
'kansouの上から3番目(2)をテストで選択する.SelectedIndexに2をセット
objIE.Document.all.kansou.SelectedIndex = 2
'0からインデックスが始まるのがポイントです↑
End Sub
こんな方法もあるんですね・・・・逆に勉強になってしまった。
______________________________
---- 余談 試験問題のお話 ----
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
なんか、読者の質問に、別の回答が隠されて居たりしたので、
中学生の頃、英語の試験で、英単語が解らなかった時に、
別の和訳の問題に解答が書いてあった、
そんなかなり前のことをなぜか思い出してしまった。
現在の質問に過去問題の回答が隠されている。なんか面白いよね。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
現在の恋人とのケンカで、昔の恋人との簡単なもう一つの和解方法に気が付いたり?
※↑チョット違うかな。
えっ、過去には戻れないので、今後にその経験を活かせば良いって?
みなさん前向きなんですねメモメモ。過去はあまり引きずらないほうがいいよね!!
おっと、昔の問題解決方法は置いといて、現在の問題を処理しないとね。
-【けんぞう!】---------------------------------------------------------
ASPが利用可能なレンタルサーバーをお探しのアナタ、
http://www.ken3.org/asp/server.html ← けんぞうも使っているサーバーの紹介
『おっIISでbasp21でメール送信、mdbも使えるよ』(三流PG:31歳)
------------------------------------------------------------------------
/*
* 4.終わりの挨拶
*/
今回は、
またまた、読者質問の本線をほっといて、
勝手に脱線して、
.SelectedIndexを使ってみた話でした。
^^^^^^^^^^^^^^
だから、ハヤク、.SelectedIndexでJavaScriptが起動しない問題をヤレよ!!
何か読者の心に残れば、うれしいです。
*私の独り言をうまく消化してくださいね。
いつも失敗?の負け組のKen3でした。
~~~~~~~(↑オイオイ)
In message "[VBAで楽しく No.141] - 箇条書きで必要部品を洗い出し単体テストする",
>日光が斜めから射すので、まっすぐに伸びない?
>^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>植物の成長って、日光に向かって伸びるんですよね。
>太陽の光がナナメからだったら、ナナメに伸びる・・・
>(上司や先輩の育て方や光具合が、新人の成長に影響を与えるのも事実です・・・)
---
って、話じゃないですが、私の変なサンプル見て、ナナメに育たないように、、、、
※最初に教えたループで回してより、
今回の.SelectedIndexにセット方法がよかったみたいに、
教わったことだけじゃなく、さらに調べてくださいね。
ページフッター(リンクや広告など)
[三流君(TOP ken3.org へ戻る) ]
-- [VBA系TOPへ ]
---- [VBA系バックナンバー目次へ移動 ]
------ [VBAでIEを操作 CreateObject("InternetExplorer.application") ]・・・実は当店一番人気、VBAでIEを操作するサンプルです
------ [VBAでOutlookの操作 CreateObject("Outlook.Application") ]・・・Outlookを使い、メール関係の処理です
------ [Access から Excel 連携 CreateObject("Excel.Application") ]・・・人気のAccessからExcelへデータ書き出しなどです
------ [AccessのUserForm/サブフォームを操作 ]・・・アクセスでフォームを使ったサンプルです
------ [Accessのレポートを操作 ]・・・レポートを操作してみました
------ [Access クエリー関係やその他関数 ]・・・あまりまとまってませんが、スポット的な単体関数の解説です
------ [Excel UserForm(ユーザーフォーム)を操作する ]・・・エクセルでユーザーフォームを作成して入力などを行ってます
------ [ExcelからAccessを操作する ]・・・ExcelからAccessのマクロを起動してみました、
------ [Excel関係 関数、その他 ]・・・その他Excel関係です
------ [VBAでテキストファイル(*.txt,*.html,*.csv)の操作 ]・・・テキストファイルを使ったサンプルです
------ [VBA 標準関数関係とその他解説 ]・・・その他、グダグタ解説してます
広告
-- [通販系の売れ筋広告へ ] ←主に楽天やAmazonのランキングです
blog
-- [三流君の作業日記 ] ← 日々の作業を少々
-- [通販あしあと ] ← 通販ページの足跡を一覧で羅列
情報を探す
情報を探すならGoogleかな?
↓Web全体、サポート情報(support.microsoft.com)や三流君VBA(ken3.org)から検索する
書籍の購入
Webだけじゃさすがに勉強しきれないので、プログラミング関係の書籍も読んでみては??
コンピュータ書籍の発送がハヤイ専門店
コンピュータの本・専門店
※種類が豊富 で探し易いです。※在庫ありが48時間以内発送 が急ぎで資料や書籍がほしい時、とても助かります。
お奨め本の目次を見るだけでも勉強になったり
amazon.co.jpでキーワード別チェック
下記、私が設定したキーワードですが、こんな感じで資料や書籍を探ってみては?
[VBA全体を把握する ] -- やはり全体をさらっと見たいですよね。
[SQL関連でDB力UP ] -- システムはデータベース設計が重要
[ADO接続を探る ] -- VBAなのでADO接続を押さえておく
[Windows APIを探る ] -- さらにAPIになて知ってれば強力だ!
[.NETを探る ] -- と言っても時代は.NETに流れてるし
プログラミング以外でも知りたいことは多くって、
[人間関係 ] -- で、客先・上司、まわりに気を使い。
[プログラマーの自己啓発 ] -- プログラムだけじゃなくいろいろと向上したいよ
[コーチング・育成 ] -- 先輩になったら後輩(部下)の面倒をみてね。
そんなこんなでプログラマーっていろいろと大変なんだってば・・・