既存のSubプロシージャを一部改修して、フラグありで呼び出した場合に特別な動きをするようにしました。
すでにボタンに登録済みのプロシージャだったので、省略可能な引数を指定しようと考えたのです。
後になって、メンテナンス性がよろしくないようにも思えてきました。
念のため、どういうことが起こっているのか備忘録です。
省略可能な引数
「Sub」でも「Function」でも、省略可能な引数を指定できます。
ルールがいろいろあります。詳細はMSDNで確認するとして、最低限覚えておきたいのは以下です。
- Optionalを指定したら、その後ろの引数もすべてOptionalを指定
実際に書いたコードのデフォルメは以下です。
Sub Proc01(Optional OptionFlag As Boolean = False) ・・・(中略)・・・ End Sub
という具合で、フラグの状態によってどうするかということを「中略」内に書いています。
指定がなければ、「False」として処理します。
「Optional」キーワード
指定する場所は、「ByVal」や「ByRef」よりも前です。
引数指定の最初ということです。
普段から、値渡しなのか参照渡しなのかは明記していませんので、いざ順番を調べてみると「あぁ」という感じでしたw
ちなみに、参照渡し(ByRef)がデフォルトです。
デフォルト値の指定方法
引数指定時には、いっしょにデフォルト値を指定できます。
そういうことですので、今回は引数指定のところで初期値を代入しています。
今回のように書いておくと、VBEでコードを書いていれば、マクロ名の後でカッコ「(」を開いたときに、デフォルト値が表示されます。便利です。
なお、バリアント型の関数にデフォルト値を指定しない場合は、IsMissingで値渡し状態を調べられます。
コードの見通しなどを考慮すると、この関数を使用した分岐はやめたほうがよいと思います。。
IsMissing 関数で使用可能なのはバリアント型のみです。その他のデータ型には既定の初期値が設定されているため、IsMissing 関数は、引数に対して値が渡されたかどうかにかかわらず False を返します。
デフォルト値を明示しなくても、Long型なら「0」や、Booleanなら「False」など、VBAの緩さが初期値を設定してくれます。
ただし、分かりやすくするためにも、初期値は明記しましょう。
ボタンへのマクロ登録
「フォーム コントロール」の「ボタン」を設置して、登録したマクロを実行させています。
ボタンを右クリックすると登録可能なマクロ(プロシージャ名)が一覧表示されるのですが、引数指定しているものは表示されません。
今回は、もともとボタンに登録済みのマクロを編集したので、この辺りで悩むことはありませんでした。
たまたま他のマクロを登録しようとしたら、今回編集したマクロが表示されていないことに気付きました。
少し焦りましたが、ちゃんと動いているので問題ありません。
ちなみに、マクロ名を直接書いてしまえば、引数ありのマクロも登録は可能です。
ただし、引数指定が必須のマクロは、実行時にエラーになります。
マクロ実行
マクロ登録と同様に、実行可能なマクロの候補一覧には表示されません。
そして、マクロ名を直接書いての実行は可能ですが、引数指定が必須のマクロは、省略不可のエラーになります。
まとめ
Excelマクロでは、省略可能な引数を「Optional」キーワードで指定できます。
特別な理由がなければ、引数の宣言部分にデフォルト値を記載しておいた方が、何かと便利です。
引数を含むマクロは登録対象や実行対象として表示されなくなるので、Callするマクロを作っておくと分かりやすいでしょう。
ご意見やご感想などお聞かせください! コメント機能です。