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

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

VBAプログラム開発、スクレイピング・詳細データ取得拡張【1-6】書籍情報削除結果を取得して表示する

登録処理は一端作成完了として、削除処理の機能を充実させます。

複数登録時に結果をワークシートへ表示させていたので、削除にたいしても削除結果を表示できるようにします

今回の目的

書籍削除時に削除結果を表示する 

なぜやるか

削除ID指定して削除指示するのみとなっており、削除結果が一覧で表示されず、削除されているかどうかも判断できないため

やりたいこと

  • 削除ID毎に結果をワークシートへ表示させる 

やったこと

  • 削除実施時のWeb側アクションを確認する
  • 削除成功と失敗の判定をどうやって行うか検討する
  • Web上で削除後に削除結果処理を追加する 

実施内容

削除時のWeb画面遷移を確認する

まずは処理を行う上でも必要な、動作の確認を行います。

Web上での削除方法としては2通りありました。

そのうち、書籍詳細ページから削除ボタンをクリック…を自動化によって指定したID全てに対して処理するVBAを作成していました。

削除フローとしては、詳細ページにアクセス→削除ボタンを押下→結果となります。

f:id:Fippiy:20190624130824j:plain

詳細ページ

 

正常削除完了時

削除ボタン押下後は、特にメッセージ等はなにも表示されずに書籍一覧ページが表示されます。

 

f:id:Fippiy:20190628141401j:plain

削除完了時

Web書籍管理サイトは現在はこの仕様ですので、一覧画面に遷移していれば、削除完了とみなします。

 

削除失敗時

削除ボタン押下後は、「所有者がいるので削除できません」というメッセージが詳細画面で表示されます。

f:id:Fippiy:20190628141208j:plain

削除失敗

書籍情報に対して所有者情報が紐付いている場合は、削除できない仕様になっているため、このような表示にしていました。

 

削除結果の判定方法を検討する

書籍追加時はどうしたか

今回は削除後の結果をワークシートへ表示させるのが目的です。

書籍追加時は、追加結果がWebに一覧表示されるので内容を取得していました。

しかし、今回は必ずしも結果内容がWebに表示される訳ではありません。

 

判定基準を考える

では、どう判定するか?

まずは正常に削除できた場合を考えます。

削除完了後は書籍一覧ページに遷移します。

ここで判定材料となりそうなのは…

  • 書籍一覧ページ内のdivクラスやワードを取得
  • 書籍一覧ページのURLを取得

削除できなかった場合はどうするか?

  • 所有者がいるので削除できませんと表示されていることを確認
  • URLが変更されていないことを確認

今回の仕様ではどちらでも実施できそうですが、どのページに遷移するかが分かっているのでURLで判定を行うことにしました。

  • 書籍一覧に移動したら「削除しました」
  • URLが変更されなかったら「削除できませんでした」

ワークシートへこの内容を出力できれば、結果が後で見てすぐにわかります。

 

書籍削除処理を編集する 

ここからVBAコードを編集していきます。

削除書籍フォームを修正する

まずは、削除する書籍ID入力欄に結果表示欄を追加します。

f:id:Fippiy:20190628141052j:plain

削除ID記載シート

削除処理完了後に結果を表示できるようにします。

 

書籍削除プロシージャを編集する

まずは、作成済みの削除コードを確認します。

# ISBN削除用プロシージャ(抜粋)

Sub deleteBookdataISBN()
 '削除ID取得
 Do Until DelBookSheet.Cells(i, 1).Value = ""
  DelID.Add DelBookSheet.Cells(i, 1).Value
  i = i + 1
 Loop

 '削除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

 'VBA終了処理
 objIE.Quit 'objIEを終了させる
 MsgBox ExitMsg

End Sub

削除IDをワークシートから読み取り、順番に詳細ページへアクセスして削除ボタンをクリックすることで削除する…を繰り返していました。削除自体はできる状態となっています。

削除ボタン押下後に結果をワークシートへ反映させる処理を入れてやれば今回の目的が達成できそうです。

 

削除後のURLを確認する

検討した手順を踏まえ、まずは削除後のURLで判定できるようにしていきます。

# ISBN削除用プロシージャ(削除処理抜粋)

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

 '削除後の処理
 Call WaitResponse(objIE) '読み込み待ち
 Debug.Print objIE.document.URL

 i = i + 1 '次データ処理開始準備
Loop Until i > DelID.Count

書籍削除後にIEの読み込み待ちを入れておき、その後に表示されるURLを取得しました。デバッグ表示として、取得できることをまずは確認します。

所有者のいる状態の書籍を指定してVBAを動かします。

f:id:Fippiy:20190628142920j:plain

デバッグ

所有者がいる場合は、詳細ページのままで「削除できません」メッセージが表示されます。

つまり、URLは詳細ページのままです。これは想定通りの結果となっています。

 

次に削除可能な書籍を指定して削除処理を実施します。

f:id:Fippiy:20190628143249j:plain

デバッグ

削除完了後に書籍一覧ページに遷移し、一覧ページのURLが取得できました。

今回のWebサイトではこれで判断ができるので、この処理を追加して削除可否判断させることにします。

 

URL判断によって結果を通知する

判断ポイントとURL取得方法が確認できたので、処理を追加しました。

# ISBN削除用プロシージャ(削除処理抜粋)

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

 '削除後の処理
  DelBookURL = objIE.document.URL & "/" '読み込み後のURL取得
 If DelBookURL = DelBookPageBase Then
  DelBookSheet.Cells(i + 1, 2).Value = "削除しました"
 Else
  DelBookSheet.Cells(i + 1, 2).Value = "削除できませんでした"
 End If

 i = i + 1 '次データ処理開始準備
Loop Until i > DelID.Count

削除後のURLが一覧表示ページであるかどうかを判定し、それによって結果をワークシートへ反映させるようにしました。

一覧表示ページのURLは、詳細ページアクセスのベースとなるURLとして変数に格納されていますので、そちらと照合する形をとりました。

f:id:Fippiy:20190628145431j:plain

削除結果

これで削除処理に加えて、削除結果が出力されるようになりました。

 

削除結果追加はこれで完了です。

しかし、削除処理の編集時にエラー対処ができていないポイントがありました。

それは、削除済みの書籍に対して再度削除をした場合が考慮されていませんでした。 

こちらは、次の記事で対処したいと考えています。