t-hom’s diary

主にVBAネタを扱っているブログ…とも言えなくなってきたこの頃。

VBA入門記事 インデント徹底解説!

VBA初心者のコードを見ると、インデントが乱れていることが多い。
中・上級者にとって、インデントはあまりに自明のことで、それゆえに詳しく解説されることがない。せいぜい入門書の最初の頃にちょろっと「きちんとインデントしましょう」と書かれる程度である。

インデントが多少乱れていたとしても、プログラムの実行に影響はない。しかしインデントの乱れはコードの構造を把握しにくくさせてしまう。今回は初心者向けの記事として、インデントについて徹底解説してみたいと思う。

インデントとは

コードの構造を分かりやすくするためにタブやスペースなどの空白文字を左に詰めて字下げすることをいう。

何をインデントするか

VBAでは、原則として「開始」と「終了」でセットになった構文の、中身をインデントする。たとえば、Sub~End Sub、For~Next、Do~Loop等である。ただし、分岐命令のIfやSelectは少し勝手が異なるので注意。

実際にやってみよう。

まず全くインデントされていないサンプルコードを用意する。

Sub FizzBuzz()
For i = 1 To 100
If i Mod 15 = 0 Then
Debug.Print "FizzBuzz"
ElseIf i Mod 3 = 0 Then
Debug.Print "Fizz"
ElseIf i Mod 5 = 0 Then
Debug.Print "Buzz"
Else
Debug.Print i
End If
Next
End Sub

まず外側から見ていく。
最初に目につくのは、Sub FizzBuzz()が「開始」、End Subが「終了」である。だからその中身をインデントする。

Sub FizzBuzz()
    For i = 1 To 100
    If i Mod 15 = 0 Then
    Debug.Print "FizzBuzz"
    ElseIf i Mod 3 = 0 Then
    Debug.Print "Fizz"
    ElseIf i Mod 5 = 0 Then
    Debug.Print "Buzz"
    Else
    Debug.Print i
    End If
    Next
End Sub

次に、For i = 1 to 100が「開始」、Nextが「終了」とみなすことができるのでその中身をインデントする。

Sub FizzBuzz()
    For i = 1 To 100
        If i Mod 15 = 0 Then
        Debug.Print "FizzBuzz"
        ElseIf i Mod 3 = 0 Then
        Debug.Print "Fizz"
        ElseIf i Mod 5 = 0 Then
        Debug.Print "Buzz"
        Else
        Debug.Print i
        End If
    Next
End Sub

ここで条件分岐が登場する。If~End Ifまでと言ってしまうと、こんな風になってしまう。

Sub FizzBuzz()
    For i = 1 To 100
        If i Mod 15 = 0 Then
            Debug.Print "FizzBuzz"
            ElseIf i Mod 3 = 0 Then
            Debug.Print "Fizz"
            ElseIf i Mod 5 = 0 Then
            Debug.Print "Buzz"
            Else
            Debug.Print i
        End If
    Next
End Sub

しかし、これは間違い。

If文も中身をインデントするけれど、中身のとらえ方が違う。

たとえば日本語でIfの複数条件を書くと、こんなイメージになる。

もしAならば、
    〇〇しなさい
それ以外で、もしBならば、
    〇〇しなさい
それ以外で、もしCならば、
    〇〇しなさい
どれにも当てはまらないなら
    〇〇しなさい
以上

つまり「〇〇しなさい」という命令が中身なのであって、条件の提示は中身ではない。
話をIf文に戻すと、If・ElseIf・Else・End Ifでワンセットの構文ということである。

よって、正しいインデントは次のようになる。

Sub FizzBuzz()
    For i = 1 To 100
        If i Mod 15 = 0 Then
            Debug.Print "FizzBuzz"
        ElseIf i Mod 3 = 0 Then
            Debug.Print "Fizz"
        ElseIf i Mod 5 = 0 Then
            Debug.Print "Buzz"
        Else
            Debug.Print i
        End If
    Next
End Sub

何文字分インデントするか

VBエディタの規定では、スペース4つ分となっているので特に理由が無ければそのままで良い。
目的は、文の構造を目立たせて理解を助けることにあるので、あまりスペースが少なすぎると効果が薄い。多すぎるとコードが右に伸びてやっかいである。

インデントを綺麗に揃えるための操作方法

まず最初に覚えるべき操作

デフォルトではTabキーを押すとスペースが4つ入るので、Tabキーでインデントする。
スペースでちまちまやると時間がかかるしズレやすい。

インデントされた行でEnterキーを押すと、次の行がインデントされた状態で始まる。
このインデントを消すにはBackSpaceを1回だけ押せばよい。

最初から綺麗なインデントでコーディングする。

次のGIFアニメで書いているように、基本的には外から内に向かってコードを書いていく。そうすれば自動インデントも活かしやすい。
f:id:t-hom:20180226231805g:plain

それから、ForとNextを書き終わって中身を書き始める操作だが、まずNextにあるテキストカーソルを、矢印キーの↑でForの行に持っていき、そこでEndキーを押す。するとテキストカーソルが行末に飛ぶのでEnterで行を挿入し、Tabでインデントしている。
ちなみにEndの代わりにHomeを押すとテキストカーソルが行頭に飛ぶのでこちらも覚えておくと良い。

ネットで拾ったインデントされていないコードを綺麗にする。

まず前提知識として、ウェブサイトの掲示板などでは、その仕様上、投稿するとインデントが消えてしまうものがある。だから上級者もインデントしてないからインデントしなくても良いんだというのは勘違いである。

さて、インデントされていないコードを綺麗に編集したい場合どうするか。

とりあえず、マズイやり方がこちら。
f:id:t-hom:20180226232657g:plain

これは非常に面倒なうえに、ズレやすい方法である。
じゃあTabキーで1行ずつインデントしていくのかというと、それも違う。VBエディタでは、複数行のインデントを一度に変更する機能があるのでそちらを使う。

次のGIFアニメでは、ズレたインデントをまともなインデントに修正する一連の流れを紹介する。
f:id:t-hom:20180226233023g:plain

まず、コード上でドラッグ操作をして複数行選択し、Shiftを押しながらTabを複数回押すことで、完全にインデントを消すことができる。

次に、コードの構造にしたがって構文の内側を複数行選択し、Tabキーで一度に選択行すべてをスペース4つ分インデントする。
このテクニックを必要箇所に繰り返し適用して完成。ただし飛び地は複数選択できないのでDebug.Printのところは一つずつインデントするしかない。

インデントを綺麗に見せる設定

スペース4つ分のインデントだと開きすぎという方もいると思う。私はフォントをメイリオにしているので標準のゴシックとちがってインデントがかなり詰まって見える。スペース4つ分でちょうど良い。

ついでにそのあたりの設定を変更するための記事もご紹介。
thom.hateblo.jp

以上

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。