【第95回】ロータス博士のWinActor塾~文字列分割とループの小技 解答編
今日はいよいよ解答編!
お待たせしてすまんのう。
僕もできましたよ!
ここで見せられないのが残念です。
見せてもよいぞ。
え?いやいや、博士。だめですよ。
ちゃんと解答編やりましょうよ!
なんというわかりやすさ。さては爆発させたな?
しかしこの流れにも慣れてきてしまった・・・。
では普通に解答編スタートじゃ。まずは全体像から!
文字列を配列として扱い転記を行うシナリオ
シナリオ概要
今回出題されたお題はこちらです。
この条件を満たすシナリオを解答例としてご紹介します。
RoTASテストフォームを開いて全てのデータを取得し、Excelシートに転記するシナリオを作成してください。
満たすべき条件
・テキストボックスに表示される項目数が変わっても動くように作成すること
・1次元配列操作ライブラリを使用しないこと
・フォームからデータを全て取得してからExcelシートに書き込みを行うこと
シナリオ全体図
シナリオフローの全体図は次のようになっています。
変数一覧
今回はループを使用したシナリオになります。
無限ループとしても構いませんが、最大ループ数を超過した場合に必ずループから抜けるように変数「最大ループ数」を作成し
上限を50回までに設定しています。
全体としてはこんな感じじゃな。
お題の通り、シナリオの前半は情報取得、後半で転記を行っているぞ。
続いて、プロパティを見ながら処理を確認していこう。
各ノードのプロパティ
予めパスの格納された変数「フォームExcelファイルパス」を指定して開きます。
今回の例では相対パスを使用していますが、絶対パスを使用しても問題ありません。
ディレクトリ構成に合わせて適宜設定しましょう。
おなじみの最大化です。
操作対象のウィンドウサイズは常に一定にするように心がけると、シナリオの安定化に繋がります。
Excelを開いた後に、フォーム起動ボタンを押します。
アクションは「左ボタンクリック」を選択し、図のように設定しましょう。
ここまでは準備の部分じゃ。
次からループに入るぞ。情報取得を行うためのループじゃな。
情報取得のためのループを作成します。
この例では繰り返し回数を設定してループを行っています。「最大ループ数」の初期値は50です。
また、カウンタには変数「ループカウンタ」を指定し、ループ数をカウントしています。
ここでコピーのためにテキストエリアを選択状態にします。アクションには「左ボタンクリック」を設定しましょう。
項目名が毎回変化するため、マッチング箇所はフォームのタイトル部分とし、カーソル位置をテキストエリアに設定しています。
マッチング画像については、他のマッチングにも再利用できるようになるべく多くの情報が入った状態をキャプチャしています。
「Ctrl + A」の操作を行い、テキストエリアの文字全体を選択状態にします。
「Ctrl + C」の操作を行い、選択した文字列をクリップボードにコピーします。
クリップボードにコピーした文字列を、一旦「取得文字列」という変数に格納します。
この変数は、次の文字列連結に使用します。
連結はこのように設定します。
「文字列全体」の後ろに、カンマと、先ほど取得した文字列を連結します。
最初は「文字列全体」が空っぽじゃから、「,りんご」になる。
カンマからのスタートじゃがこれでよいのじゃ。
1~2ループ目で文字列全体がどうなるかは次の図の通りじゃ。
2つ目の項目を取得したあとも同じように格納していくぞ。
カンマを後ろにしても作成できるが、今回は前につける方法で作っておる。
この形は後の転記に関わってくるので、図を覚えておいてほしい。
これを頭の片隅に入れつつ、続きを見ていこう。
次の項目に移動するために「次」ボタンを左クリックします。
押した際の点線枠フォーカスがマッチングの妨げになる可能性を考慮して、ここでもタイトル文字をマッチング対象にしています。
さらに続けてマッチングを行います。
ここでは、「次」ボタンを押した際、次の項目がない場合に表示される「次の項目はありません。」の文字をチェックします。
アクションには「状態チェック」を選択し、状態取得結果に変数「画像マッチング結果」を設定します。
次の項目が無ければループを終了する処理を作成します。
先ほどのマッチング結果によって処理を分岐させるため、分岐ノードを入れて画像のように条件を設定しましょう。
「画像マッチング結果」がtrueということは「次の項目がありません。」の文字が表示されたということですので
true側のフローにループを抜ける処理を入れればよいということになります。
分岐のTrue側にループを抜ける処理を入れます。
「Alt + F4」でフォームを閉じる操作をした後、繰り返し終了ノードでループから抜けましょう。
分岐がFalse側の場合は、特になにもせずループするぞ。
Trueに流れたら全ての項目がコピーされ「文字列全体」に格納されているということになる。
これで情報取得のループは終わりじゃ。次はいよいよ転記じゃな。
項目(テキスト)を取得した回数 = 書き込みを行う回数 となるため
変数「インデックス」が「ループカウンタ」を超えるまでループされるようにしましょう。
インデックスは初期値で1を設定しており、ループの最後で+1されるようにシナリオを作成します。
そのため、インデックスはループ中に1ずつ加算されていき、転記回数が取得回数(ループカウンタ)を超えた時点で終了します。
ついにこのシナリオの肝の部分、文字列分割がきました。
上図のようにプロパティを設定してください。
結果格納先として、フォームからのテキスト取得時に使用していた「取得文字列」を設定しています。
既に取得してきた情報は全て「文字列全体」に格納されているため、上書きしても問題ないため再利用しています。
変数「分割サイズ」は利用することはありませんが、分割サイズには何かしら設定する必要があるため変数を用意しています。
取得ループでの文字列全体の中は覚えておるかな?
カンマでスタートしていたのう。次の図を見て欲しい。
文字列全体には
,りんご,オレンジ,ぶどう,いちご,パイナップル
が格納されています。これを「,(カンマ)」で分割すると、結果は次のようになります。
「カンマ+取得文字列」で文字列全体を作成した場合はこうなっておる。
最初のほうで少し言ったが、今回の例と違うもう一つの方法として「取得文字列+カンマ」もある。
そちらで作成した人はインデックス0番目にりんご、5番目が空欄となっているはずじゃ。
どちらも不要なエリアが生まれているということに注意しよう。
今回の例ではインデックス0番目が不要となるので、変数「インデックス」の初期値を1としています。
初期値を1とすることで、0番目をスキップして1番目の文字列から分割結果を取得していきます。
ここで分割結果の文字列を転記しています。
セル位置には初期値に「A1」を設定している変数「入力セル位置」を指定します。
次のループのために、転記後「入力セル位置」をひとつ下にずらします。
ループ終了直前に「インデックス」を+1します。
これで次のループ時に文字列を分割した際、次の項目が取得されるようになります。
1ループ目はインデックス1番目の文字列 = りんご
2ループ目はインデックス2番目の文字列 = オレンジ
:
という形でループされていきます。
繰り返しに設定した条件(インデックス≦ループカウンタ)によって、インデックスが6以上になり次第ループが終了します。
実行結果
ここまで正しく設定ができていれば、次のような実行結果が得られるはずです。
シナリオダウンロード
今回の解答例シナリオはこちらからDL可能です。
※ファイルの解凍には会員用パスワードが必要となります。会員登録はこちらから。
結構細かく説明してしまったのう。
この例で文字列を配列のように使うワザを覚えてもらえたら嬉しいのう!
僕見てただけですけど、わかりやすかったですよ!
このやり方には技名とかないんですか?
技名・・・考えたことも無かったのう。
うーむ、「博士スペシャル」とかどうじゃ?
ダsssいい名前ですね!
ダサいって言おうとしたじゃろ!聞こえとるぞ!
じゃ、終わりますか、塾。
その急なやつなんなんじゃ?最近の流行り?
なんかそのテンションで言われると終わりの気分になるのう。
ではまた次回にしよう!さらば!
関連記事こちらの記事も合わせてどうぞ。
2024.11.05
【第105回】ロータス博士のWinActor塾~新しい画像マッチング画面
2024.09.27
【第104回】ロータス博士のWinActor塾~ガイド利用シナリオ(作成編)
2024.09.10