LoginSignup
0
0

More than 1 year has passed since last update.

重複あるEXCELデータの高速検索

Posted at

名前付き範囲で検索する

Bizroboで、検索したいデータにゆらぎがない(完全一致)場合は、ループで1行ずつ調べるよりも、名前付き範囲内で検索する方が圧倒的に処理速度が速い。

参考:https://tech.seagp.com/bizrobo-researchexcel/

しかし、やっていることはエクセルのVLOOKUPとほとんど変わらない処理のため、処理したいデータに重複があると一番最初にヒットした検索データのみしか拾ってこれない。そのため、すべて拾うには多少の工夫が必要になる。

シチュエーション

例えば、2011年1月1日から2022年12月31日の「快晴」時の「最低平均気温」を調べたいとする。データは気象庁から簡単にダウンロードできる。これをエクセルデータに直して、Bizrobo内で扱う。

一般的には一行ずつを抽出して、最低気温を比較・更新するという手法になるが、すでに検索条件が「快晴」であることが指定されているため、これを検索キーとして探索させる。

実際の処理

全体像(ファイルの読み込みは割愛):

スクリーンショット 2022-12-08 135435.png

大まかな流れとして、次のように分解できる。
1.名前付き範囲[天気概況]から、"快晴"に一致するセルを探索。
2.一致セルを新規の名前付き範囲[快晴]として設定。
3.テストで見つかった最低気温情報を上書きするか判断。
4.名前付き範囲[快晴]の行+1から行終わりまでを、名前付き範囲[天気概況]として更新。
5."快晴"が見つからなくなるまで、1~4を繰り返し。

デザインモードで見ると、どうやって名前付き範囲[天気概況]を更新しているのかわかりやすい
image.png
image.png

実行結果を見ると、

デバッグの状態:ログ
Write Log: 実行回数:436
Write Log: 東京の快晴時最低気温は 1/25/18、0.0℃

今回使ったデータは4000行程度なので、通常ループに比べると、10分の1程度まで処理回数を少なくできている。ただし、実際の実行時間は通常ループの方が機能が単純な分コンマ数秒速い。

結論

実際の業務では何万のデータ行を扱うことになり、大量のデータ処理にはこの手法が最適解である!
 ……と声高らかに宣言したいところだが、最大の弱点としてEXCELファイルにしか使えない。

CSVではクラシックモードで名前付き範囲を扱うことができるが、CSVのHTML構造では列の情報を持っていないため、横方向のみにこの手法が使える(と考えられる。試してない)。使えたら報告ください。

参考記事が「ループを回さない」と銘打っている通り、重複が少なければ少ないほど真価をできるため、自身の自動化したい内容に応じて実装してみてほしい。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0