ken3memo (三流君)

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




[記事一覧、バックナンバーを見る]

2009-11-02

回答下書き 試作 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

↑を元に作成しました。

シートに下記のコードを貼り付けます。

貼り付け手順:シートのイベントにコードを書きたいので、

シートの名前の上にカーソルを

合わせてから右クリック、

コードの表示を選択する

f:id:ken3memo:20091031063342j:image

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

↓作成手順、↑試行錯誤の恥ずかしい動画。。。(手間がかかりすぎ(笑))

D

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

↓作成手順、↑試行錯誤の恥ずかしい動画。。。(手間がかかりすぎ(笑))

D

※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

↓作成手順、↑試行錯誤の恥ずかしい動画。。。(手間がかかりすぎ(笑))

D

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

※動作を確認してみてください。

seconduser2008seconduser2008 2009/11/02 08:23 すごすぎます!ちょっとテストしてみます。

ken3memoken3memo 2009/11/02 16:45 はい、結果を楽しみに待ってます。
あっ、ここ、みなさんが見ているわけじゃないので、質問のコメント欄に書いた方が、他の人達からも別のアドバイスが付くと思います。
勝手な蛇足が多いので、もっとシンプルに複雑にしない方が将来的にはいいのかも、、と、弱気発言を残しつつ、失礼します。

tekitotekito 2010/01/06 01:20 ありがとうございます。

ken3memoken3memo 2010/01/06 05:05 ?
どういたしまして の 返しでイイのかなぁ?
実際の動作を見ると、応用も可能だと思うので、どんどんチャレンジしてみてください。
そして、サンプルを自分のBlogにあっぷしたりして、後ろから来る人達に参考になる・・・そんなパターンが続けばいいんだけど・・・

norinori 2011/10/01 05:22 IEをいくつも起動せずに済む方法を探して辿りつきました。
コメントもわかりやすく、おかげさまで目的のマクロを作成できました。
Webページを残しておいてくださったことにも感謝します(^o^)

ken3memoken3memo 2011/10/01 10:07 >Webページを残して
あっ、これですか、下書き・試作 で そのまま残しているパターンです。
※試作や下書き後に まとめの清書をしていないので、他の記事も 下書きで残っていたりします(ぉぃぉぃ)
.
記事をまとめないとなぁ・・と思いつつ、下書きばかりが増えていく今日この頃...
.

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証





[記事一覧、バックナンバーを見る]








ブログトップ 記事一覧 ログイン 無料ブログ開設