Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1025 / 13645 ツリー ←次へ | 前へ→

【76753】検索後のHTML解析 Satsuki 15/3/9(月) 18:37 質問[未読]
【76763】Re:検索後のHTML解析 bant 15/3/10(火) 11:29 発言[未読]
【76768】Re:検索後のHTML解析 Satsuki 15/3/10(火) 20:09 質問[未読]
【76773】Re:検索後のHTML解析 bant 15/3/11(水) 8:34 発言[未読]
【76786】Re:検索後のHTML解析 Satsuki 15/3/11(水) 23:03 質問[未読]
【76788】Re:検索後のHTML解析 bant 15/3/12(木) 11:08 発言[未読]
【76792】Re:検索後のHTML解析 Satsuki 15/3/12(木) 21:13 お礼[未読]

【76753】検索後のHTML解析
質問  Satsuki  - 15/3/9(月) 18:37 -

引用なし
パスワード
   こんにちは、Satsukiと申します。
 
プルダウンで検索後に、検索結果の総ページ数を、
検索結果ページのHTMLを解析して取得したいのですが、
上手く取得できる時と、できない時があります。
どなたかご教示のほどよろしくお願いいたします。
 
Option Explicit
 
Private objIE As InternetExplorer
 
Sub main()
  Call GetPage(2, "httpから始まるURL")
  
  If Not objIE Is Nothing Then objIE.Quit
  Set objIE = Nothing
End Sub
 
Sub GetPage(row, url)
  Call Navigate(url)
  url = SelectPulldownMenu(objIE) ←プルダウン選択後のURL取得

  Dim PageNum As String
  PageNum = getMaxPage(objIE) ←プルダウン選択後のURLでページ数取得


  (ここは未完成) 

End Sub
 
Sub Navigate(url)
  If objIE Is Nothing Then Set objIE = New InternetExplorer
  If objIE.Visible <> True Then objIE.Visible = True
  objIE.Navigate2 (url)
  While objIE.readyState <> READYSTATE_COMPLETE Or objIE.Busy = True
    DoEvents
    Sleep 100
  Wend
  Sleep 200
End Sub
 
Function SelectPulldownMenu(objIE) As String
  objIE.document.forms("color")("color_id").Value = "5"
  objIE.document.forms("color")("color_id").FireEvent ("OnChange")
  SelectPulldownMenu = objIE.LocationURL

  Call WaitFor(3)
End Sub

Function getMaxPage(objIE)
  Dim MaxPage As Integer
  MaxPage = 0
  Dim PageNum As String
  Dim objTag
 
  For Each objTag In objIE.document.getElementsByTagName("a")
    If objTag.className = "pagesu" Then
      PageNum = val(objTag.innerText)
      If PageNum > MaxPage Then
        MaxPage = PageNum
      End If
    End If
  Next
    getMaxPage = MaxPage
End Function

Function WaitFor(ByVal second As Integer)
  Dim futureTime As Date

  futureTime = DateAdd("s", second, Now)
  While Now < futureTime
    DoEvents
  Wend
End Function

【76763】Re:検索後のHTML解析
発言  bant  - 15/3/10(火) 11:29 -

引用なし
パスワード
   mougでの質問では
  PageNum = getMaxPage(objIE) 
この部分で検索前のobjIEのままということでしたが、
検索後のobjIEを取得できている場合もあるということですか。

【76768】Re:検索後のHTML解析
質問  Satsuki  - 15/3/10(火) 20:09 -

引用なし
パスワード
   ▼bant 様
ご回答ありがとうございます。

>mougでの質問では
>  PageNum = getMaxPage(objIE) 
>この部分で検索前のobjIEのままということでしたが、
>検索後のobjIEを取得できている場合もあるということですか。
mougの方も見て頂いていたのですね。ありがとうございます。

以前からお世話になっているこちらのサイトで質問しようとしたところ
禁則文字とのエラーが出て投稿できなかったので
(前回はhttpから始まるURLが入っていたために
エラーが出たと気づきませんでした。)、
新たに探してmougのサイトで質問したのですが、
そちらで教えて頂いたところ、
PageNum = getMaxPage(objDoc)
というふうにdocumentを渡しているので、上手く行かないのだと気づき、
再度調べて、今度はobjIEを渡せば上手く行くかと思い書き直しました。

【76773】Re:検索後のHTML解析
発言  bant  - 15/3/11(水) 8:34 -

引用なし
パスワード
   コードは変えずにうまくいったりだめだったりするのですね。
うまくいく場合とだめな場合とで法則のようなものはありますか。
うまくいく場合は検索してページ数が取得できて、
では、だめな場合はどうなるのですか。

【76786】Re:検索後のHTML解析
質問  Satsuki  - 15/3/11(水) 23:03 -

引用なし
パスワード
   ▼bant さん:
ご回答ありがとうございます。

>コードは変えずにうまくいったりだめだったりするのですね。
コードは少し変えています。
Sub SelectPulldownMenu(ByRef row, objDoc As HTMLDocument)
      ↓
Function SelectPulldownMenu(objIE) As String
プルダウン選択後のURLをFunctionでSub GetPage(row, url)のプロシージャに
読み込むようにしました。(引数はdocumentではなく、objIEに変更)

Function getMaxPage(objDoc As HTMLDocument)
      ↓
Function getMaxPage(objIE)
こちらも引数をdocumentから、objIEに変更しました。

うまくいく場合は検索後のページ数が取得できて、
だめな場合はURLが初期ページのままで、ページ数は0のままです。

【76788】Re:検索後のHTML解析
発言  bant  - 15/3/12(木) 11:08 -

引用なし
パスワード
   コード変更なしで検索出来たり出来なかったりしているので、
タイミングの問題だと思っています。
・表示完了後もう少し待ってみる。
・URLが初期ページの場合はもう一度検索する。
・検索の間隔が短くてはじかれているかもしれないので、もう少し間隔をあけてみる。
など試してみてはどうでしょうか。

【76792】Re:検索後のHTML解析
お礼  Satsuki  - 15/3/12(木) 21:13 -

引用なし
パスワード
   ▼bant さん:
ご回答ありがとうございます。

>コード変更なしで検索出来たり出来なかったりしているので、
>タイミングの問題だと思っています。
Function getMaxPage(objIE)の中で一旦止まるようにして、
objIEの中身をウォッチウィンドウで見てみました。
objIE.LocationURLはきちんとプルダウン検索後のURLになっておりましたので、
引数の渡し方は間違っていないようです。
ところが、SelectPulldownMenuの値がobjIE.LocationURLと時々違うので、

Function SelectPulldownMenu(objIE) As String
  objIE.document.forms("color")("color_id").Value = "5"
  objIE.document.forms("color")("color_id").FireEvent ("OnChange")
  Call WaitFor(3)
  SelectPulldownMenu = objIE.LocationURL
End Sub
上記のようにCall WaitFor(3)をプルダウン検索後に移動したところ、
objIE.LocationURLの値がSelectPulldownMenuに入るようになりました。
おっしゃるとおり、タイミングの問題でした。
ご教示ありがとうございました。

またわからないことがありましたら、よろしくお願いいたします。

1025 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free