5
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Web上のFormの入出力をExcel VBAで自動化

Posted at

はじめに

仕事や学校の課題などで,以下のような操作を無限にするようなタスクはありませんか?

  1. Webページにアクセスする
  2. 検索フォームなどにキーワードを入れる
  3. その結果をExcelなどに記録する
  4. 上の操作を繰り返してデータを集める

私の場合,Webのフォームで算出される値をシステムテストの期待値として収集したいということがありました.

100ケース以上のケースがあるため,Webに入力→Excelに転記というのは気が滅入ってしまいます.

「こんなとき,RPAがあればなぁ…(・×・)」と思いましたが,考えてみればVBAで実現できたので,シンプルな実装例を用いてご紹介してみたいと思います.

環境

  • Windows 10
  • Excel 2010(諸事情で少し古いVersion)
  • Internet Explorer 11

今回,実装するケース

王様は民に対して管轄の税務署を知らせて案内状を作りたいようです.

王様「ここにある郵便番号の管轄税務署のリストを作れ!」
ぼく「はい!」

Webフォーム

というわけで,さっそく国税庁のWebサイトにアクセスしてみると,
右下の方に↓こんなフォームがあります.
image.png
ここに郵便番号を入れることで,管轄の税務署を調べられそうです.

Excelファイル

王様がくれた郵便番号リストは,以下のような形式になっています.
E列に対して,「○×税務署」と入力していきます.
image.png

プログラム

以下のようなプログラムを用意する

VBAコード

sample
Sub IE操作()
'定数の宣言
Const URL = "http://www.nta.go.jp"
Const FIRST_ROW_NUM = 2
'インターネットに接続してブラウザを開く
    Dim objIE As InternetExplorer
    Set objIE = New InternetExplorerMedium
    objIE.Visible = True

'インターネットの特定のページを開く
    objIE.navigate URL
    Call IEWait(objIE)

Dim condition As Boolean
condition = True
Dim i As Integer
i = FIRST_ROW_NUM

Do While condition
    '---郵便番号をExcelから取得して変数に代入
    Dim postalCode1, postalCode2
    postalCode1 = Mid(Cells(i, 1), 1, 3)
    postalCode2 = Mid(Cells(i, 1), 4, 7)

    '---IEに自動で文字入力
    objIE.document.getElementById("kszc1").Value = postalCode1
    objIE.document.getElementById("kszc2").Value = postalCode2

    '---ボタンを自動でクリックして次へ---
    objIE.document.getElementsByName("kszBtn")(0).Click
    
    Call IEWait(objIE)
    
    '---値を取得する
    Dim zeimusho
    If IsNull(objIE.document.getElementById("zmsnm1")) Then
    Cells(i, 5) = "該当なし"
    Else
    zeimusho = objIE.document.getElementById("zmsnm1").innerText
    Cells(i, 5) = zeimusho
    End If
    
    i = i + 1
    
    If i > Cells(1, 1).End(xlDown).Row Then
        condition = False
    Else
        condition = True
    End If

        objIE.navigate URL
        Call IEWait(objIE)

    Loop

    'IEを閉じる
    objIE.Quit
    Set objIE = Nothing
    
End Sub


'---IEを待機する関数---
Function IEWait(ByRef objIE As Object)
    Const READYSTATE_COMPLETE = 4
    Do While objIE.Busy = True Or objIE.readyState <> READYSTATE_COMPLETE
        DoEvents
    Loop
End Function

ポイント

  1. ExcelからVisual Basicのエディタを開き「ツール」→「参照設定」から以下の2つにチェックを入れます.
    • Microsoft HTML Object Library
    • Microsoft Internet Controls
  2. 郵便番号を3桁/4桁に分割してフォームに入力するため,
    postalCode1 = Mid(Cells(i, 1), 1, 3)
    Mid関数(文字列をX字目~Y字目まで切り出す)を使います.
  3. HTML要素の操作はJavaScriptにおけるDOM操作に近い.
    今回,対象のWebフォームのbutton要素にid属性がなかったため.name属性と添え字(0)を用いています.
  4. 結果ページで該当する税務署がない場合,結果となるHTML要素がないため,IsNullチェックを入れています.
    If IsNull(objIE.document.getElementById("zmsnm1")) Then
    ※省いてしまうとJavaにおける「NullPointerException」が発生する.

実行結果

image.png

終わりに

Web APIがない場合で,数百件程度のデータを取得をしたい場合など,活用できるケースは少なくない気がします.

5
14
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?