VBAにはCのような開始位置と終了位置を明示して広範囲をコメントアウトを行う記法が存在しない。
それでも広範囲コメントアウトを行いたい人のために、私はディレクティブの活用を提案したい。
VBAのコメントアウトについて
まずはVBAで使える二種類のコメントを紹介。
VBAにはシングルクォーテーション(アポストロフィと呼ぶべきか?)を使ったコメントアウトと
'コメント
docs.microsoft.com - Rem ステートメントを使ったコメントアウトがある。
Rem コメント
複数行コメントアウトは「コメントブロック」機能で出来る。
単に「複数行をまとめてコメントアウトしたい」というだけであれば、VBEにそういう機能がある。
「編集」ツールバーを表示し、範囲を選択してから「コメント ブロック」を実行すると、シングルクォーテーションが全ての行の先頭に挿入されてコメントアウトされる。
逆に「非コメント ブロック」を実行すれば、先頭のシングルクォーテーションが一段取り除かれる。
一方でRem
は対象外である。この機能でRem
を付け足したり取り除くことは出来ない。
コメントブロックはショートカットキー登録できる。
これについては過去に記事を書いているので下記を参照願いたい。
ボタンを押すのが面倒だと思った私は、ショートカットキーを登録したり右クリックメニューに追加したりして対応している。
今では無いと生きていけない体になってしまった。
個人的にはAlt + 1
とAlt + 2
を推したい。
コメントは折り返しできる。
普通のステートメントと同じように、実はコメントも_(アンダーバー)
で折り返す事ができる。
これはシングルクォーテーションでもRem
でも変わらない。
'コメント _ 二行目のコメント _ 三行目のコメント Rem コメント _ 二行目のコメント _ 三行目のコメント
とは言え、私は実践でこの書き方をしたことはない。
Remは行末に使えない?
シングルクォーテーションの場合は、何らかのプログラムの後にコメントを付け足す事ができるが、Rem
でそのようなことはできない。
Sub func() 'コンパイル可 Sub func() Rem コンパイル不可
これはRem
がステートメントであることに関係しているのだと思う。
だから、:(コロン)
を使ってマルチステートメントのように記述すれば、Rem
でも行末にコメントを残す事ができる。
Sub func(): Rem コンパイル可
とは言え、私は実践でこの書き方をしたことはない。
Remはシングルクォーテーションより入力が早い?
文字数が多いので一見Rem
の方が入力が大変そうに感じるかもしれない。
実際に使ってみると、R・E・Mというスペルは流れるように打てるので、シングルクォーテーションに比べて特に遅いということはない。
むしろ私の場合は早いくらいだったりする。
ただし、前述の通りRem
はVBEのコメントブロック機能が使えないため、後から複数行をまとめてコメントアウトしたい場合には不利だと言える。
せめてVBEにマルチカーソル、一括入力があれば・・・。
(仕方ないので面倒ですがコメントブロックの後に置換を使ってます)
ステートメント内でのコメントアウトはできない。
後述の方法を使ったとしても、ステートメント内でのコメントアウトはできない。
いわゆる配列変数を作るような場面において、要素ごとに解説を書きたくても書けないのである。
Sub TestComment() Dim v v = Array( _ "aaaaaaa", _ 'これはA "bbbbbbb", _ 'これはB "ccccccc" _ 'これはC ) End Sub
クラスを多用したりすると書きたい時があるので、少し残念である。
擬似的に広範囲コメントアウトを作成
さて、本題だ。
複数行に渡る広範囲のコメントを「開始位置と終了位置だけを指定して」コメントアウトする方法を紹介する。
※決してこの方法を利用を推奨しているわけではない。
※個人が利用するのは構わないが、組織で使うソースコードでは注意するように。
開発のためにテストデータや何かの解説をソースコード上に置いておきたい時がある。
しかし、そうなるとコメントブロックで全ての行にシングルクォーテーションが付与されてしまい、仮置きしたデータをコピーしても使えない。
Cとか多くの言語には範囲指定するためのコメントアウト/* ~ */
のような構文があるがVBAには無いのである。
そんなときは #If... Then...#End If
ディレクティブによる擬似コメントを作っては如何だろうか。
'広域コメント この中には何を書いてもコンパイルが通る #If COMMENT_OUT Then Sub func() 'コンパイル可 Sub func() Rem コンパイル不可 Sub func(): Rem コンパイル可 #End If
しかも、ディレクティブは入れ子にすることができる。
入れ子は適切に行わないとコンパイルエラーとなるので、/* ~ */
より安全である。
たとえばCに於いて、下記のコメント2
のようにコメントアウトされた範囲を囲い込むようにコメントアウトしたい時、*/
でコメントアウトが強制終了されてしまうため、コメント3
がコメントアウトできない。
コメントアウトする範囲が広ければ、画面外となるためすぐには気が付かない。一体どうすれば良いのやら。
/* コメント1 /* コメント2 */ //ココでコメントは強制終了 コメント3 */ //ココでコメントは強制終了
対してディレクティブなら意図した終了位置まで無効化できる。
#If COMMENT_OUT Then コメント1 #If COMMENT_OUT Then コメント2 #End If コメント3 #End If
だから私は(Cでも)/* ~ */
を使うくらいなら、ディレクティブの方が好きだ。
#If... Then...#End If
ディレクティブの問題点を挙げるとすると
- コメントの色に変化しない。
- 誤解する恐れがある。
- 入力が少し面倒
- DIFFした時に変更箇所として検知されない。
と言ったところか。
まとめ
擬似的なのも含めて、コメントアウトは
- シングルクォーテーション
Rem
ステートメント#If... Then...#End If
ディレクティブ
の3つの方法がある。
私は最近
- プログラムのコメントはシングルクォーテーション
- ドキュメント部分は
Rem
ステートメント - コピペして使いたい複数行テストデータはディレクティブ
と使い分けている。
もし使えると思った人は是非体験していただければと思う。
ただし、組織で使うときは皆の理解を得て使うように。
途中で紹介したコメントブロックのショートカットの割り当ては下記を参照
続き?VBAのコメントの書き方の試行錯誤
以上
何か御座いましたらコメント欄、またはTwitterからどうぞ♪
それではまた来週♪ ちゅんちゅん(・8・)