公開日
変数シリーズ【第2回】データテーブルです。
データテーブルとはデータ型のひとつで、表形式のデータをまるごとひとつの変数に保存できます。ひとつの変数の中に複数の値がある場合、どうやって値を使えばいいのでしょうか?今回はこのデータテーブルを使ってみましょう。
エクセルから"範囲"を読み取る
まずエクセルでこのような表を用意します。従業員マスタをイメージしてください。※架空の従業員情報です
Excel ワークシートから読み取る アクションを配置し、取得を「セル範囲の値」、先頭~最終の列行は範囲の列・行を入力します。
ここでのポイントは、範囲の最初の行に列名が含まれています をONにしておくことです。
生成された変数は ExcelData となります。この変数名のままだと、何の値が入っているか分かりにくいので今回は StaffListData に変更します。
フローを実行すると、StaffListDataに表がそのまま取り込まれ、DataTable型と確認できます。
DataTable型の見方・使い方
データテーブルは表形式のデータそのままで、列と行を持つことができます。つまり、複数の行列を持てる=複数の値のまとまりということ。
変数はひとつの値を保持するだけでなく、まとまった複数の値をひとつの変数として持つことができます。
このデータの中からひとつのセル値を指定するには、このように表します。
%変数名[行][列]%
たとえばひとり目の氏名を取得するには、%StaffListData[0]['氏名']% または %StaffListData[0][2]% となります。
複数値を持つ変数の見方
- 行番号は0から始まる
- 列名を指定できる
- 列番号も0からの数値で指定できる(列名と列番号どちらでも使用可能)
- 列名を指定しない場合、列名が入っていない場合は Column+連番が振られる
- 行列の指定には変数を使うことも可能
エクセルから範囲を読み取る際に、「範囲の最初の行に列名が含まれています」をONにしたため分かりやすい列名で列を指定することができます。
一方OFFにした場合は、列名がColumn+連番となります。
列名部分もデータの一部として0行目に表示され、実際のデータが1行目になります。
この場合のひとり目の事業所は、%StaffListData[1]['Column2']% または %StaffListData[1][1]% となります。
変数を使って行列の番号を指定するには、別途数値を持つ変数を用意した上で、このように表します。
%RowNo% 値:2 (半角数字)
%StaffListData[RowNo]['氏名']%
列名自体を変数に入れることも可能で(%ColumnName% 値:氏名)、%StaffListData[RowNo][ColumnName]% とし、列名にシングルクォーテーションを付けません。
メッセージを表示アクション を利用して(ポップアップが妙に小さいのですが・・・)、いろいろなパターンでセル値を指定して、値を確認してみてください。
データテーブルから値を取りだす方法は少し難しく見えますね。ですが、まとめて値をたくさん読み取るため、ひとつひとつ何度も読み取るよりは効率が良くなります。行番号や列の指定方法に慣れるために、意識して使ってみましょう。
ループアクション Loop と組み合わせて使う
データテーブルは複数値のまとまりなので、1行ずつ同じ処理を行っていくというケースが多いです。ループ=繰り返しと組み合わせて使う方法をみてみましょう。
ループは1周ごとに変数の内容を変えることで別の値に対して同じ処理を行うものです。
では、列名を指定して読み取った StaffListData を使ってループ処理を作ってみましょう。
Loopアクション を配置し、開始値:0 (= 行番号0から)、終了:2 (= 行番号2まで)、増分:1 (= 1ずつ) とします。
Loop とセットでEnd が作成され、Loop から Endを1回実行すると1周で、今回だと0~2までの3周することになります。
生成された変数は LoopIndex でした。LoopIndexには開始値、つまり今回は0がセットされています。そして1周すると、増分1され2周目のLoopIndexは1が入るというように、1周するごとにLoopIndexの値は変化していきます。
つまりこのLoopIndexを使うことで、順番にデータテーブルの行番号を変化させていけるということです。
メッセージを表示アクション を配置し、1周ごとに氏名を表示してみましょう。変数は %StaffListData[LoopIndex]['氏名']% と書けばいいですね。
1周ごとに氏名が表示されましたでしょうか?
データテーブル内の値をきちんと把握した上で、LoopIndexの値を上手く使いこなすとLoopはいろいろな使い方ができます!
【マニアックな情報ですが・・・】LoopとEndの間で、変数 LoopIndex に別の値を設定しても、次にLoopを通る時元に戻ってしまう。
ループアクション For each と組み合わせて使う
Loopは便利ですが慣れないうちはけっこう難しいものですよね。もう少しシンプルな方法にすることもできます。
では、列名を指定して読み取った StaffListData を使ってもうひとつループ処理を作ってみましょう。
For eachアクション を配置し、反復処理を行う値に StaffListData をセットします。StaffListData の行数分、1行ずつ上から実行する、ことになります。
何を実行するかというと、保存先 CurrentItem へ1行分のデータを保存することです。この変数名も分かりやすくするために今回は CurrentItemStaff に変えておきます。
全然シンプルじゃない。何か複雑じゃない?という気もしますが、落ち着いて、順に見ていきましょう。
メッセージを表示アクション を配置し、1周ごとに CurrentItemStaff を表示してみましょう。
保存先の変数(CurrentItemStaff)には1行分のデータを保存してくれるため、最初の行だけすべての列の値を持っているのですね。
変数ペインで CurrentItemStaff の値を確認してみると、Datarowという複数列を持つ1行分のデータ型ということが分かります。
つまり、1周するごとにDataTable型の StaffListData から、Datarow型の CurrentItemStaff へデータを移し替えているのです。
1行分だけのデータになったら、後は列を指定するだけでひとつのセル値を取りだすことができます。氏名列の指定はこのようにします。
%CurrentItemStaff['氏名']% または %CurrentItemStaff[2]%
データテーブルで列行を指定するときと、基本の書き方は同じです。行を指定しない分シンプルですね!
For eachアクションに繰り返し処理したい値をセットするだけなので、Loopに比べると使い方はシンプルです。保存先の変数名で値を取りだすのがポイントですね。
きちんと列名指定して読み取ったデータテーブルを処理するのに向いています。
なんとなくデータテーブルから値を取りだす方法がイメージできてきたでしょうか?
エクセルのデータがある範囲を調べる
冒頭でエクセルから読み取ったときは範囲をべた書きで指定したのですが、固定値ではなく”データがある分を自動的に”読み取りたいですよね。
テーブル名があれば取得を「名前付きセルの値」にし、テーブル名を指定すると便利です。テーブル名がない表の場合は、Excelワークシートから最初の空の列や行を取得アクション を活用してみましょう。エクセルから読み取るアクションより上にアクションを配置してください。
最初の空の列 FirstFreeColumnと行 FirstFreeRow が数値で取得できます。これは空の行の行番号になるので、この1行前までデータがある、と考えられます。つまり空の行-1すればデータの最終行になるというわけです(変数シリーズ【第1回】変数を計算で使ってみる)。エクセルから読み取るアクションの範囲の最終行を、FirstFreeRow を使って変更してみてください。
これでデータ量の増減があっても設定を変える必要はなく、データがある分だけ範囲に含めることができます!
生成されたアクションの左にある > を開いてみましょう。
変数にはそれぞれ説明が付いており、どんな値が入るかの参考になる場合もありますので、最初のうちは読んで確認するとよいでしょう。
また、今回のように生成された変数のうち、行は使うけれど、列は使わないということもあるかと思います。変数にはON/OFFスイッチが付いていますので、使わない変数をOFFにしておくことができます。OFFにすると変数は生成されないため、右側の変数ペインには出ません。少しの効果ですが使わないものがない分スッキリしますのでご活用ください。
<今回のおさらい>
DataTable型 %ExcelData[行][列]%、Datarow型 %CurrentItem[列]%、データの最終行 %FirstFreeRow -1%
データテーブルの列行の指定方法は難しかったと思います。変数ペインで値を確認しながら、たくさん使って感覚をつかんでいきましょう。
変数シリーズ【第3回】ではプロパティを紹介します。