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

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

VBAプログラム開発、スクレイピング・ログイン機能【2-3-1】ログイン処理をプロシージャ化する(組み込み検討とメインプロシージャ作成)

VBAによる書籍管理サイトログイン処理は完成しました。

後は、今までに作成してきたVBAコードに対して追加することで、各処理実施前にログイン状況が確認できるようになります。

※1記事にするには長くなったので分割しました。

今回の目的

ログイン処理をプロシージャ化して、Callするだけで動作できるようにする

なぜやるか

ログイン処理を今まで作成した複数の処理に対して組み込むのを簡単にするため

やりたいこと

  • ログイン処理だけを処理できるプロシージャを作成する
  • 画面遷移後に必ず行う処理もまとめておく
  • 動作確認用のメインプロシージャと組み合わせて試す

やったこと

  • 既存VBAコードへ組み込む方法を検討する
  • メインプロシージャとログインプロシージャへ分割する
  • メインプロシージャを作成する
  • ログインプロシージャを作成する[次回記事へ記載]

実施内容

既存VBAコードに組み込む方法を検討する 

ログイン処理は作成できたのですが、各々のVBAに組み込む事を想定しているので、先に組み込めるようにプロシージャ化させておき、Callによる呼び出しができるようにしていきます。

ログイン処理組み込み方法を考える

ログイン処理へ引数を設定して呼び出し先で処理をする…わけですが、引数として何を設定すべきかを考えます。

書籍情報登録のVBAで考えると、登録フォームとなるページのURLを指定してアクセスをしていました。

このフォームにアクセスした時にログイン状態であるかどうか確認をします。

この段階でアクセス先URLとログインページURLの2つが必要です。

ログイン処理自体は前回作成しました。

接続先へアクセスして、ログインページか確認することで判断できるので、メインプロシージャで実際にデータ処理するサイトのURLは必要です。初めに設定しておいてログインチェック時にもURLが扱える様に引数設定してやればURLを引き継いで使えます。

ログインページURLについては、ログインチェック時のみ使えればいいので、ログインチェック内だけで扱えるようにすれば引数としては必要ありません。

 

このあたりを考慮して書籍情報を処理するメインプロシージャと、ログイン処理を行うプロシージャで分割できれば、既存のVBAに簡単に追加実装できそうです。

いきなり既存VBAに組み込むことはせずに、前回作成したログインプロシージャを分割することでまずは作成することにしました。

 

 

メインプロシージャを作成する

まずは、動作テスト用メインプロシージャを再構成しました。

作成コード

# メインプロシージャ

Sub getURLtest()

 'オブジェクト設定

  'IEオブジェクト
  Dim objIE As InternetExplorer
  Set objIE = CreateObject("Internetexplorer.Application")
  objIE.Visible = False

  'HTMLオブジェクト
  Dim htmlDoc As HTMLDocument

  'URL設定
  Dim Domain As String 'Webドメイン
  Domain = "https://protected-fortress-61913.herokuapp.com/" 'ドメイン格納
  Dim ProcessDir As String '処理実施ディレクト
  ProcessDir = "book/isbn" 'ディレクトリ指定

  'VBA動作初回ログインチェック
  Dim CheckFirstLogin As Boolean 'ログインチェックフラグ
  CheckFirstLogin = True

 'ログイン状態チェック
 Call CheckLogin(objIE, htmlDoc, Domain, ProcessDir, CheckFirstLogin)

 

 'VBA各種処理の実施

  'navigate時にログイン状態を確認として挿入
  Call CheckLogin(objIE, htmlDoc, Domain, ProcessDir, CheckFirstLogin)

 'VBA各種処理完了

 objIE.Quit 'objIEを終了させる
 MsgBox "処理が完了しました。"

End Sub

テスト用のメインプロシージャです。

※ログイン処理は、Call CheckLogin()として呼び出せるようにしました。こちらの内容は次記事にて扱います。

オブジェクト宣言と初期値設定

初めにオブジェクト設定を実施しています。これはいままで作成したVBAと同様です。

変数名の全体的な見直しもしたので、名前が若干変更となっています。

 

アクセスURL設定を再構成する 

URL設定について既存設定から修正を行いました。

# メインプロシージャ(URL設定抜粋)

'URL設定
Dim Domain As String 'Webドメイン
Domain = "https://protected-fortress-61913.herokuapp.com/" 'ドメイン格納
Dim ProcessDir As String '処理実施ディレクト
ProcessDir = "book/isbn" 'ディレクトリ指定

このメインプロシージャは、既存VBAであるISBNから書籍登録を実施するを想定して作成しました。そのため、処理を行うディレクトリとして"book/isbn"を指定しています。

 

書籍登録サイトのURLを指定するにあたって、いままでは直接URLを指定していましたが、ドメインディレクトという指定に変更しました。実際にはログイン処理の中で結合してURLとして扱います。

これは、同一ドメインでの作業となるため、わざわざ個別に長い(とは限りませんが)ドメイン名を記述するという動作を繰り返しをしないためにも分けておくことで、ドメイン配下のディレクトリだけ変更すればいいようにしたためです。

また、万が一ドメインが変更になった際には、ドメイン名だけ変更で対応できるという利点もあります。

以上の考えにより、URL設定としてはドメイン名とアクセスするディレクトリを指定する形にしました。

 

VBA処理の始めにログインチェックを行う

URL設定が終われば、ログイン状況確認のプロシージャを呼び出し、ログイン後に今までの処理を実施する流れとなります。

# メインプロシージャ(ログイン処理呼び出し)

'VBA動作初回ログインチェック
Dim CheckFirstLogin As Boolean 'ログインチェックフラグ
CheckFirstLogin = True

'ログイン状態チェック
Call CheckLogin(objIE, htmlDoc, Domain, ProcessDir, CheckFirstLogin)

 

 'VBA各種処理の実施

  'navigate時にログイン状態を確認として挿入
  Call CheckLogin(objIE, htmlDoc, Domain, ProcessDir, CheckFirstLogin)

 'VBA各種処理完了

今回作成したVBAコードでは、ログイン処理のCallが2箇所存在しています。

1つ目は変数設定直後、2つ目は各種処理中に登場します。

はじめは2つ目の場所のみでいいと考えていました。書籍情報登録の処理であれば、ISBNコードを登録する画面を表示させた時にログイン状態であるかチェックできればそれで問題ありません。

では、なぜ変数設定直後にもCallしているのか?動作手順を確認しながら詳しく見ます。

 

ログインチェック実施ポイントを確認する

まず、今までに作成してきた書籍登録VBAの動作を改めて確認します。前提として事前に手動でログインをしています。

  1. VBA処理開始
  2. ISBNコードをワークシートから読み取り
  3. カンマ区切りテキスト作成
  4. Webで登録処理
  5. 登録結果を表示
  6. 上限超過分を4から繰り返し

ログインされた状態なので、ISBNコードを読み取ってWeb操作という流れでした。

 

ここに今回はログイン処理が加わります。

ログイン状態確認をWebアクセスのタイミングで行うと…

  1. VBA処理開始
  2. ISBNコードをワークシートから読み取り
  3. カンマ区切りテキスト作成
  4. ログイン状態確認
  5. Webで登録処理
  6. 登録結果を表示
  7. 上限超過分を4から繰り返し

3まではワークシート内のみの処理となり、4の段階でWebアクセスとなるので、この段階でログインチェックとなります。

そして、ログインできなかった場合は、その後の処理は実施できません。

せっかくワークシート内の情報処理が終わっているにもかかわらずWeb側の都合で処理が継続できずにエラー表示となることが想定されます。

しかも、2の作業が仮に10,000件であった場合、ロスとなる時間が大きくなります。

 

そこで、はじめにログインされている状態か一度確認しておくことで、ロスを減らせると考えました。 

  1. VBA処理開始
  2. ログイン状態確認
  3. ISBNコードをワークシートから読み取り
  4. カンマ区切りテキスト作成
  5. ログイン状態確認
  6. Webで登録処理
  7. 登録結果を表示
  8. 上限超過分を5から繰り返し

VBA処理が始まったら、まず初めにログイン状態を確認できるように変更しました。

これですべての処理の前にログイン状況が最初に確認されることになります。

ログインを確認できたら、そこから従来の処理を実施していく流れとなります。

 

VBA処理中にWebサイトへ何度もアクセスする可能性があるので、アクセスページが変更される度にログイン状態であるか確認します。これが、各VBA処理中にもログイン確認を呼び出しているコードとなり、2回Callされている理由です。

連続処理となるので、途中でタイムアウトによるログアウト状態になるのは考えにくいですが、基本的に画面遷移時には移動先のサイトがログイン状態であること=指定ページにアクセスできていることをチェックできるようにするため、このようなVBAコードにしました。

 

初回ログインチェック 

# メインプロシージャ(ログイン処理呼び出し)

'VBA動作初回ログインチェック
Dim CheckFirstLogin As Boolean 'ログインチェックフラグ
CheckFirstLogin = True

'ログイン状態チェック
Call CheckLogin(objIE, htmlDoc, Domain, ProcessDir, CheckFirstLogin)

 

 'VBA各種処理の実施

  'navigate時にログイン状態を確認として挿入
  Call CheckLogin(objIE, htmlDoc, Domain, ProcessDir, CheckFirstLogin)

 'VBA各種処理完了

先程ふれていなかったのですが、Call処理の前にCkeckFirstLoginという設定がありました。

こちらは、Callが2回行われていることに関係するのですが、初回のログインチェック呼び出しであることを判定するために用意しました

詳細はCall先で解説します。

 

以上でメインとなるプロシージャについては作成できました。

後はログイン処理プロシージャを作成して、Callによる呼び出しができるようにします。

 

次記事へとつづく…。