Excel VBAを使用してJ-PlatPatから公報テキストをダウンロードする方法(4)

6.検索結果一覧の表示完了を確認

ここまでの操作で、J-PlatPatのトップページのテキストボックス(検索窓)に公報番号を入力し、検索ボタンをクリックすることができた。これにより、下図のような検索結果一覧表が表示される。これは別のURLを持つ新たなページに遷移したわけでもないし、新たなウインドウやタブが開いたわけでもなく、今まで表示されていたJ-PlatPatトップページの中央部の検索窓と検索ボタンだけを残し、上部と下部が消去され、検索ボタンの下側に、新たに検索結果一覧表が表示されたものである。このような動的な表示の変化はJavaScriptで行われている。

次に、上図の検索結果一覧表にて、赤丸で囲んだ③のリンクをクリックしたいのだが、その前に、この動的な表示の書き換えが完了したことを確認する必要がある。実際、検索ボタンをクリックした後、objIE.readyState と objIE.Busy を Do While~Loop でチェックするお約束の表示完了待ち処理を行った後に、次の操作(所望の公報のリンクを探して、これをクリック)を行おうとすると、このリンクが見つからない、という不具合がしばしば起こる。やはり、JavaScriptによる動的な表示が完了したことを確認してから次の操作に進む必要があるようだ。

この場面では、一覧表の中の “特願” という語句に着目した。今回は特許だけを対象にしているので、必ず所望の公報の出願番号が “特願**” と表示されるはずである(該当する公報が見つからない、等のエラーが起こる場合を除く)。しかもこれは、検索結果一覧表の中に表示されるので、”特願” という語句が検出できるということは、検索結果一覧表の表示が完了したことを意味していると考えてもよさそうだ。

Dim i As Integer

i = 1
Do While InStr(objIE.document.body.innerHTML, “特願”) = 0 And i < 300
      DoEvents
      i = i + 1
      Application.Wait [Now()] + 100 / 86400000
Loop

この Do While~Loopは、このページに”特願”という語句が検出されるか、またはこのループの繰り返し回数が300回になるまで、繰り返される。ループ1回について100ミリ秒の休止を入れているので、300回で約30秒間となる(もっと長時間待ちたいときには、ここの回数を増やせばよい、30秒間はあくまでも一例)。つまり、”特願”が表示されるまで最大30秒間待機することになる。実際のプログラムでは、ここで表示される可能性のあるエラーメッセージが何種類かあるので、それぞれに対応した処理を行う必要があるし、ここで繰り返し回数が300回となった場合の処理も別途必要となるであろう(繰り返し回数が300回になったということは、公報が1つも見つからなかった場合と、このページの書き換え処理が30秒以内に完了しなかった場合などが考えられる)。ここでは、簡略化のため、”特願” が表示されたことを確認し、検索結果一覧の表示が完了(=次の操作の準備が完了)したものと考える。

7.検索結果一覧にて公報のリンクをクリック

次に、所望の公報番号のリンクをクリックする。これには、このオブジェクトobjIEの全てのAタグの中から、所望の公報番号をテキスト(outerHTML)として持っているAタグを見つけ、このAタグをクリックすればよい。この操作は、参考サイトに掲載されている通りで構わないので、次のようになる(このとき、変数patnumには、所望の公報番号が、この一覧表に表示されるのと全く同じ形式で代入されている)。実際には、一覧表の中に所望の公報が見つからない場合の処理も必要となるが、ここでは省略する。

Dim objtag As Object

For Each objtag In objIE.document.getElementsByTagName(“a”)
      If InStr(objtag.outerHTML, patnum) > 0 Then
            objtag.Click
            Exit For
      End If
Next

Set objtag = Nothing

テストした範囲ではほぼ問題なく動くようだが、たまに、目的のAタグを見つけられずに、この For~Next を素通りするケースもあるようなので、目的のAタグが見つかるまで、何度か繰り返すような処理を加えてみた。以下の例では、Aタグが見つかるまで最大30秒間、Do While~Loop を繰り返す。

Dim flag As Integer

flag = 0
i = 1
Do While flag = 0 AND i < 300
      For Each objtag In objIE.document.getElementsByTagName(“a”)
            If InStr(objtag.outerHTML, patnum) > 0 Then
                  objtag.Click
                  Exit For
            End If
      Next
      Application.Wait [Now()] + 100 / 86400000
      i = i + 1
Loop

Set objtag = Nothing

8.文献表示画面をオブジェクトとして取り込む

ここまでの操作によって、検索結果一覧表内の所望の公報のリンクをクリックすることで、新たなタブまたはウインドウで、下図のような特許・実用新案文献表示画面が表示される。(ただし、2.事前設定、(2) IEの設定、①のポップアップブロックの設定が正しく行われていないと、ここでIEのポップアップブロック機能が働いて、マクロがうまく動かなくなるので、必ず、事前に設定しておくことが必須である。)

この状態ではまだ、VBAから、この新たに表示されたページの操作はできない。操作するためには、このページをオブジェクトとして取り込む必要がある。この方法も、ネットを見ると色々と書かれているが、ここでは次のようなコードによって、変数 objIE2 に取り込む。

Dim objIE2 As InternetExplorer
Dim shl As Object
Dim win As Object
Dim targetTitle As String

flag = 0
i = 1
targetTitle = “特許・実用新案文献表示”

Do While flag = 0 And i < 300
      For Each win In shl.Windows
            DoEvents
            If win.Name = “Internet Explorer” Then
                  If InStr(win.document.title, targetTitle) > 0 Then
                        Set objIE2 = win
                        flag = 1
                        Exit For
                  End If
            End If
      Next
      Application.Wait [Now()] + 100 / 86400000
      i = i + 1
Loop

このうち、For~Next では、この時点で立ち上がっている全てのウインドウを調べ、それがInternet Explorer のウインドウであれば、そのタイトルを調べ、タイトルに “特許・実用新案文献表示” を含むものを探し出し、見つかったウインドウを変数objIE2に代入する、という処理を行っている。ここで、For~Next 全体が Do While~Loop に入っているのは、実際に操作してみると、目的のウインドウを見つけられずに、For~Next を素通りするケースがしばしばあることがわかったため、100ミリ秒の待ち時間を入れて、何度か繰り返すことで確実に取り込もうという趣旨である。ここで flag=0 のまま、Do While~Loop を抜けてくる場合には、何らかのエラー処理が必要となる。

ここまでで、文献表示画面を取り込むことができたので、次回は、文献表示画面を操作して、公報内容を取り込む方法について説明したい。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です