Fippiyのプログラム学習内容アウトプットBlog

日々の学習内容をアウトプットして振り返りを実施する。

VBAプログラム開発、スクレイピング・詳細データ取得拡張【1-1】Excel上に入力したISBNコード1件をWebの書籍情報登録をする

拡張項目として上がっていた、Excel上に入力したISBNコードをVBAで認識させ、Webフォームを経由して書籍を登録できるようにしていきます。

まずは、ISBNコード1件をWeb反映できるようにします。

今回の目的

VBA操作によってWeb新規登録フォームを利用してデータ登録を実施する

なぜやるか

VBAによる自動化で書籍登録をできるようにするため

フォーム操作できるようになることで、他の内容でも扱える様に手順習得するため

やりたいこと

  • Webフォームを操作してExcelからデータ送信できるようにする

やったこと

  • Web操作用のベースコードを用意する
  • HTMLから操作するフォームを特定する
  • Webフォーム操作ができることを確認する
  • ワークシート上のデータを送信する

実施内容

どうやってフォームを扱うか

なにはともあれ、まずはWeb上のフォームをExcelVBAからどうやって操作するかを調べます。 

こちらを参考にさせて頂きました、ありがとうございます。

tonari-it.com

データ入力する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から何を指定すべきかを確認します。

# フォーム 

f:id:Fippiy:20190622160639j:plain

ISBN登録フォーム

まずは登録操作ができることが目標なので、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としてデータを引き渡す。まずは直接文字列を用意して反映させてみました。

f:id:Fippiy:20190622163303j:plain

フォーム反映

フォームに値が入力されて表示できることを確認しました。

  

登録ボタンを動作させる

インプットタグ取得の要領で、登録ボタンの要素を取得しクリック動作を指定することで入力したデータを反映できるようにしていきます。

登録ボタンは、先程のHTML内にclass="send isbn"という指定があるので、このクラスを指定します。

# ISBN登録用プロシージャ

'フォーム入力
htmlDoc.getElementsByClassName("form-input__input")(0).Value = "1234567890123"

htmlDoc.getElementsByClassName("send isbn")(0).Click

オブジェクトをクラス名で指定し、.Clickとすることでクリック動作となります。

これで、動作することを確認。

f:id:Fippiy:20190623163156j:plain

登録ボタン押下をVBAで実施

登録ボタンを押したことによって、結果がメッセージとして表示されました。このコードはAPIには登録されていないので、見つからなかった旨のメッセージが返ってきています。

想定通りの結果が帰ってきているので、ISBNコード入力と登録ボタンの押下動作自体はできていることが確認できました。

 

登録可能なISBNコードを指定する

コードの動きは確認できたので、実際に登録できる書籍のコードに変更して登録できることを確認します。

# ISBN登録用プロシージャ

'フォーム入力
htmlDoc.getElementsByClassName("form-input__input")(0).Value = "9784295000914"

htmlDoc.getElementsByClassName("send isbn")(0).Click

まずは、VBA内のISBNコードを直接編集してためします。

f:id:Fippiy:20190623164254j:plain

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コードを取得してフォーム操作を実施し、書籍登録ができるように変更しました。

f:id:Fippiy:20190623165759j:plain

ISBNコード指定(Excel)

Excelワークシートに登録を行うISBNコードを記載して、この情報をよみとってWebへ反映できるように変更しました。
VBAを動作して登録できることを確認します。

 

f:id:Fippiy:20190623170032j:plain

書籍登録

ISBNコードを指定して登録ボタンを押す動作ができました、先程と同じ書籍を指定しており、登録済みの為に、存在しますというメッセージが出力されていますが、正しく動作していることは確認できました。

 

以上でExcelワークシート上で指定したISBNコードを読み取ってWeb上の書籍登録を行う動作をVBAで実現しました。