えくせるちゅんちゅん

ことりがエクセルをちゅんちゅんするブログ

VBAでの広域コメントアウトの代替案

VBAにはCのような開始位置と終了位置を明示して広範囲をコメントアウトを行う記法が存在しない。

それでも広範囲コメントアウトを行いたい人のために、私はディレクティブの活用を提案したい。

f:id:Kotori-ChunChun:20191027184058p:plain

f:id:Kotori-ChunChun:20191027183946p:plain


VBAコメントアウトについて

まずはVBAで使える二種類のコメントを紹介。


VBAにはシングルクォーテーション(アポストロフィと呼ぶべきか?)を使ったコメントアウト

'コメント


docs.microsoft.com - Rem ステートメントを使ったコメントアウトがある。

Rem コメント


複数行コメントアウトは「コメントブロック」機能で出来る。

単に「複数行をまとめてコメントアウトしたい」というだけであれば、VBEにそういう機能がある。

f:id:Kotori-ChunChun:20191027175203p:plain


「編集」ツールバーを表示し、範囲を選択してから「コメント ブロック」を実行すると、シングルクォーテーションが全ての行の先頭に挿入されてコメントアウトされる。

逆に「非コメント ブロック」を実行すれば、先頭のシングルクォーテーションが一段取り除かれる。

f:id:Kotori-ChunChun:20191027180142g:plain


一方でRemは対象外である。この機能でRemを付け足したり取り除くことは出来ない。

f:id:Kotori-ChunChun:20191027180223g:plain


コメントブロックはショートカットキー登録できる。

これについては過去に記事を書いているので下記を参照願いたい。

www.excel-chunchun.com

ボタンを押すのが面倒だと思った私は、ショートカットキーを登録したり右クリックメニューに追加したりして対応している。

今では無いと生きていけない体になってしまった。

個人的にはAlt + 1Alt + 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ステートメント
  • コピペして使いたい複数行テストデータはディレクティブ

と使い分けている。


もし使えると思った人は是非体験していただければと思う。

ただし、組織で使うときは皆の理解を得て使うように。


途中で紹介したコメントブロックのショートカットの割り当ては下記を参照

www.excel-chunchun.com


続き?VBAのコメントの書き方の試行錯誤

www.excel-chunchun.com

以上


何か御座いましたらコメント欄、またはTwitterからどうぞ♪

それではまた来週♪ ちゅんちゅん(・8・)