レンジを操作する部品

2
ほえほえ@スプシマン @hoehoe1234

カレントリージョンはcr、ユーズドレンジはurでいいかな。どっかの会社みたいだけど。これは比較的最近わかったんだけど、レンジ系はイデオムがたくさんあるね。集合演算だから当然といえば当然だけど。クエリもそうだけど集合演算はとっても便利なんだよね。

2021-05-12 14:37:53
ほえほえ@スプシマン @hoehoe1234

1行目のヘッダ列、もしくはタイトル行を外すには intersect(cr, cr.offset(1)) だけでいい。 安全な範囲なら intersect(rng, ur) ※rngは多分列全体指定とか でいい。 中抜けの表なら range(cr(最初), range_last_row) で全体を指定できる。

2021-05-12 14:40:01
ほえほえ@スプシマン @hoehoe1234

エクセルの機能エミュレータ関数(たとえばsort、autofilter等)を使うときには表に余計なものがあると困る場合がおおいだろうけど、VBAから使う場合は、それがわかっていれば範囲はいかようにも設定し直せるので特に問題にならないんだよね。これを集合演算を使わないで絶対軸とか手順的な物で

2021-05-12 14:41:30
ほえほえ@スプシマン @hoehoe1234

対応しようとするとしんどいというか可用性と可読性と変更耐性がうしなわれてしまう。となると必要なのはrange_last_rowのような「部品」。部品の設計は組み合わせて新しい範囲をシームレスに作れるようなインタフェースが必要。これが割と難しい。

2021-05-12 14:43:08
ほえほえ@スプシマン @hoehoe1234

たとえば重複行を削除するという関数は作ってはいけない。作るのは重複行の集合を返す関数。前者は機能はシンプルだが特化しており組み合わせができない。たとえば重複行のカウント、コピーに同様の関数をコピペで作成する必要がでてきてしまう。 pic.twitter.com/43wfTfGCWY

2021-05-12 14:46:21
拡大
ほえほえ@スプシマン @hoehoe1234

これなんかも簡単な部品関数だけど、重要なのはこの価数の「定義」。offset関数を基準として数式で関数を定義している。部品を作るにはこのような「なにが基準か?」を決めるのが大切。 pic.twitter.com/nOQIt0REyu

2021-05-12 14:48:48
拡大
ほえほえ@スプシマン @hoehoe1234

実はこの感覚が分かると、VBAの多くの関数は内部的にある関数を基準に挙動しているのではないか?というのが分かるようになる。判断に「たぶんこの関数を使っているからこう動くだろうな」が予想できるようになる。実際は試してみればよいだけなんですけど想像できる根拠があるのはストレスが減ります

2021-05-12 14:50:04
ほえほえ@スプシマン @hoehoe1234

なので「最終行」を返すよりも「最終レンジ」を返すほうが、一定レベルになってからは理があります。レンジ操作をしているので最終レンジを返す関数は「部品」としてシームレスに使えるんですね。でもこの部品を運用するには「他の関数も同様に作って」ないと行けないのでいろいろ大変なのです。

2021-05-12 14:51:37
ほえほえ@スプシマン @hoehoe1234

これなんかは単に技術検証のために作成したもので、実戦では呼び出し側でやればよいことなのですが、レンジ系の共通関数は、集合関数を組み合わせて機能を提供するのではなくて、呼び出し側が即時に機能を組み合わせられる部品を提供するのが使いやすいと思います。

2021-05-12 14:54:07
ほえほえ@スプシマン @hoehoe1234

その意味では、この関数なんかは単なるユーティリティであり、あまり良くない(作る意味がない)んですよね。まあ便利そうだから作ったんですけど。こういうのは単なるショートカット関数ですね。 pic.twitter.com/1EzpXxXqKV

2021-05-12 14:55:55
拡大
ほえほえ@スプシマン @hoehoe1234

このような関数も作っていますがどうかな?って感じです。RangeにValue, Value2以外にValueArrみたいな感じで必ず配列で値を取得する。てのがあればいいんですけどね。バリアントの多様性を利用するとこのような関数も簡単に実装できますね。 pic.twitter.com/0cFUZA0MSs

2021-05-12 15:00:28
拡大