【第10回】ロータス師匠のWinActorシナリオ道場~データ転記編 ExcelからWebシステムへ④~
2021.08.03
さて今回は、データ転記編~ExcelからWebシステムへ④です。今回でこのシリーズは完結となります。

とうとうシナリオが出来上がるんですね!感慨深いです。

気が付いたら一ヶ月も経っていたのじゃな。
年を取ると時間が過ぎるのが早く感じるのう・・・ロータスくんもこんなに立派になって。
前回の内容を復習したい方は以下のリンクからご確認ください。

1.シナリオ概要
「ロータス電機」は全国展開している家電量販店です。
本社勤務のロータス君の元には、毎日全国の店舗から、その日の取引内容を記録した『POS取引履歴』が送られます。
ロータス君は、日々『POS取引履歴』を社内システムに手動で入力していましたが、この度業務の自動化を図ることとなりました。
この業務の自動化にあたり、ロータス君は以下の作業の流れで実装することにしました。
①社内システムを起動
②『未処理フォルダ』内のエクセルファイル数を確認
ファイル数が1以上であれば、ファイルの数だけ後述(③~⑥)の処理を繰り返し実行
※『未処理フォルダ』には、各店舗から受け取ったエクセルファイル『POS取引履歴』が事前に格納されていることとします
③エクセルファイル名から、転記に必要な情報を抽出・転記
④エクセルファイルを開いて、転記に必要な情報を抽出・転記
⑤処理完了したエクセルファイルを『処理済みフォルダ』に移動
⑥処理失敗したエクセルファイルを『確認依頼フォルダ』に移動
⑦ ③~⑥の繰り返し処理が完了したら、社内システムを閉じてシナリオを停止

今回は⑦の処理を作っていくぞ!
2.シナリオ作成
⑦ ③~⑥の繰り返し処理が完了したら、社内システムを閉じてシナリオを停止
第3回まででシナリオの基本的な流れはほぼ完成しました。
最終回では、複数のエクセルファイルを連続して社内システムにデータ転記できるよう、シナリオを改造していきます。

キーワード「複数」が出たな。
ロータスくん、こういう時はどうするのだったかな?

同じ処理を複数回行うから…「繰り返し」ですね!
さすがロータスくん、使用するノードに当たりが付けられるようになってきましたね。
ではシナリオのどこに繰り返しを組み込んだらいいか、考えてみましょう。
※処理の流れを見やすくするため、細かいグループは折りたたんでいます。
社内システムは、最初に1回起動しておけば、全ての処理が完了するまで立ち上げたままで良さそうですね。
ファイル一覧(ファイル数)の取得はどうでしょう。
確か、データ転記が終わった後に、未処理フォルダからファイルを移動しましたよね。
つまり、エクセルファイルを1つ処理するごとに、未処理フォルダのファイル数は変化していきます。
処理を繰り返すごとに、毎回ファイル数をチェックする必要がありそうですね。

分かりました。
繰り返しが必要な部分はここですね!

そうじゃな。では早速繰り返しグループを入れてみよう。

あとは繰り返しの回数ですね。
未処理フォルダのファイルが無くなるまで繰り返したいなぁ。

ふむ。ではこの場ではこんなやり方はどうかな?
以下のライブラリを使用します。
①【ノード】>フロー
・繰り返し
②【ノード】>フロー
・繰り返し終了
①繰り返し
繰り返しグループのプロパティ画面から、「条件式」を選択します。
『条件式設定』を開き、条件式の左辺・右辺それぞれに空白を設定します(値⇒ の状態)。

どちらにも空白?これってどういう条件なんですか?

これは無限ループの設定じゃ。
予め左辺と右辺に同じ値(空白)を設定しておくことで、常に条件が一致している状態にできるぞ。
例では空白を設定しているが、「1 = 1」、「☆ 等しい ☆」といった条件でも構わないぞ。

なるほど、ちょっとトリッキーですね。
でも、無限ループになってしまったら、シナリオが終わらないのでは?

そう言うと思って用意しておるぞ。ほれ、ノード『繰り返し終了』じゃ!
①繰り返し終了
繰り返し終了では、特に何かを設定する必要はありません。
このノードを通過すると、繰り返しグループが終了し、繰り返しグループの外側へ処理が移動します。
それでは動作確認をしてみましょう。

無事処理完了しました!これで複数ファイルも処理できますね!

安心するのはまだ早いぞ、ロータス君。
シナリオだけでなく、実行後の各システムやファイルがどうなっているか、実際に見て確認するまでが動作確認じゃ。まずはフォルダを覗いてみよう。

あれ、ヤマオカ店のファイルが確認依頼フォルダに入っています。
このエクセルファイルは正しいものなので、処理済みフォルダに行くはずなのですが…。

何か見落としがありそうじゃのう。
こういう時はシナリオの実行ログを確認してみよう。ヒントが隠されているかもしれないぞ?
WinActorのツールバー>機能編集エリアには、様々な機能を持つ画面が集約されています。
その中の一つに、「ログ出力」画面があります。
ここでは、「何時何分にどのシナリオのどのノードを実行して、どうなったか」というログが記録されています。

確認依頼フォルダにファイルが移動しているということは、何かエラーが発生したのかな?
それらしきログは… あった、ここですね!

ほう、「値の設定」で失敗したのじゃな。データが転記出来なかったようじゃ。
ブラウザの画面はどうなっているかな?

送信完了の画面になっていますね。
……そうか、解けましたよ!全ての謎が!

事件はエクセルじゃない、ブラウザで起きていたんです!

な、なんじゃなんじゃ

解説しましょう。
WinActorは、まず最初に社内システムを立ち上げます。

そして未処理フォルダの先頭ファイル…ここではコーホクキタ店を選択します。
選択したファイルのデータ転記が終わると、送信ボタンを押し、データを登録します。
この時、社内システムの画面は「フォームを送信しました」という表示に変わっています。

コーホクキタ店の処理が終わっても、まだヤマオカ店のファイルが残っています。
WinActorは繰り返しグループを辿り、もう一度データ転記をしようとしますが…
データ転記先である入力フォームではなく、「フォームを送信しました。」 の画面になっているので、
転記先が見つからず失敗してしまうのです!

なんだってー!

ということで、入力フォームをもう一度表示させる処理が必要ですね

いや急に普通の口調に戻るんかい!
ロータス君、名推理でしたね!それでは画面更新の処理を作成しましょう。
以下のライブラリを使用します。
②【ライブラリ】>23_ブラウザ関連
・ページ表示
②【ノード】>アクション
・ウィンドウ状態待機

画面更新の方法はあくまで例なので、ご自分のシステム画面では、そのシステムに合った方法を探すのじゃぞ!
画像マッチングやエミュレーションがよく使う方法じゃな。
①ページ表示
入力欄を再表示するため、第7回WinActor道場で使用した「ページ表示」ライブラリを再利用します。
新しくライブラリを用意しても構いませんが、設定内容は同じなので、既に作成してあるライブラリをコピーして使うのも良いでしょう。
ブラウザ名は変数『ブラウザ名』を選択します。
URLには変数『URL』を設定します。
②ウィンドウ状態待機
画面を更新したり、ページを遷移するような処理では、WinActor上では処理完了していても画面上の処理が追い付いていない場合があります。
そのままシナリオを続行すると、WinActorが処理を先走ってしまいエラーとなります。
これを回避するため、「ウィンドウ状態待機」を入れることがよくあります。

お守りみたいなものじゃな。
詳しくは第12回WinActor塾をチェックじゃ!

取得結果は変数『実行結果』を選択します。
ウィンドウ識別名は、社内システム画面の入力フォームを選択します。
画面の変化は「画面が表示されるまで」「一定時間待つ」を選択します。

ではさっそく動作確認…よし!
2つとも処理済みフォルダに移動されました!

ファイル移動の処理は問題無くなったようじゃの。
しかしロータス君、今度は結果に意識を取られて、過程を見落としておるぞ。

ええっ、まだ何かありましたか!?

もう一度シナリオを実行して、処理をよく観察してみるのじゃ。
皆さんはお気づきになったでしょうか?
2つめのファイルのデータ転記の際、途中から空白が転記されています。

ヤマオカ店のエクセルファイルには5行分のデータがあるのに、
1行分しか転記されていないということでしょうか?

そうじゃな。
ここで何が起きているのか、エクセルファイルと変数一覧を表示しながら確認してみよう。
以下にシナリオを一時停止した時の各画面をお見せするぞ。

ヤマオカ店のエクセルファイルは6行目までデータが入っているので、
変数『最終行』に値「6」が 入るのは正しい動きですね。
変数『データ取得行』の値は…10? 10行目には何も入っていないのに。
こんな数字、一体どこから来たんだろう?

謎の数字、10か。
どれ、ロータス君、最初に処理したコーホクキタ店のエクセルファイルも見てみよう。

開きましたけど…このエクセル上に何かヒントがあるのでしょうか?

おやおや、名探偵ロータス君なら気付くかと思ったのじゃが…
このエクセルファイルのデータを順に転記していったら、最後、変数『データ取得行』は何になっているかな?

最後のデータは5行目にありますから、5では?

その通り。
それでは、このエクセルファイルのデータ転記が終了して、次のエクセルファイルを開いた時。
変数『データ取得行』は何になっているかな?

あっ…、もしかして、6ですか!?
そうか、続けて処理をしているから、変数の値もそのままカウントアップされてしまうんですね。

そうじゃ。
2つ目のエクセルファイル、ヤマオカ店のデータ転記をする際、
変数『データ取得行』は 値「6」となっておるから、6行目からデータ転記を始めるのじゃ。

はー、なるほど。
そしてそのままデータ数分転記処理を繰り返すから、 10行目のような謎の位置にまで行数が移動していたんですね。

謎が解けたら、解決策を実装していこう! 恐らくこれが最後の修正ポイントじゃぞ!
博士も負けていませんね。
それでは、繰り返し時に正しい行の位置からデータ転記がスタート出来るよう、 処理を追加します。
以下のライブラリを使用します。
①【ノード】>変数
・変数値設定
①変数値設定
変数名は、変数『データ取得行』選択します。
値は「2」を設定します。
※エクセルファイルPOS取引履歴は、どれも2行目からデータが記載されているためです。

よ、よし…これで!今度こそ大丈夫なはず!

Let's 動作確認じゃ!
いかがでしょうか?2つのエクセルファイルのデータが、それぞれ全て転記されていましたでしょうか。
送信ボタンを押すと転記したデータは見えなくなってしまうので、WinActor実行中に見逃さないようよく見ていてくださいね。

では最後、社内システム画面を閉じる処理も入れておこう。
立つ鳥跡を濁さずじゃな。
①【ライブラリ】>23_ブラウザ関連
・ブラウザクローズ
①ブラウザクローズ
ブラウザ名は、変数名『ブラウザ名』を選択します。
これで、シナリオ実行時に開いたページやファイルも全て閉じられ、きれいに終了するシナリオとなりました。
データ転記編で実装する処理は以上です。

今度こそ完成ですね!
も、もう何か修正点が出てきたりしませんね!?

パーフェクトじゃ!
よく頑張ったな、ロータス君!
3.本日のシナリオまとめ
博士、ロータス君、そしてブログをお読みいただいている皆様、お疲れ様です。
第7回~第10回のWinActor道場 データ転記編は、以上で完結となります!
シナリオの全体像及び変数一覧を以下に掲載しますので、ご参考ください。
また、ブログの内容でご不明な点がありましたら、コメント欄よりお問い合わせください。

自分の力でここまで作れるようになるなんて、感激です!
完成形を最初に見ていたら、尻込みしていたかもしれません。

全体像を見ると複雑な処理に見えるかもしれないのう。
しかし、一つ一つの処理はシンプルなものが多い。小さな処理から作っていけば、今のロータス君でも十分に実用的なシナリオを作成できるはずじゃ!

なんだか、もっとこだわりたくなってきました。
変数一覧の変数も、グループ分けしてもっと見やすくして…あ、タブも分けたほうがいいかな?

ふふふ、WinActor沼に嵌っておるな。
しかしロータス君、一旦ここで区切りとしよう!業務効率化が目的ということを忘れてはいかんぞ。

押忍!!

それでは皆さん、お疲れ様じゃ。
次回の道場は新しい内容になるので、楽しみにしていてくれい!