VBAプログラム開発、スクレイピング・詳細データ取得拡張【1-1】Excel上に入力したISBNコード1件をWebの書籍情報登録をする
拡張項目として上がっていた、Excel上に入力したISBNコードをVBAで認識させ、Webフォームを経由して書籍を登録できるようにしていきます。
まずは、ISBNコード1件をWeb反映できるようにします。
今回の目的
VBA操作によってWeb新規登録フォームを利用してデータ登録を実施する
なぜやるか
VBAによる自動化で書籍登録をできるようにするため
フォーム操作できるようになることで、他の内容でも扱える様に手順習得するため
やりたいこと
- Webフォームを操作してExcelからデータ送信できるようにする
やったこと
- Web操作用のベースコードを用意する
- HTMLから操作するフォームを特定する
- Webフォーム操作ができることを確認する
- ワークシート上のデータを送信する
実施内容
どうやってフォームを扱うか
なにはともあれ、まずはWeb上のフォームをExcelVBAからどうやって操作するかを調べます。
こちらを参考にさせて頂きました、ありがとうございます。
データ入力するHTML内inputタグを個別にしていして、そこに入力テキストを指定すればできるようです。
登録ボタンなども同様にHTMLオブジェクトを指定してClickとすれば動作させることができるようです。
これらを実際に作成してみます。
フォーム操作してISBNコードを登録する
ベースとなるコードを準備する
まずは、今までのスクレイピング用コードを元にIEオブジェクトを取得する部分を作成しました。
# ISBN登録用プロシージャ
Sub inputBookdataISBN()
'オブジェクト設定
'IE
Dim objIE As InternetExplorer 'IEオブジェクトを準備
Set objIE = CreateObject("Internetexplorer.Application")
'新しいIEオブジェクトを作成してセット
objIE.Visible = True 'IEを表示
'HTML
Dim htmlDoc As HTMLDocument 'HTML全体
'作業ワークシート
Dim ISSheet As Worksheet 'ISBNWorksheet
Set ISSheet = ThisWorkbook.Worksheets("ISBN")
'データ取得URL
Dim InputISBNPage As String
InputISBNPage = "https://protected-fortress-61913.herokuapp.com/book/isbn"
'処理完了メッセージ
Dim ExitMsg As String
'URLを開いてオブジェクト取得
objIE.navigate InputISBNPage 'IEでURLを開く
Call WaitResponse(objIE) '読み込み待ち
Set htmlDoc = objIE.document 'objIEで読み込まれているHTMLドキュメントをセット
'VBA終了処理
objIE.Quit 'objIEを終了させる
ExitMsg = "test"
MsgBox ExitMsg
End Sub
変数はISBNコード登録用に適合変更し、オブジェクトが取得できていることを確認しました。
この時点ではHTMLオブジェクト取得後、そのまま終了してしまうので、Excel上もWeb上も変化はなにもありません。
入力フォームを指定してテキストを引き渡す
ここからが本題です、まずはデータを入力するフォームを指定したいので、HTMLから何を指定すべきかを確認します。
# フォーム
まずは登録操作ができることが目標なので、ISBNコードを1件のみ登録するフォームで操作できることを確認します。
# 入力フォームHTML
<div class="book-new">
<form action="/book/isbn" method="post">
<div class="form-contents">
<div class="form-input form-one-size">
<div class="form-label">ISBNコード</div>
<div>
<input name="isbn" class="form-input__input" type="number" value="">
</div>
</div>
</div>
<div class="form-foot">
<input class="send isbn" type="submit" value="登録">
</div>
</form>
</div>
ここで、ISBNコード入力のinputタグにはclass="form-input__input"というクラス名があるので、このクラス名を指定する形でVBAを作成します。
クラスはelements指定となるので特定要素の指定となるように記載します。
# ISBN登録用プロシージャ
'フォーム入力
htmlDoc.getElementsByClassName("form-input__input")(0).Value = "1234567890123"
クラス名指定でオブジェクト取得し、.Valueとしてデータを引き渡す。まずは直接文字列を用意して反映させてみました。
フォームに値が入力されて表示できることを確認しました。
登録ボタンを動作させる
インプットタグ取得の要領で、登録ボタンの要素を取得しクリック動作を指定することで入力したデータを反映できるようにしていきます。
登録ボタンは、先程のHTML内にclass="send isbn"という指定があるので、このクラスを指定します。
# ISBN登録用プロシージャ
'フォーム入力
htmlDoc.getElementsByClassName("form-input__input")(0).Value = "1234567890123"
htmlDoc.getElementsByClassName("send isbn")(0).Click
オブジェクトをクラス名で指定し、.Clickとすることでクリック動作となります。
これで、動作することを確認。
登録ボタンを押したことによって、結果がメッセージとして表示されました。このコードはAPIには登録されていないので、見つからなかった旨のメッセージが返ってきています。
想定通りの結果が帰ってきているので、ISBNコード入力と登録ボタンの押下動作自体はできていることが確認できました。
登録可能なISBNコードを指定する
コードの動きは確認できたので、実際に登録できる書籍のコードに変更して登録できることを確認します。
# ISBN登録用プロシージャ
'フォーム入力
htmlDoc.getElementsByClassName("form-input__input")(0).Value = "9784295000914"
htmlDoc.getElementsByClassName("send isbn")(0).Click
まずは、VBA内のISBNコードを直接編集してためします。
書籍が登録できました。
ここまでで一番単純な1件のISBNコードをExcelVBAでWeb操作を行って書籍登録することができました。
任意のISBNコードを指定して登録できるようにする
登録操作はできるようになりましたが、直接ISBNコードをVBAプロシージャに記載していました。
書籍登録用のISBNコードをExcelワークシートに記入してアクションさせることでWeb上へ反映できるように変更していきます。
# ISBN登録用プロシージャ
Dim InputISBN As String
'ISBNコード取得
InputISBN = ISSheet.Cells(1, 1).Value
'フォーム入力
htmlDoc.getElementsByClassName("form-input__input")(0).Value = InputISBN
htmlDoc.getElementsByClassName("send isbn")(0).Click
セルからISBNコードを取得してフォーム操作を実施し、書籍登録ができるように変更しました。
Excelワークシートに登録を行うISBNコードを記載して、この情報をよみとってWebへ反映できるように変更しました。
VBAを動作して登録できることを確認します。
ISBNコードを指定して登録ボタンを押す動作ができました、先程と同じ書籍を指定しており、登録済みの為に、存在しますというメッセージが出力されていますが、正しく動作していることは確認できました。