概要
WinActorにおける「辞書操作(情報取得)」ライブラリに納得いかない部分がある。
納得いかないのでちょっと確認する。
動機
WinActorの辞書について気になる部分があるが、Web上に十分な記述を発見できなかったため、忘備録を兼ねて記事にしておく。
辞書とは
プログラミングにおけるデータ構造のひとつ。
言語によっては、連想配列、Map、Hash、辞書型などと呼ばれる。
KeyとValueをセットで登録し、Keyを指定することでそのKeyに対応したValueを取り出すことができる、というもの。
WinActorにおける辞書
ライブラリ > 03_変数 > 02_辞書と配列 フォルダに
- 辞書操作(ダンプ)
- 辞書操作(初期化)
- 辞書操作(情報削除)
- 辞書操作(情報取得)
- 辞書操作(情報更新)
上記の5つのライブラリが存在する。
辞書操作(初期化) を経由したうえで、 辞書操作(情報更新) でキー(Key)と情報(Value)のセットを登録しておき、 辞書操作(情報取得) で指定したキー(Key)に紐づいた情報(Value)を取得する、というのが基本的な使用方法。
細かい使用方法は別の記事を参照してもらうとして、当記事では 辞書操作(情報取得) ライブラリについて論じていく。
辞書操作(情報取得)の仕様について
WinActorの 辞書操作(情報取得) ライブラリの注釈は以下の通り。
辞書から指定されたキーの情報を取得します。
「辞書名」 :辞書名を指定する。
:「値⇒」に辞書名を指定してください。
「キー」 :キーとなる文字列を指定する。
:「値⇒」にキーを指定してください。
「取得情報」:辞書から取得した値を格納する変数を指定する。
「キー」にキー(Key)を指定すると、対応した情報(Value)を「取得情報」で指定した変数に格納する、と説明されています。
なるほど。
指定したキー(Key)が登録されていない場合はどうなるんだ?
ExcelVBAにおいては、重複のチェックにディクショナリオブジェクト(VBAにおける辞書のこと)を用いることが珍しくない。
つまり、このKeyは登録済みなのか未登録なのかの判定に辞書を使用するのだ。ValueにはTrueでも入れておけばいい。どうせ使わないし。
WinActorでも辞書をこの使い方がしたいのだが、注釈には未登録のキー(Key)を指定したケースについて言及がない。困った。
困ったので、公式のドキュメント(WinActor_User_Library_Sample_Manual.pdf)を確認した。
Ver7.4に同梱されていたものなので、現時点では最新のドキュメントだろう。
P.27に辞書操作(情報取得)ライブラリについての書かれていた。
基本的には注釈と同じことが書いてあるが、1点だけ相違点がある。
指定されたキーが存在しない場合、「取得情報」の変数値は変化しません
ええー? ほんとにござるかぁ?
そんなことある?
それじゃあ「取得情報」に指定した変数の値が、元から変化していないものなのか、キー(Key)に対応した情報(Value)なのか、分かりづらくない?
使い物にならないとは言わないが、結構嫌な仕様だ。というか、かなり重要なことなので、ドキュメントだけではなくライブラリの注釈にも書いておいて欲しい。ドキュメントにこの記述を発見した途端に仕事のモチベーションが大きく減退した。
俄かに信じ難い記述なので、念のためスクリプトも確認しておこう。
辞書操作(情報取得) ライブラリをワークフローに設置して、スクリプトタブを確認する。
If objDictionary.Exists(key) Then
Call SetUMSVariable(value, objDictionary.Item(key))
Else
Call SetUMSVariable(value, "")
End If
うん?
君なんかドキュメントと違わない?
指定したKeyが登録されていない場合はValueとして""を返す、と書かれている。
ドキュメントの記述は誤りであり、
指定されたキーが存在しない場合、「取得情報」に指定した変数には空白(0文字の文字列)が格納される。
というのが正しそうだ。
結論
辞書操作(情報取得)ライブラリは、存在しないキー(Key)を指定した場合、「取得情報」に空白を返す。
よって、辞書をキー(Key)の重複チェックの用途に使用する場合、情報(Value)には空白以外(Trueとか)を指定しておき、辞書操作(情報取得)ライブラリ後に空白かどうかをチェックするのが良さそうだ。
補足①
公式の配布しているサンプルシナリオの中に「辞書の作成と検索を行うサンプルシナリオ」が存在する。
こちらにも辞書操作(情報取得)ライブラリの動きについて直接の言及はないものの、シナリオの動きとして「辞書内に該当するキーがなければ、取得情報は空白」といった解説がある。
補足②
実際に試してみた。
変数値設定で「情報取得」で指定する変数に初期値を設定しておく。
辞書操作(情報更新)ライブラリを使用していないので、登録されているキー(Key)は存在しない。
辞書操作(情報取得)ライブラリでキー(Key)に適当な値を設定し、実行する。
結果、情報取得で指定した変数の初期値は上書きされ、""となっていた。
当たり前だが、スクリプト通りの結果だ。