三流君 ken3のmemo置き場

三流プログラマーのメモ書きです。主にVBAやWindowsの話題が多いです

挨拶・自己紹介:
失敗続きのAB型の変わり者 :三流プログラマー Ken3です
フリーのエンジニア・個人事業主です・・と書くと聞こえはイイが(それとなくカッコよく聞こえるが)、 現在は小さな案件の受注請負 と 短期派遣 で 日々つつましく?ほそぼそと暮らしてます。

よく検索されるキーワード: [質問回答XXXXさんへ] [CreateObject] [VBA] [JRA競馬オッズ]

回答下書き 試作 Excel A列の値(本タイトル)をWebブラウザーにセットする

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なのでダウンロード時警告出るので、そのまま開かないで保存してから使ってください)
※動作を確認してみてください。

Ken3 ホームページ 目次

分類:HPを大きく分けると4つの柱(分類)です。

  1. [VBA・マクロ プログラミング]の解説
    当店の人気はVBA系のCreateObject("XXXXXX.application")で他のアプリケーションを操作するサンプルが人気です
  2. [プログラマーの愚痴]では、あまり見せたくない三流プログラマーの内面かな。
    三流君を踏み台にする
  3. [古いクラシック ASP(Active Server Pages)]の解説。
  4. [元コンビニ店長時代の話]が弟に巻き込まれ、失敗した脱サラ、畑違い?の仕事で失敗。
主に上記4つの分類でHP作成やメルマガの発行を行ってます。
※更新頻度が落ちていて情報の鮮度が悪いです。



本当に三流なんです(笑):たまにスゴイですねなんて言われることもありますが、
真実は→ [三流君の真実は...] ←を初めに見てくださるとわかると思います。
(からくりは、成功例↑しか載せてなくて ヒドイ失敗例はお蔵入り迷宮入りが多かったりします)