VBA条件式を短絡評価する

2
リンク エクセルの神髄 Select Caseでの短絡評価(ショートサーキット)の使い方|VBA技術解説 VBAには、AndやOrの短絡評価(ショートサーキット)がありません。プログラミング言語によりますが、&,|これらに対しての&&,||これらが短絡評価です。VB.Netなら、AndAlso,OrElseこれらが短絡評価になります。
ほえほえ@スプシマン @hoehoe1234

短絡評価についてどのような代替え構造が可能化を検討。よい案があればこのツイのスレッドにコードをぶら下げてみてください。まずはうまく行かない基本形。短絡演算子であれば機能しますがVBAではうまくいきません。 pic.twitter.com/6tMJXuTjSK

2021-12-25 23:08:04
拡大
ほえほえ@スプシマン @hoehoe1234

条件分岐2。ループは4パターンで回るので、イミデトウインドウには4回出力結果がされます。1:3に分割されていますので結果は正しいですが、コードにコピペが発生しています(赤下線が2回でてきている)。 pic.twitter.com/SlSJi9A5HA

2021-12-25 23:19:15
拡大
ほえほえ@スプシマン @hoehoe1234

条件分岐4。gotoを使用する。gotoなのでパターンループを1パターンで終了してしまっていますが制御構造自体は正しいです。 pic.twitter.com/EuLpsLPrxt

2021-12-25 23:30:22
拡大
ほえほえ@スプシマン @hoehoe1234

条件分岐5。補助変数を利用する。VBAのif文の特例を利用して補助変数cを簡潔に設定できます。この形式が利用できる場合は良い解決策になると思います。 pic.twitter.com/LUAcxPvwnd

2021-12-25 23:40:30
拡大
ほえほえ@スプシマン @hoehoe1234

条件分岐6。gotoを利用して制御構造に割り込みます。みてくれはいまいちですがスクリプト言語の特性を生かした面白い構造だと思います。 pic.twitter.com/orgUoh8Z2g

2021-12-25 23:44:21
拡大
ほえほえ@スプシマン @hoehoe1234

条件分岐7。select文ではcase句の評価が、短絡評価で行われるのでそれを利用します。 pic.twitter.com/t3XAQQjr7d

2021-12-26 00:01:36
拡大
ほえほえ@スプシマン @hoehoe1234

条件分岐8。条件分岐7の条件を逆にしています。(風柳さんより) pic.twitter.com/n40f8LFpdk

2021-12-26 00:13:15
拡大
ほえほえ@スプシマン @hoehoe1234

条件分岐9。select文の亜流。select文を書くときの条件の変換(andからor条件への変換)の説明を加えました。 pic.twitter.com/O640uFTBo8

2021-12-26 00:29:28
拡大
ほえほえ@スプシマン @hoehoe1234

select文での短絡評価については、こちらの記事を参考にしてください。いつもながら素晴らしい記事だと思います。 excel-ubara.com/excelvba4/EXCE…

2021-12-26 00:30:26
ほえほえ@スプシマン @hoehoe1234

条件分岐10。アセンブラ的なgotoの使用。ミーシ的な切り取り。 pic.twitter.com/oq8Ii0Nq6N

2021-12-26 00:37:52
拡大
ほえほえ@スプシマン @hoehoe1234

現時点で思いつくのは以上のとおりです。これら以外にも面白そうな制御構造、エレガントな制御構造があればコメントお願いします。

2021-12-26 00:42:19
ほえほえ@スプシマン @hoehoe1234

条件分岐パターン1は短絡評価が可能である場合の書き方、条件分岐パターン2はコピペが発生するパターンなので実際に条件分岐パターン1の代替となる案はパターン3以降になります。どのパターン(書き方)がわかりやすいでしょうか?ご意見などありましたらコメントお願いします。

2021-12-26 00:44:55
ほえほえ@スプシマン @hoehoe1234

やはりVBAでの1:3分割は補助変数を入れるのがベストなんだろうか? c = false if a then if b then c = true if c then  ・・・ else  ・・・ end if gosubを使うよりもこちらのほうがエレガントのように思う。以後、こちらを使うことにしよう。他の条件、他の分岐もこの応用でいけますね。

2021-12-26 21:48:56
ほえほえ@スプシマン @hoehoe1234

or分割は a or b -> not not(a or b) not ((not a) and (not b)) ですので、 c = true if not a then if not b then c = false if not c then  ・・・1 else  ・・・2 endi となります。

2021-12-26 21:53:09
ほえほえ@スプシマン @hoehoe1234

うえの式、まちがえてますね。すみません。 c = false ①if not a then if not b then c = true ②if not c then ですね。 ①と②の2行で not (not a) and (not b)) を表しています。

2021-12-26 21:57:12
ほえほえ@スプシマン @hoehoe1234

cの意味を逆転させると c = true if not a then if not b then c = false if c then と書けますが、a and bの展開型が見えにくいので上に書いたようにa and bの展開型であることがわかるように書いたほうが良いと思います。

2021-12-26 22:00:31
ほえほえ@スプシマン @hoehoe1234

どうしてorの場合はまどろこしくなるかといえば、if文の連鎖は、条件式をandでつないでいく効果ですので、orは直接的には表現できないのでド・モルガン展開してorをandに直すからなんですね。このあたりは Rem 補助変数cを使ってa or bの短絡演算を代替え とでもコメント入れとけばよいでしょうか?

2021-12-26 22:03:11
ほえほえ@スプシマン @hoehoe1234

ド・モルガン展開を覚えてなくてもaとbのベン図を都度かけば自分で式は導出できますが、これは掛け算みたいなもので、かつ、簡単なのでもう暗記でいいと思います。ただし、少しコツがあります。

2021-12-26 22:04:29
ほえほえ@スプシマン @hoehoe1234

①not(a and b) ->not a or not b ②not(a or b)->not a and not b なんですが、notを付けているので理論が逆転しています。直接使うためには ③a and b-> not not(a and b)->not (not a or not b) ④a or b->not not(a or b)->not(not a and not b) とプログラムで直接使える形で覚えたほうが

2021-12-26 22:07:05
ほえほえ@スプシマン @hoehoe1234

よいとおもいます。そしてif構文を利用して、外側のnotは ⑤if not (条件式) と書いてもいいですし、 ⑥else節に該当する処理をもって行く でもいいと思います。ワイは⑤推奨ですが。

2021-12-26 22:08:55
ほえほえ@スプシマン @hoehoe1234

そして内側の式 not a or not b とか not a or not b が、aとかbに否定演算子が使われていると二重否定になり、結果、肯定形になり式がシンプルになります。 ここまでは基本なのでしっかり暗記してくと制御構造が正しく、簡潔に書けるようになります。

2021-12-26 22:10:27
ほえほえ@スプシマン @hoehoe1234

なやましいのはコメントですが、これは Rem a and bの短絡評価代用のため式を展開 Rem a and b->not not(a and b)としてド・モルガン展開 などと書いておけばよいでしょうか?これでわからなければ読むほうが悪いとは思いますが一概にはそう言えず、まさに微妙なラインだと思います。

2021-12-26 22:12:53
ほえほえ@スプシマン @hoehoe1234

そのようなところまで考察すると、結局、 Rem 短絡評価のためにgosubを利用 if a then if b then gosub 処理1 else gosub 処理2 else gosub 処理2 endif のほうが遥かにわかりやすいのでは?というのが結論です。どうでしょうか?

2021-12-26 22:14:30