2014年12月4日木曜日

IE+VBAで仕事を効率化 Webページのラジオボタンを操作(チェック)する

 社内システムのWebページからデータを取ってくる際のノウハウです。
 Webページに「番号のリスト」があり、その番号に対する内容を「表示する」といったケース(例えば、伝票番号に対する現在のステータスなどの詳細情報を表示する)で、登場するのが「ラジオボタン」ですね。番号の隣に「二重丸◎の形状で選択すると真ん中が黒くなる」ボタンです。それを選択(クリック)して、そのページのどこかにある「表示」ボタンをクリックして、詳細情報を表示するような感じになります。
 このラジオボタンをVBAで操作する方法を説明します。
ラジオボタンは、INPUTタグで作られますので、まず、このINPUTタグに付けられたnameが何かを探します。 見つけたら、そのオブジェクトに対して、ObjXX.Checked = Trueとすれば、二重丸の黒丸が入り、「選択」(チェック)された状態になります。
  この例では、テーブルのエントリは6個のTDタグで構成され、 最初のエントリにラジオボタンのINPUTタグもあり、 "radio-button-name" という名前を持つとします。テーブルは、複数のエントリで構成されます。(例えば、伝票番号の数だけのエントリがあります。)
mは、テーブルのエントリ(6個のTDタグを持つ)をカウントするために使用します。
mmは、TDタグの最大個数をカウントするために使用します。
nは、TDタグをくるくると回すために使用します。
 GetElementsByTagNameでタグを取ると、すべてのTDタグが取れるので、くるくる回しながら、必要なタグをたぐる必要があるのです。
nnは、ラジオボタンを持つTDタグをカウント(探す)するのに使用します。
 まず、GetElementsByTagNameで現在のページのTDタグの最大数をmmにセットします。
mm = 0
For Each objTD In objIE.document.Frames("bodys").document.GetElementsByTagName("TD")
    mm = mm + 1
Next
 次に、再び、GetElementsByTagNameでTDタグをたぐりながら、テーブルのエントリごとに伝票番号のラジオボタンを選択し、その伝票番号の内容を表示するために「表示」ボタンをクリックし、表示のページに飛んで、情報を抜いて参ります。
m = 1
Do 
  n = 0
' *** turn a radio button on ***
  For Each objTD In objIE.document.Frames("bodys").document.GetElementsByTagName("TD")
     n = n + 1
     nn = 0
    For Each objITEM in objTD.document.getbyTagName'("INPUT")
      If objITEM.Name = "radio-button-name" Then
        nn = nn + 1
        If nn = m then
          objITEM.Checked = True       ' radio button on
          Exit For
        End If
      End If   
      Next
      If n < ( m * 6 ) Then GoTo Continue ’  skip 
      If ( m * 6 ) > mm then GoTo FINISH                      ' the last TD?
      If n Mod 6 = 0 Then Exit For             '  6 * n 
Continue:
    Next
    m = m + 1   
  Next
ここにラジオボタンに黒丸をした後にやりたいこと。例えば、表示ボタンを押し、 表示されたページを捕まえて、テープルから情報を抜いてくる処理を記述します。 例えば、6番目のタグに伝票番号が入っていたとして、それを取り込んで、 EXCELシートの名前にします。 ActiveWorkBook.Sheets.Add.Name = objTD.innertext ここの処理で、伝票番号をキーに伝票番号の詳細情報のページを表示したとき、元の画面が残らずに、詳細ページへジャンプするようなシステムであれば、伝票番号の詳細情報を抜いた後に、最初の伝票番号のリストのページへ復帰する必要があります。 最初の伝票番号のリストのページ名が”伝票システムの番号リスト”であれば、 そのページへ戻るコードは、以下。
For Each objWindow In objShell.Windows
  If TypeName(objWindow.document) = "HTMLDocument" Then
    Set objIE = objWindow
    If objIE.document.title = "伝票システムの番号リスト” then Exit For
  End If
Next

なお、objShellは、IEの初期化で
URL01 = "http://www.伝票システムのURL"
URL02 = "http://www.伝票システムのURL/login.jsp"
Set objIE = CreateObject("InternetExplorer.Application)
objIE.Visible = True
objIE.Navigate URL01
Application.Wait (Now + TimeValue(0:00:03"))
Set objIE = Nothing
Set objShell = CreateObject("Shell.Application")
Set objIE = ObjShell.windows.Item(objShell.windows.Count -1 )
objIE,Navigate URL02
Application.Wait (Now + TimeValue(0:00:03"))
Do While objIE,Readystate <> 1
Do While objIE,busy = True
Loop
Loop
という感じで設定されております。  実は、今回のノウハウのキーとなるIEでのラジオボタン操作は、ネットで探して、コピペして、作りました。TDタグを全部取って、クルクルしなくてもできると思うのですが、できればいいんですよね。特に、TDタグの最大数を取ってくるところは、もっとスマートな方法があるとは思いますが、できればいいンですねー。 クルクルしながら、ラジオボランを順に回すところは、ブレークポイントを駆使して、ちゃんと動いているか確認。とても泥臭いプログラミング、デバッグ手法でした。  ここでちょっと一息のコーナーです。  いのうえ ひさしの言葉から(これを目指してます。出来ていないけど)。   難しいことをやさしく   やさしいことを深く   深いことを愉快に   愉快なことをまじめに書くこと。