VBA ソート革命?もう自作のソート関数は不要になるのか

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

こういう2次元領域をならべかえるときには、もちろんsort関数でもいいんだけど、ソート関数はキーの加工ができないのでそのあたりは不便。ただし、これは作業列を作れば解決するのでそれほど問題でもないかもね。 pic.twitter.com/XqFmcZD3I1

2021-06-18 03:09:36
拡大
ほえほえ@スプシマン @hoehoe1234

「作業列をつくってよい」という前提が許容できるならsort関数で問題は解決している。というか、やっとsort関数が実装ですか。なにしてたんですかね?ソート関数つくちゃいましたよw。さて、sortby関数ならこのようになります。index関数がいい仕事してますね。 pic.twitter.com/PKI3WEnQiK

2021-06-18 03:11:28
拡大
ほえほえ@スプシマン @hoehoe1234

ちょっと見にくいですが、ちゃんと年齢でソートされています。すごいですね。いままでの苦労はなんだったんでしょうか?w pic.twitter.com/qszLS2ZllT

2021-06-18 03:13:30
拡大
ほえほえ@スプシマン @hoehoe1234

いままでのrng.sortなどと比べるとどこがいいかと言えば、取得してきた配列をソートしているところなんですよね。シートを並べ替えるのではなくて取得してきたデータを並べ替えているところがよりプログラム的であり、安定、使いやすくなっているとおもいます。

2021-06-18 03:14:51
ほえほえ@スプシマン @hoehoe1234

では、年齢の1桁目でソートするにはどうすればよいのでしょうか?もちろん、作業列を使えばsort関数でソートできますが、せっかくのsortby関数があるので基準配列を加工してみましょう。こうなります。 pic.twitter.com/y0r6W1XWI3

2021-06-18 03:25:25
拡大
ほえほえ@スプシマン @hoehoe1234

結果です。ちゃんと年齢の1桁目でソートされていますね。これがDSUソート(sortby関数)の強いところです。基準配列を引数にとるので基準配列を並べたい順番に加工すればいいのですね。 pic.twitter.com/SFd1hIiXeY

2021-06-18 03:27:01
拡大
ほえほえ@スプシマン @hoehoe1234

この「シーケンスの加工」は滝libの関数オブジェクトとmap関数が活躍する場所なのですが、普通にループで書いたほうが早いし、わかりやすいというのが悲しみです。これでもう、セル範囲に影響を与えずに好き放題に2次元配列が並び替えられますね。かなしみです・・・。

2021-06-18 03:28:26
ほえほえ@スプシマン @hoehoe1234

もちろん、1次元配列もならびかえられますね。 pic.twitter.com/pwbBLq0JPF

2021-06-18 03:30:07
拡大
ほえほえ@スプシマン @hoehoe1234

配列リテラルも並び替えられますね。あたりまといえばそうなのですが・・・。 pic.twitter.com/hYQJAVD2uF

2021-06-18 03:32:05
拡大
ほえほえ@スプシマン @hoehoe1234

配列のサイズが一定以内に収まる場合は、 ①作業列+sort関数 ②sortby関数+基準配列の操作 のどちらかで任意のキーを基準とした並べ替えがごく簡単にVBAに使えるようになりました。待ち望んでいた機能ですが、一抹の寂しさがありますね。

2021-06-18 03:35:50
ほえほえ@スプシマン @hoehoe1234

仮引数名の一致を求められるとはしらなんだ・・・。 pic.twitter.com/d9iWtiwmIm

2021-06-18 04:09:46
拡大
ほえほえ@スプシマン @hoehoe1234

範囲を2次元配列として取得し、年齢の1桁目でソートして転記するコード。新関数のsortbyのおかげでめちゃくちゃ簡潔なコードになってますね。 pic.twitter.com/gRNsMhKXTo

2021-06-18 04:51:29
拡大
ほえほえ@スプシマン @hoehoe1234

ソートモジュールはそーと苦労?してつくったんだけどとーとういらなくなってしまったかもですねw。 pic.twitter.com/BahIHKlqb2

2021-06-18 04:52:54
拡大
ほえほえ@スプシマン @hoehoe1234

レンジに転記する関数(プロパティで実装)はこちら。 pic.twitter.com/YQxHIiGsl1

2021-06-18 04:54:27
拡大
ほえほえ@スプシマン @hoehoe1234

このような個人情報を誕生日の日にち部分(1~31)で並び替えるとします。 pic.twitter.com/j35Lf5jBMm

2021-06-25 02:12:59
拡大
ほえほえ@スプシマン @hoehoe1234

転記であればfitler関数+sortby関数がうまく使えそうですね。これをあえてVBA内で実装してみます。結果はこのようになります。誕生日欄がシリアル値になってますね。これ、どうすればいいんでしょうか? pic.twitter.com/A2RQTTXnV5

2021-06-25 02:14:15
拡大
ほえほえ@スプシマン @hoehoe1234

VBAのコードです。簡潔に書けていますが、シート間の転記が新関数でフルエントに行えるようになった今では少々寂しさを感じますね。ただ、ファイルに書き出す場合、違うブックにコピーする場合は便利に使えそうです。 pic.twitter.com/BkWrN80tHX

2021-06-25 02:17:12
拡大
ほえほえ@スプシマン @hoehoe1234

この処理のために作った関数は1つもありません。既存の滝Lib関数を使ってうまくソートができています。それにしても日付の取り扱いは、書式を含めて難しいですね。

2021-06-25 02:18:06
ほえほえ@スプシマン @hoehoe1234

ファイルに書き出す場合も、実は、一旦作業シートにfilter関数+sortby関数で出力用のデータを作ればよいので今後ますますレンジの操作は新関数に寄せていったほうがよいのでしょうね。圧倒的便利さだと思います。ただ、自身を並び替える旧来の方式もマスタしておく必要がありますね。

2021-06-25 02:19:34