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

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

セルの参照式  パス[ブック]シート!セル を解析結合するVBA関数を作ったことある人いるかな? テストケースがこれで足りてるのかどうか・・・。 twitter.com/KotorinChunChu… pic.twitter.com/4MgPpoS4oy

2019-10-03 17:55:18
ちゅん🐥えくせるちゅんちゅん @KotorinChunChun

Function SplitFormulaPathBookSheetCell( formula ) この、ネーミングセンスよ・・・。 一体この関数は何をするものでしょう? #VBA #Excel

2019-10-03 16:44:54
拡大
ちゅん🐤 @KotorinChunChun

これの戻り値をどうするか悩むわ。 byref四つにするか、配列にするか。

2019-10-03 19:38:13
ほえほえ@スプシマン @hoehoe1234

VBAで多値の返し方は主にどの方式を採用してますか?ワイは配列を多用してます。 また、ほかに良い方法があればコメントでお願いします。

2020-02-14 15:23:40
Excel VBA Diary (ENOWA Quality Lab.) @excelvba_diary

@hoehoe1234 選択が難しい質問(^^; ケースバイケースでユーザー定義とクラスを使い分けています。配列を使うケースもありますが限定的です。

2020-02-14 18:19:53
いみひと @nukie_53

@hoehoe1234 .NETの影響で`Try~`で返り値Bool&引数返しはよくやります。 ごく簡単な物であれば、Scripting.Dictionaryで返す場合もあります。

2020-02-14 18:34:11
いみひと @nukie_53

@hoehoe1234 以前Variant型配列を薄くラップしたTupleっぽいものを作ろうとしたことがありますが、作りかけで放置されています… github.com/imihito/vba_tu… Tuple.Create(a,b)でインスタンス tpl.Assgin(変数)で分解までは作ってありますが Equalsを実装しようとして止まっている感じですね…

2020-02-14 18:40:19
としじ @toshi81350036

文字列で返してから呼び出し側でデリミタで区切る、てのをむかーし書いたコードに見つけました。3日くらい前の話です。 ちょっと恥ずかしくなっちゃったよねっ!笑 twitter.com/hoehoe1234/sta…

2020-02-14 20:17:39
ちゅん🐤 @KotorinChunChun

@hoehoe1234 以前、同様のアンケートを出して、こうなりました。 twitter.com/KotorinChunChu… 選択肢が足りないのがツライトコ

2020-02-14 20:34:59
ちゅん🐤 @KotorinChunChun

@hoehoe1234 Array:要素毎の意味が分からないのでEnumが欲しくなるり結局遠くなる。又、仕様変更に弱い String:Arrayと同様 型に制限 ByRef:呼び出し元に変数多発 Type:宣言が遠いので気持ち悪い Class:モジュール多発。つらたん Dictionary:良い感じだがキーがリテラルに。ドキュメント大事(まあ他もそうだけど)

2020-02-14 20:47:35
ただし @wOuf946BHMOMBic

VBAなら、配列またはdictionaryかと思ったけど、functionは1つの戻り値にしてforで回してるケースもあるなーと twitter.com/hoehoe1234/sta…

2020-02-14 20:54:26
ちゅん🐤 @KotorinChunChun

@excelvba_diary @hoehoe1234 恐縮です。 どれもデメリットがあって、選びきれないんですよね。 ・仕様変更はありうるのか? ・要素数は? ・関数の利用頻度・理解度は? ・どんな使われ方が想定される? とかで、なんとな~く使い分けですね。 私はByRefが多め、必要ならClass。 でも書いててDictionaryが無難な気がしてきました

2020-02-14 21:10:16
Excel VBA Diary (ENOWA Quality Lab.) @excelvba_diary

@KotorinChunChun @hoehoe1234 そうですね。 配列はインデックスに意味を持たせることになって不安になります。そこでEnumを使うのですが、これまた使い勝手がよくない。Typeに至ってはスコープに不満。行き着く先がクラス。これも1モジュール1クラスの骨折れ仕様。 どれも我慢比べです。

2020-02-14 21:19:24
いみひと @nukie_53

@hoehoe1234 そういえばDictionaryの延長でADODB.Recordも手ではあるのですかね。 型を明示できるのがDictionaryに比べたメリット。

2020-02-14 22:43:38
ほえほえ@スプシマン @hoehoe1234

@nukie_53 それがあるんですよね。少々重量級すぎる感じがしますが。このあたりは調べてないので時間あるときに調査せなあかんとおもってますw。

2020-02-14 23:57:24
はけた@できるExcel2021 @excelspeedup

@KotorinChunChun >洗練されるにつれて、頻度が減る 私もそう思います。 逆に言うと、VBAの初心者さんであれば、イミディエイトウィンドウを使うべき機会も多いのかもしれませんね。

2020-02-14 23:58:02
ほえほえ@スプシマン @hoehoe1234

@Umaremin こんにちは。コレクションもいいですよね。ワイ的には予想よりディクショナリがおおいイメージです。どちらにしろこの変の見解とメリット/デメリットはまとめようかとおもっています。

2020-02-14 23:58:45
ほえほえ@スプシマン @hoehoe1234

@excelvba_diary @KotorinChunChun まさにw。Enumが「その場」にかければ(いわば、関数の一部的にかければ)いいのですが各場所が決まっているのがいたいですよね。Typeはあまりに制限がおおいし、クラスは1クラス1モジュールの呪いがw。その中でも論理的にグルーピングできますので記事にしてみます。

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

@KotorinChunChun @excelvba_diary このあたりはワイもいろいろ考えてることがあって記事に書こうかと。参照型引数は関数を変更すると関数のシグネチャが変わるのが困るんですよね。既存のソースを変更せずに関数インタフェースを進化させることができなくなります。(ただoptionalという逃げ道がありますが)。

2020-02-15 00:01:33
はけた@できるExcel2021 @excelspeedup

@KotorinChunChun 私は、Dictionaryは、打ち間違えリスクが高くて怖いので、真っ先に候補から外しますね・・。 ただ、Dictionaryのほうが扱いやすい場面もあるので、ケースバイケース(+好み)なんでしょうね。

2020-02-15 00:03:40
ほえほえ@スプシマン @hoehoe1234

@KotorinChunChun これ、まとめるとおもいろいんですよね。配列とディクショナリは根本的には同じですよね。Enumとするかリテラルとするかは検討の次元とスコープが同じなので。ADOの識別子ベース(Pythonでいう名前付きタプル)がベストですがその変もあwせて調査したいと思います。

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

@hoehoe1234 @excelvba_diary もう一つEnumの不便なところがあります。 配列の要素には、インテリセンスの絞り込みが発動しません。 従って、戻り値の配列をEnumで振り分けをすれば良い事は分かってても、Enumを宣言した時の名前が分からなくて、右往左往します。するときが、よくあります。 命名規則を決めれば良い話ですが...

2020-02-15 00:08:11
ほえほえ@スプシマン @hoehoe1234

@nukie_53 こんばんは。ワイもちょっとまえにバリアントの8バイトを利用して整数のタプルを作ったりしてましたが結局、「なんにつかうのか?」みたいな自問自答で配列返しになりました。でもこういう検討(設計)ができるのもVBAならではたのしですよね。

2020-02-15 00:09:53
としじ @toshi81350036

@hoehoe1234 結局は配列で返すのがコスパ良いですよねー。 Class作ってコレクションに格納して返却するとかも良いのかも?とふと思いました!

2020-02-15 00:12:25