VBA_関数から多値を返すには

VBAで関数から多値を返したいときにはどうすればいいのか?についてまとめました。
3
ちゅん🐤 @KotorinChunChun

@hoehoe1234 >配列とディクショナリは根本的には同じ 視点によっては同じですが、私としてはNOです。 配列は、戻り値を展開しても各要素の意味は値からしか予測できません。 辞書は、戻り値を展開すればキーから各要素の意味が予想できます。 ↓

2020-02-15 00:13:13
ちゅん🐤 @KotorinChunChun

@hoehoe1234 これはなんとなくですが 配列は途中で仕様変更があった際に、双方のバージョンの差異で、インデックスに差が出そうで怖いです。 辞書は仕様変更の時は関数内で、新しいキーを書くだけで済みます。過去のキーを変更する破壊的変更をしない限り、常に上位互換なので安心です。 現時点の想像です。

2020-02-15 00:16:29
はけた@できるExcel2021 @excelspeedup

@hoehoe1234 たしかに。 私も、書いていてそう思いました。 Enumや定数を使うなら、配列もDictionaryも、リスクとしては、ほとんど変わらないですね。

2020-02-15 00:19:52
ほえほえ@スプシマン @hoehoe1234

@KotorinChunChun はい。どちらも規約による呼び出しですが多少ディクショナリのconst文字列形式のほうが安定性が上だとは思います。仕様変更ミスの場合、配列は予期せぬ誤動作、ディクショナリは予期できる(キーがない)という誤動作となりますので。とはいえめんどくさいので配列使ってますけどw。

2020-02-15 00:43:28
ちゅん🐤 @KotorinChunChun

@hoehoe1234 ディクショナリの場合、呼び出し側は For Each key in dic.keys Select Case key Case "hoge" : hohehogehoge Case "fuga" : fugafugafuga Case Else : Debug.Print "non defined : " & key End Select Next みたいにすれば、ちょっと安心できそうなんですよね。 想像ですが。

2020-02-15 00:49:49
なんごく @Hiro_SysOp

@KotorinChunChun やはり配列が多いのか ByRefが1番低いのは納得 1つ目が何で2つ目が何で・・・と覚えるのが面倒 ちなみに自分は、いま扱ってる台帳が色んなデータ型の詰め合わせっていうのもあって、Type乱用マン

2020-02-15 11:17:43
としじ @toshi81350036

@yamato_1413 f.Assignの方にParamArrayを使うんですか…? f.Bytes側は配列として返却…?

2022-01-16 17:00:48
としじ @toshi81350036

@yamato_1413 PropertyのLetやSetだとParamArray受け付けてくれなそうですけど、どう書いたんですか・・? お手上げになりました😅 pic.twitter.com/7b6hC6VDiV

2022-01-16 18:02:29
拡大
風柳 @furyutei

@toshi81350036 @yamato_1413 動作としてはこんな感じでしょうか? おもしろいですね pic.twitter.com/IJemPFhxa0

2022-01-16 19:50:21
拡大
としじ @toshi81350036

@yamato_1413 @furyutei きちんと入りました! たしかにProperty Letで書くとちょっと自然に見えますね! pic.twitter.com/ovUHfLq3jL

2022-01-16 20:35:59
拡大
ほえほえ@スプシマン @hoehoe1234

@yamato_1413 このトリックはすばらしいですね。プロパティの構文をうまくいかしていますね。他値問題解決の一つの結論(イデオム)でしょう。似たようなのは作りましたがプロパティの構文を組み合わせているところが最高です。パクります。

2022-01-16 20:49:00
ほえほえ@スプシマン @hoehoe1234

パクれ!パクる!ぱくらねば! これは多値返しの一つの頂点。 さすがや!大収穫。 twitter.com/toshi81350036/… pic.twitter.com/Y5H6YsAKC2

2022-01-16 20:51:09
拡大
風柳 @furyutei

@yamato_1413 @toshi81350036 こんな感じでしょうか? ParamArrayの要素数が1個の場合の処理は好みが分かれそうですが… ※私的には MultiSet(a) = Array(1)でもaにはArray(1)ではなくて1が入って欲しいですかね… pic.twitter.com/7Y6mOHgPqA

2022-01-16 20:51:52
拡大
ほえほえ@スプシマン @hoehoe1234

多値問題にこんなエレガントな解決方法があったとは。似たようなのはいくつか作ってつかってたのですがParamArrayとプロパティを組み合わせるのはおもいつきませんでした。tk_unpack関数として実装します!ユーザ定義構造体配列バッファ以来の感動。

2022-01-16 20:53:21
ちゅん🐤 @KotorinChunChun

やまとさんの多値を返す関数を、プロパティとParamArrayによって実現する案は素晴らしい。 ただ、なんか見覚えがあるな・・・と思ったら、構文自体は発見済みだった! これが他に応用できなかった己の無力よ excel-chunchun.com/entry/20200725…

2022-01-16 21:08:47
ほえほえ@スプシマン @hoehoe1234

・・・わかりみ。わいも似たようなのいろいろ工夫したけど高みに登ることができなんだ・・・。しかし!だからツイッターはおもしろい。 twitter.com/KotorinChunChu…

2022-01-16 21:12:22
ちゅん🐤 @KotorinChunChun

@hoehoe1234 そう!忘れてしまった技術を誰かが思い出させてくれる。 自分が捨てた技術を誰かが進化させている。 インターネットは面白い。

2022-01-16 21:14:42
ほえほえ@スプシマン @hoehoe1234

ブバワールドの多値問題、かいけつされる。 tk_unpackにするか、tk_untupleにするか・・・どういうなまえがよいだろうか?他言語などではアンパックと呼ばれることが多いように思う。

2022-01-16 21:15:12
ほえほえ@スプシマン @hoehoe1234

@KotorinChunChun ちゅんさんの記事もみたけど、・・・・おしかった!ですねwww。いや、ほんとおしかったw。

2022-01-16 21:16:06
ちゅん🐤 @KotorinChunChun

@hoehoe1234 ブログにはコード内けど、Gistではちゃんと使ってるんやで・・・gist.github.com/KotorinChunChu…

2022-01-16 21:16:44
ほえほえ@スプシマン @hoehoe1234

多値展開は tk_unpack(シーケンス,値1, 値2・・・・値n)というのをつくっているのですが、やはり tkUnpack(a,b,c) = シーケンスを返す関数() がエレガントにかんじますね。 unpck()としたいのですが、規約なのでtkをつけてますw。

2022-01-16 21:19:31