VBAプログラム開発、スクレイピング・詳細データ取得拡張【1-2】Excel上で指定した書籍をWeb上データから削除する
前回はVBAを利用してワークシートのデータをWebに登録する工程を作成しました。
しかし、ISBNコード1件のみしか対応していないため複数件のデータに対応させます。
しかししかしその前に、複数件登録を作成する前にVBA操作によるデータ削除を先に実装することにしました。
何度も登録の度に新しいISBNを見つけて登録も大変なので、先に削除処理を作成しておき、繰り返し登録実験できるようにしていきます。
今回の目的
登録されている書籍情報をVBAによって削除できるようにする
なぜやるか
やりたいこと
- ワークシートで指定した書籍をVBAによって削除する
- 複数削除できるようにする
やったこと
- どうやって削除するか検討する
- 削除書籍ページへアクセスする
- 削除を実行する
- 複数削除に対応する
実施内容
どうやって削除するか
書籍管理Webからデータを削除するには
今回の書籍情報管理Webページには削除の方法は二通りありました。
- リストからチェックボックスにチェックをいれて削除
- 詳細ページの削除ボタンを押す
今回は詳細ページから削除する方法で作成します。
削除のながれをどうするか
まずはざっくりと削除の流れを検討しておきます。
- 削除IDを指定する
- 詳細ページURL+削除IDで詳細ページにアクセスする
- 削除ボタンをクリックして削除する
- 上記を繰り返す
この内容が実施できれば全ての書籍が削除できます。
所有情報としての登録があれば削除できませんが、こういった条件付きのデータは後から対応することとします。
書籍情報削除VBAを作成する
では、ここから書籍情報削除をできるようにしていきます。
ID指定による削除書籍選択
削除書籍を指定する為に、書籍IDを指定する方法で作成を行います。
前回登録した一番最後の書籍を削除します。IDは59です。
専用ワークシートでとりあえず1件のIDを指定します。
複数対応用に表としていますが、まずは1件のみで対応させます。
削除書籍ページへアクセスする
IDさえ分かれば削除する書籍の詳細ページへアクセスできるので、アクセスするためのVBAコードを準備します。
ISBNコード登録時と同様にWebページアクセスのベースとなるVBAコードを準備し、書籍詳細ページへアクセスできるようにします。
# ISBN削除用プロシージャ
Sub deleteBookdataISBN()
'オブジェクト設定
'IE
Dim objIE As InternetExplorer 'IEオブジェクトを準備
Set objIE = CreateObject("Internetexplorer.Application")
'新しいIEオブジェクトを作成してセット
objIE.Visible = False 'IEを表示
'HTML
Dim htmlDoc As HTMLDocument 'HTML全体
'作業ワークシート
Dim DelBookSheet As Worksheet 'DeleteBookWorksheet
Set DelBookSheet = ThisWorkbook.Worksheets("書籍情報削除")
'削除ID
Dim DelID As Long
DelID = DelBookSheet.Cells(2, 1).Value
'データ取得URL
Dim DelBookPageBase As String
Dim DelBookPage As String
DelBookPageBase = "https://protected-fortress-61913.herokuapp.com/book/"
DelBookPage = DelBookPageBase & DelID
'処理完了メッセージ
Dim ExitMsg As String
'URLを開いてオブジェクト取得
objIE.navigate DelBookPage 'IEでURLを開く
Call WaitResponse(objIE) '読み込み待ち
Set htmlDoc = objIE.document 'objIEで読み込まれているHTMLドキュメントをセット
'書籍を消す
'削除処理を後で追加
'VBA終了処理
objIE.Quit 'objIEを終了させる
ExitMsg = "test"
MsgBox ExitMsg
End Sub
Excelから削除用IDを受け取り、詳細ページへ直接アクセスできるようにしました。
DelBookPageBase = "https://protected-fortress-61913.herokuapp.com/book/"
DelBookPage = DelBookPageBase & DelID
詳細ページへは~/book/"ID"とすればアクセスできるので、ワークシートから取得したIDをベースとなるURLの後ろへ続けて記載すればアクセスできるようになります。
詳細ページへアクセスできました。
スクレイピングでExcelへ情報を保存していた時は、このページからデータ収集していました。
削除動作を追加する
今回は、ここで削除ボタンを押すことで削除できるような作りとします。
Web上からの削除時には、よく削除前に確認を促す動作がありますが、今回のこのサイトではそういった仕様は今の所実装されていませんので、いきなり削除されます。
というわけで、削除ボタンをクリックする動作を追加することで削除できるようにします。
削除ボタンを押下するために、HTMLからボタンの位置を確認します。
# 詳細ページHTML(抜粋)
<div class="books-list__title bookpage-color">
詳細
<div class="books-list__title--navigation">
<a href="/book/59/edit" class="nav-btn edit">編集</a>
<form action="/book/59" method="post">
<input type="hidden" name="_method" value="DELETE">
<input type="submit" class="nav-btn delete" value="削除">
</form>
</div>
</div>
削除ボタンクラスを指定して、削除処理を追加します。
先程のVBAに削除ボタンをクリックするためのコードを追加します。
# ISBN削除用プロシージャ
'書籍を消す
htmlDoc.getElementsByClassName("nav-btn delete")(0).Click
動作させて消えることを確認します。
削除後は書籍リストのトップページへリダイレクトします。
削除されました等の表示は作成していませんので、仕様どおりの動作となります。
削除された旨のメッセージが出れば良いのですが、ここはPHPでの作成の課題ですね…。
最終ページに移動し、最後に登録していた書籍が消えていることを目視確認しました。
まずは1件の書籍を削除する処理が完成しました。
複数件書籍に対応させる
いまのままでは1件のみしか対応できないので、複数データ削除へ拡張していきます。
繰り返し条件を追加する
基本的な処理はできているので、繰り返し処理さえできれば複数件対応は比較的簡単にできそうです。
今までに実施してきた繰り返し処理を利用して作成していきます。
削除ID取得を複数件対応させる
まずはワークシートに記載する、削除書籍IDを複数認識できるようにしておきます。
# ISBN削除用プロシージャ(追加分抜粋)
'削除IDコレクション
Dim DelID As Collection
Set DelID = New Collection
'削除ID取得
Do Until DelBookSheet.Cells(i, 1).Value = ""
DelID.Add DelBookSheet.Cells(i, 1).Value
i = i + 1
Loop
コレクションを利用して複数のIDを格納できるようにしておきます。
そして、削除IDを記載したワークシートから複数のIDを取得してコレクションに追加できるようにしました。
ワークシート上の削除IDが連続する場合は取得し続け、空欄になった所でループは終了します。書籍情報取得時のURLを書き出しして繰り返しをしていた時と同じですね。
複数件データがコレクションに格納できていることを確認します。
DelIDコレクションに1~4が格納できています。ワークシートで1~4を個別入力し、VBAによる繰り返しでデータ取得ができていることを確認しました。
複数ID削除を実行する
コレクションに複数IDを格納したので、後はこれを削除を実行する内容に対して繰り返し実行できれば、指定した全IDに対しての削除処理が実施されるようになります。
# ISBN削除用プロシージャ(削除処理抜粋)
'削除ID毎に処理
If DelID.Count = 0 Then
ExitMsg = "削除IDがありません"
Else
i = 1 '繰り返し初期化
Do
DelBookPage = DelBookPageBase & DelID(i)
'URLを開いてオブジェクト取得
objIE.navigate DelBookPage 'IEでURLを開く
Call WaitResponse(objIE) '読み込み待ち
Set htmlDoc = objIE.document 'objIEで読み込まれているHTMLドキュメントをセット
'書籍を消す
htmlDoc.getElementsByClassName("nav-btn delete")(0).Click
i = i + 1
Loop Until i > DelID.Count
ExitMsg = "書籍情報を削除しました"
End If
コレクションに格納されたIDを順番に指定しつつ、詳細ページへアクセスして削除ボタンをクリックする動作を繰り返す動作として作成しました。
ひとつひとつの動作は今までに作成してきた内容ですので、組み合わせるだけで作成することができました。
Excelワークシート上で削除IDの指定がない場合も考慮しています。
実際に動作させる
書籍情報を削除するためのVBAコードを作成できましたので、実際に動かして意図した動作となることを確認します。
まず、対象の確認をしておきます。
今回の削除コード作成時の書籍情報一覧の3ページ目はこのようになっていました、今回こちらに表示されている6タイトルをまとめて削除します。
まず、削除の前に書籍情報を確認です。
書籍情報取得VBAを実行した結果です。ここでIDが確認できます。今回の削除VBAはID指定する方式としていますので、ここからIDを読み取ります。
削除を実施するにあたり、削除IDを記載するワークシートへ今回の削除用IDを反映させました。
この状態で、削除用VBAを実行することで、先程の3ページ目に登録されていた書籍が全て削除されるはずです。
と、この状態で実際に動作させました。
書籍削除後に書籍情報一覧トップページに遷移しました。
3ページ目の書籍が全て消えたので、ページネーションの3ページ目が消えています。
データ上も確認して消えていることを確認しました。
以上ここまでで、書籍情報削除を実装することができました。細かな表示や削除結果を表示するといったこともしたい所ですが、ISBN登録の複数件対応をまずは行っていきます。