Excel(MS365): ファンクションの呼び出し記述が統一できない

VBAがExcelに搭載されたのが5.0のとき(日本では1994年に発売開始)なので、ざっと27年弱のおつき合いになるわけです。それ以前はExcelマクロというヤツが搭載されていました。

言語仕様の元となったのはVisual Basic(1991年に1.0発売開始、日本で発売されたのはこれのDOS版で19992年)で、VBEや内部的な実装もかなり似ている部分があります。
当時のパソコン開発環境としてはなかなか先進的なオブジェクト指向の概念を取り入れてみたりする一方で、Access BasicやExcelマクロなどとの下位互換性もある程度サポートするというよくばり設計だったため、今となってみればあまり洗練された言語仕様とは言えない、というかかなり泥臭い感じになっちゃっています。

なるべく読みやすく、再使用しやすく、記述を統一しようと日々努力してはいるのですが、頻繁に記述するので目につきやすく、しかもどうにも記述を統一できない代表例のひとつに「ファンクションの呼び出し記述」があります。

たとえば、「はい/いいえ」を選択させるメッセージボックスを表示させるときは

Dim ret As VbMsgBoxResult
ret = MsgBox("Body", vbYesNo, "Title")

などと書くわけですが、「OK」をクリックさせるだけ(なので戻り値を受ける必要がない)のメッセージボックスの場合は

MsgBox("Body", vbOKOnly, "Title")

と書くとエラーになります。こういう場合は

MsgBox "Body", vbOKOnly, "Title"

と引数をカッコで囲まないようにするか、

Call MsgBox("Body", vbOKOnly, "Title")

のようにCall文でファンクション呼び出しを明確にしてからMsgBoxをカッコ付きで書くかになってしまいます。

昔のBASICなどでは命令の実行にはLET、変数への値の代入にはSETを必ず書くという仕様のものもあったので、LET代わりにCallと書くのはまあおかしくはないのですが。一方で値代入のSETは仕様からなくなりオブジェクトへの参照代入時にのみ使われるようになったとか(おかげでビギナー研修やったりするとSETがつくパターンとつかないパターンの区別のつけ方で皆さん混乱します)、SETは不要にしちゃったけど代入の「=」と比較の「=」は同じ記述法のままなので一見どっちの意味の「=」なのかわかりにくいままで取り残されてしまったとか(C系では「=」と「==」で区別つけるようになっていますね)、もうぶれぶれ。

個人的には「ファンクションの引数はカッコでくくる」で統一したいのでガンバって「Call」を明記するよう心がけているんですが、原稿用のコードを「Call」つきで書いたら全部削除されてしまいました。
世の入門書を読むと、やっぱCallつきはほとんどありませんからね。カッコがついたりつかなかったりする方が私としては落ち着かないんですけど、まあ少数派でしたね。失敗失敗。


プロシージャ(ファンクションもサブも含めて)の記述法と言えばもうひとつ、引数の記述法も2種類あります。

MsgBox "Body", vbOKOnly, "Title"

と順に列挙する書き方と、

MsgBox prompt:="Body", Buttons:=vbOKOnly, Title:="Title"

と引数名を明記する書き方ですね。

前者は引数の順序が固定で、これは引数順を知っていれば目視しやすいですが、初見ではどの値が何に対しての引数かわかりにくいという特徴があります。

後者は引数名が明記されているので順序を変えても動作しますが、かわりにコードがやたら冗長となります。

自作のプロシージャの呼び出しを「引数名あり」で書くと引数名を変えた場合などの修正範囲が大きくなってしまうとか、昔のVBAはモジュールあたりの文字数の制限がけっこうキツめで大量に書いたために正常に動作しなくなってしまいモジュールを分けたり変数名の文字数を減らしたりなどけっこうキビシい思いをしてきました。

また当時のメジャーな言語系のほとんどは「カッコ囲み引数名なし」だったので「引数名あり」の記述法はダセぇ、という感覚もあり、避けていた覚えがあります。

後年、xml(一般への契機としてはhtml)がきっかけではないかと思うのですが、「タグに属性名を明記」という手法がきっかけで、「引数名あり」な記述法も市民権を得てきたように感じます。不要な(またはデフォルト値のままでよい)属性は省略可能、必要な属性だけを記述するというのもロジック的には理にかなっていると思いますし、そもそもxml自体に「冗長でもいいじゃん?」的な思想が見えますので、このへんはCPU高速化・メモリ容量増大とパソコンが進化してきたことからの恩恵ではありますね。

まあ今までの経緯から、ほとんどの入門書では「引数名なし」を採用していますし、既存の仕様がそうである以上、これからの情報も「引数名なし」がメジャーであり続けるだろうとは思いますが。

0 件のコメント :

コメントを投稿