フィールド設定 | フィールドを名前で設定 |
スクリプト実行 | (1) |
変数を設定 | (2) |
(1)については、「バーチャルリストで目次を生成する」のデモ1を参照してください。
(2)については、バーチャルリストによるレポート生成(パート1)のレポート2で使われていました。今回の記事で詳しくご紹介します。
Set Variable by Name
(元記事はこちら)
Kevin Frank
2016/4/6
最近、いろいろな集計や作表の処理をしているときに、一つ以上の変数を「動的にインスタンス化」する簡単な方法があればいいのに、と思うことがよくあります。別の言い方をすると、「変数を名前で設定する」ということですが、その変数名は人が決め打ちするのではなく、プログラムで生成するという意味です。
この問題はこのブログでここ5年ほどの間に何度か取り上げられてきました。代表的なものはDynamic Variable Instantiationですが、そこで私が書いたのは..
..ということと、合わせて一時的な解決方法として、なんとも扱いにくいわけのわからない式を提案しました。具体的な式は以下の通りです。
実際のところ、この方法は時々使うものとしては悪くありません(特に変数に渡す値が上のGetSummaryのように単純であれば)。
しかしこの手法を日常的に使うようになり、さらに変数に渡す値が複雑になってくると、結局カスタム関数を使ったほうがいろいろ楽になるということに気づきました。自分のニーズにぴったりあうものはなかなか見つかりませんでしたが、うまく行きそうな候補をBrian Dunningのサイトで見つけ、それを修正することにしました。
名称はSetVarByName(変数を名前で設定)にしました。この機能確認用のデモファイルに定義してあるので試してみてください。
SetVarByName.zip
カスタム関数のめざす姿
- 設定と利用が簡単
- 単体で動作する — フレームワークの一部品ではない
- ゼロや負数の繰り返しを許容する(もちろんそれに加えて正数の繰り返しも)
- $ローカル変数と$$グローバル変数の定義が可能(指定がない場合はデフォルトで$ローカル変数)
- 値が静的なテキストか実行コードかを自動的に解釈する
定義
オリジナルのカスタム関数にVaughan Bromfieldが加えた改良点は、メイン部分をEvaluationErrorで囲ったことです。これによって、文法に明らかな問題がない場合にゼロを返します。私はその考え方をさらに進めて、最初のLetの宣言部分も別のEvaluationErrorで評価するようにしました。これにより、カスタム関数に渡したのが静的な文字列なのか、あるいは解釈されるべき実行コードなのかを推測する機能を実現します。
静的な値の例
結果:
実行コードの例
説明:
- $counter = 2
- “$col_” & $counter = “$col_2”
- $col_2 = 12
- $col_1 = 3
- $col_2 / $col_1 = 4
実行コードの自動判別をオーバーライドする
もしなんらかの理由で、実行コードの自動判別をオーバーライドする必要がある場合は、Quote関数と(必要であれば)エスケープしたクォーテーションマークを組み合わせて使用します。
この式の結果は次のようになります。
ポイントは、このカスタム関数を利用すればめったにないケースのためのややこしい式が不要になり、最低限の操作でほとんどの場合に目的の結果を得ることができます。
少なくとも、私にとっては作業がとてもはかどるようになりました。今後掲載予定の「バーチャルリストによるレポート生成」の連続シリーズで、実際の場面での利用例を紹介します。
最後に、カスタム関数について有用なフィードバックと提案をいただいたRob Russell、Howard Schlossberg、Geoff Gerhard、Darren Terryに感謝の意を表します。