http://q.hatena.ne.jp/1256930412 の質問に回答するための下書き作成。なかなかシックリこないけど・・・
(回答下書き 試作 Excel A列の値(本タイトル)をWebブラウザーにセットする)
今回作成したサンプルはOS:Windows XP IE8 Excel2003でテストしました。
Book1102.xls
です。(裸の.xlsなのでダウンロード時警告出るので、そのまま開かないで保存してから使ってください)
動かしながら、下の解説を見てください。※百聞は一見に...
仕様、動作イメージ
ExcelのA列に本のタイトルが記入されています。
操作のタイミングを取りたいので、A列のタイトルが
ダブルクリックされたら、
操作対象のURL
日本の古本屋:詳細検索
http://www.kosho.or.jp/public/book/detailsearch.do
の
書 名
にA列の値をセットする。
作成したプログラム
※手前味噌のサンプル
三流君objIE解説: QA0914 .Document.allを使いデータセットと結果取得を連続で
http://ken3-info.blog.ocn.ne.jp/objie/2009/09/qa0914_document.html
↑を元に作成しました。
シートに下記のコードを貼り付けます。
貼り付け手順:シートのイベントにコードを書きたいので、
シートの名前の上にカーソルを
合わせてから右クリック、
コードの表示を選択する
Option Explicit 'ダブルクリックのイベント Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Target.Column = 1 Then 'A列の場合だけ、処理する。 Call ie_test(Target.Value) 'クリックされた場所の値を渡す。 End If End Sub '本のタイトルを受け取り、IEを起動して、書名にセットします。 Private Sub ie_test(bookname As String) 'IEの起動 Dim objIE As Object '変数を定義します。 Set objIE = CreateObject("InternetExplorer.Application") 'オブジェクトを作成します。 objIE.Visible = True '可視、Trueで見えるようにします。 '処理したいページを表示します。 objIE.Navigate "http://www.kosho.or.jp/public/book/detailsearch.do" '.Navigate メソッドで表示する。 '↑上記のページの表示が完了するまで待ちます。 While objIE.ReadyState <> 4 Or objIE.Busy = True '.ReadyState <> 4の間まわる。 DoEvents '重いので嫌いな人居るけど。 Wend 'ページが表示されたので、表示された文章に対して、処理を行います。 objIE.Document.all("p_shomei").Value = bookname 'A列の値を 書名にセットする。 End Sub
↓作成手順、↑試行錯誤の恥ずかしい動画。。。(手間がかかりすぎ(笑))
www.youtube.com
※Youtube動画のURLを貼る。
http://www.youtube.com/watch?v=tE5A_3A1ziA
問題点
・この処理だと、A列をダブルクリックするたびに、IEが複数起動してしまう。
複数起動の問題にチャレンジする、試作する
起動済みのIEを使用するか、起動していない場合のみIEを新規で起動するように変更する。
CreateObject("Shell.Application")
から
.Windows の (n番目) .FullName が "IEXPLORE.EXE"
か探して、IEが起動していたら、起動済みのIEを使うように、変更してみました。
※ついでに、F列の選択 と Excelの最小化を蛇足で入れてみました。
※手前味噌のサンプル
三流君objIE解説: 起動済み、指定したURLのIEを探し、閉じる方法
http://ken3-info.blog.ocn.ne.jp/objie/2009/09/urlie_785f.html
↑を元に作成しました。
コードは下記のような感じです。※修正動画、試行錯誤を見て、笑ってくださいね。
Option Explicit 'ダブルクリックのイベント Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Target.Column = 1 Then 'A列の場合だけ、処理する。 Call ie_test(Target.Value) 'クリックされた場所の値をIEに渡す。 Cells(Target.Row, 6).Select 'F列の選択 End If End Sub '本のタイトルを受け取り、IEを起動して、書名にセットします。 Private Sub ie_test(bookname As String) '起動済みのIEを探す Dim objShell As Object 'Shell.ApplicationのWindowから探したいので Dim objIE As Object 'IEを入れる箱(捕まえてコントロールしたい) Dim n As Integer 'カウンターです。 'これで、エクスプローラーのウインドウを取得する Set objShell = CreateObject("Shell.Application") Set objIE = Nothing '初期化する(フラグ代わりも兼ねて、後でIs Nothingでチェックしたいので) '後ろから探す(素直に前から探してよ(笑)) '.Windowsでエクスプローラーとインターネットエクスプローラー(FullNameがIEXPLORE.EXE)にさわれる For n = objShell.Windows.Count To 1 Step -1 'MAXから-1ひいてく感じ '.FullNameで普通のファイルエクスプローラーとIE(インターネットエクスプローラー)を区別する If Right(UCase(objShell.Windows(n - 1).FullName), 12) = "IEXPLORE.EXE" Then Set objIE = objShell.Windows(n - 1) 'n番目のウインドウ(FullNameがIEXPLORE.EXE)を代入 Exit For '見つけたので、↑代入後、強制的にループを抜ける End If Next Set objShell = Nothing 'もし起動済みのIEが見つからなければ、新たに起動する If objIE Is Nothing Then '上で見つけられたか? Set objIE = CreateObject("InternetExplorer.Application") 'オブジェクトを作成します。 End If objIE.Visible = True '可視、Trueで見えるようにします。 '処理したいページを表示します。 objIE.Navigate "http://www.kosho.or.jp/public/book/detailsearch.do" '.Navigate メソッドで表示する。 '↑上記のページの表示が完了するまで待ちます。 While objIE.ReadyState <> 4 Or objIE.Busy = True '.ReadyState <> 4の間まわる。 DoEvents '重いので嫌いな人居るけど。 Wend 'ページが表示されたので、表示された文章に対して、処理を行います。 objIE.document.all("p_shomei").Value = bookname 'A列の値を 書名にセットする。 'データセット後にIEを前面にする方法がわからなかったので、とりあえず、Excelを最小化してごまかす Application.WindowState = xlMinimized 'excelの最小化 End Sub
↓作成手順、↑試行錯誤の恥ずかしい動画。。。(手間がかかりすぎ(笑))
www.youtube.com
※Youtube動画のURLを貼る。
http://www.youtube.com/watch?v=nmP-34m3u_8
蛇足ついでに検索ボタンを押す
追加仕様: せっかく、書名のセットまでできたので、自動的に検索開始ボタンを押してみたいと思います。
※余計なことすると、ハマるんだけどね。
.Links リンクのオブジェクト(Aタグ)から、
n番目のリンクを1つ1つ見ていき、
If InStr(objFDOC.Links(n).innerHTML, "検索開始") > 0
で判断、見つかったら(0以上なら)
objFDOC.Links(n).Click '.Clickでクリックしてみた
.クリックメソッドで、ボタンを押してみました。
※手前味噌のサンプル
三流君objIE解説: アンカーテキストをクリック リンク先.Links から.InnerTEXTで比較して .Clickクリックする
http://ken3-info.blog.ocn.ne.jp/objie/2009/04/links_crf_inner.html
↑を元に作成しました。
コードは下記のような感じです。※修正動画、試行錯誤を見て、笑ってくださいね。
Option Explicit 'ダブルクリックのイベント Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Target.Column = 1 Then 'A列の場合だけ、処理する。 Call ie_test(Target.Value) 'クリックされた場所の値をIEに渡す。 Cells(Target.Row, 6).Select 'F列の選択 End If End Sub '本のタイトルを受け取り、IEを起動して、書名にセットします。 Private Sub ie_test(bookname As String) '起動済みのIEを探す Dim objShell As Object 'Shell.ApplicationのWindowから探したいので Dim objIE As Object 'IEを入れる箱(捕まえてコントロールしたい) Dim n As Integer 'カウンターです。 'これで、エクスプローラーのウインドウを取得する Set objShell = CreateObject("Shell.Application") Set objIE = Nothing '初期化する(フラグ代わりも兼ねて、後でIs Nothingでチェックしたいので) '後ろから探す(素直に前から探してよ(笑)) '.Windowsでエクスプローラーとインターネットエクスプローラー(FullNameがIEXPLORE.EXE)にさわれる For n = objShell.Windows.Count To 1 Step -1 'MAXから-1ひいてく感じ '.FullNameで普通のファイルエクスプローラーとIE(インターネットエクスプローラー)を区別する If Right(UCase(objShell.Windows(n - 1).FullName), 12) = "IEXPLORE.EXE" Then Set objIE = objShell.Windows(n - 1) 'n番目のウインドウ(FullNameがIEXPLORE.EXE)を代入 Exit For '見つけたので、↑代入後、強制的にループを抜ける End If Next Set objShell = Nothing 'もし起動済みのIEが見つからなければ、新たに起動する If objIE Is Nothing Then '上で見つけられたか? Set objIE = CreateObject("InternetExplorer.Application") 'オブジェクトを作成します。 End If objIE.Visible = True '可視、Trueで見えるようにします。 '処理したいページを表示します。 objIE.Navigate "http://www.kosho.or.jp/public/book/detailsearch.do" '.Navigate メソッドで表示する。 '↑上記のページの表示が完了するまで待ちます。 While objIE.ReadyState <> 4 Or objIE.Busy = True '.ReadyState <> 4の間まわる。 DoEvents '重いので嫌いな人居るけど。 Wend 'ページが表示されたので、表示された文章に対して、処理を行います。 objIE.Document.all("p_shomei").Value = bookname 'A列の値を 書名にセットする。 '検索開始を押す 'リンクのアンカーオブジェクトをクリックする Dim objFDOC As Object 'ドキュメントを保存する Set objFDOC = objIE.Document '代入別に代入しなくてもいいけど。 'リンク情報からオブジェクトを探し.Clickする For n = 0 To objFDOC.Links.Length - 1 'リンク数分まわす Debug.Print objFDOC.Links(n).href 'デバックで表示する 'リンク先のAタグの中(.InnerHTML)をチェックする(検索開始を探す) If InStr(objFDOC.Links(n).innerHTML, "検索開始") > 0 Then objFDOC.Links(n).Click '.Clickでクリックしてみた Exit For '見つかったので強制的にループを抜ける End If Next n 'データセット後にIEを前面にする方法がわからなかったので、とりあえず、Excelを最小化してごまかす Application.WindowState = xlMinimized 'excelの最小化 End Sub
↓作成手順、↑試行錯誤の恥ずかしい動画。。。(手間がかかりすぎ(笑))
www.youtube.com
※Youtube動画のURLを貼る。
http://www.youtube.com/watch?v=HNO4hq-KYas
問題点・改善点
・Excel から IE へ データをセットまでは、それなりに動いたが、
ユーザーが作業後に IE から Excel へ 戻るのが手間、面倒かなぁ。
ここを何とかすれば、
1.Excelのデータから検索、(A列)
2.ネットから情報をコピー取得(手動)、※ここからExcelへ戻るのが一工夫必要かなぁ?
3.Excelへ貼り付け(F列)
の流れがよくなるのかなぁ?
今回作成したサンプルはOS:Windows XP IE8 Excel2003でテストしました。
Book1102.xls
です。(裸の.xlsなのでダウンロード時警告出るので、そのまま開かないで保存してから使ってください)
※動作を確認してみてください。