VBEを使っていて、定数の入力時に便利な機能があります。
自動メンバー表示です。
フォントの色など覚えるのが面倒な値を自動的に表示してくれるので、上下のカーソル移動+[タブ]キーで定数を選択すればいいので入力が簡単+正確になります。
上記の通り、プロパティの値の場合には、「=」を入力すると、候補が自動的に表示されます。
実はこの候補が自動的に現れる場合と現れない場合とがあるのですが、気がついていましたか?
メンバーが表示されない場合
あるメソッドでは、使える引数の候補が自動的に表示されます。
しかし、あるメソッドでは、候補が表示されないので自分で打ち込むしかないのです。
たとえば、私はRangeオブジェクトやSelectonオブジェクトが選択しているものを解除するために、Collapseメソッドをよく使います。
このときに使える引数が1種類(Direction)あり、その定数は2種類(wdCollapseEnd または wdCollapseStart)あるのですが、、、、
.Collapse と入力した後に、引数としてDirectionを入力することが表示されるのですが、候補を選ぶことができません。何も設定しない場合では、デフォルト値のwdCollapseStartとなります。
しかし、私はオブジェクトの後ろ側に解除したい(定数をwdCollapseEndにしたい)ので、しょうがなくいつも定数を手入力していました。
これと同じように、ファイルを閉じるCloseメソッドでも同じような挙動になります。
SaveChanges の引数には3種類の定数(wdDoNotSaveChanges、wdPromptToSaveChanges、wdSaveChanges)が使えます。
これも設定しない場合にはデフォルト値であるwdPromptToSaveChangesが使われてしまいます。
これだと、「・・・に対する変更を保存しますか?」というメッセージが表示されてしまい都合が悪いので、保存する・しないをあらかじめ指定する必要があります。
なので、この引数も定数を手入力することになります。
私は、これらは必須ではない(角括弧で囲まれた引数は設定しなくてもいい項目です)ので候補が表示されないと思って特に疑問に思っていませんでした。
しかし、こういうことをしっかりつきつめて考えているMVPの方々がいらっしゃったのです!
なぜメンバーが表示されないのか
インストラクターのネタ帳の伊藤潔人さんの記事「ページ移動を行うWordマクロ
」において、GoToメソッドとGoToNextメソッドとの比較をして自動メンバー表示の違いが紹介されています。
メンバーが表示される場合、定数の型が定義されているのです。
定数の型が定義されていない場合(=Variant型の場合)には、どの値にもなりうるということですから、コンピューター側が候補を表示できないんですね。
納得。
では、なぜ、定数の型が定義されている場合とされていない場合があるのか?
これについての考察が次の記事です。
伊藤さんの問題提起を受けて、Microsoft MVP for Office System のきぬあささんが「[Word VBA]引数の型がVariantになっているのはなぜ?
」という記事にて、さらに深掘りをされました。
きぬあささんの記事では、WordBasicというかつてのWordで使われていたプログラミング言語との比較をした上で、以下の2点の場合にメソッドの引数で用いられる定数が自動的に表示されないようであると推測しています。
1. 昔から存在している。
2. 引数が必須ではない。
なるほど。
では、本当のところはどうなのか
候補が表示される仕組みはわかりました。また、その不統一に定義がなされている傾向もわかりました。
では、なぜこのような不統一な挙動になっているのでしょうか。どうせなら統一してもらいたい!というのがユーザーとしての正直な気持ちです。
wdCollapseEnd と毎回手入力するのはやっぱり手間です。もう覚えてしまいましたが。
そこで、海外のWord MVPに個別に問い合わせてみたのですが、はっきりした回答は得られませんでした。
やはり推測になってしまうのです。
あるMVPの方からの回答では、新しいものと古いものとの違いかも、という回答があり、きぬあささんが推測したようなことをおっしゃっています。
ただ、なぜ新しいものでは引数の型が定義されていて、古いものは定義がない(Variant型)のかということは理由がわかりません。
また、WordBasicとの整合を保つためなのかどうか、に関してもわからないままです。
コンピューター言語であるVBAは人間がルールを定義してます。なので、開発の意向や時代背景などによってもルールが変わりうると思います。
それだけに、何か理由があってこの挙動が不統一になったのか、何も考えていないが故に統一されていないのかは興味深いのですが、わからないままです。
というわけで、私はなんの情報も付加できずじまいですが(笑)、考察を終了します!
▼関連記事
ページ移動を行うWordマクロ
伊藤潔人さん
Cellsプロパティで自動メンバー表示されない理由
伊藤潔人さん
[Word VBA]引数の型がVariantになっているのはなぜ?
きぬあささん