名前付き範囲で検索する
Bizroboで、検索したいデータにゆらぎがない(完全一致)場合は、ループで1行ずつ調べるよりも、名前付き範囲内で検索する方が圧倒的に処理速度が速い。
しかし、やっていることはエクセルのVLOOKUPとほとんど変わらない処理のため、処理したいデータに重複があると一番最初にヒットした検索データのみしか拾ってこれない。そのため、すべて拾うには多少の工夫が必要になる。
シチュエーション
例えば、2011年1月1日から2022年12月31日の「快晴」時の「最低平均気温」を調べたいとする。データは気象庁から簡単にダウンロードできる。これをエクセルデータに直して、Bizrobo内で扱う。
一般的には一行ずつを抽出して、最低気温を比較・更新するという手法になるが、すでに検索条件が「快晴」であることが指定されているため、これを検索キーとして探索させる。
実際の処理
全体像(ファイルの読み込みは割愛):大まかな流れとして、次のように分解できる。
1.名前付き範囲[天気概況]から、"快晴"に一致するセルを探索。
2.一致セルを新規の名前付き範囲[快晴]として設定。
3.テストで見つかった最低気温情報を上書きするか判断。
4.名前付き範囲[快晴]の行+1から行終わりまでを、名前付き範囲[天気概況]として更新。
5."快晴"が見つからなくなるまで、1~4を繰り返し。
デザインモードで見ると、どうやって名前付き範囲[天気概況]を更新しているのかわかりやすい
実行結果を見ると、
Write Log: 実行回数:436
Write Log: 東京の快晴時最低気温は 1/25/18、0.0℃
今回使ったデータは4000行程度なので、通常ループに比べると、10分の1程度まで処理回数を少なくできている。ただし、実際の実行時間は通常ループの方が機能が単純な分コンマ数秒速い。
結論
実際の業務では何万のデータ行を扱うことになり、大量のデータ処理にはこの手法が最適解である!
……と声高らかに宣言したいところだが、最大の弱点としてEXCELファイルにしか使えない。
CSVではクラシックモードで名前付き範囲を扱うことができるが、CSVのHTML構造では列の情報を持っていないため、横方向のみにこの手法が使える(と考えられる。試してない)。使えたら報告ください。
参考記事が「ループを回さない」と銘打っている通り、重複が少なければ少ないほど真価をできるため、自身の自動化したい内容に応じて実装してみてほしい。