目的の行以外を非表示にする方法

目的の行以外を、マクロで非表示にする方法を考えてみました。
例えばA~L列までのうち、B列とE列とI列だけを残し、他の列を非表示にしたい
場合について。
マクロの記録などを用いると簡単に、このようなコードを書くことが出来ます。

Sub ColumnHide()
    Range("A:A,C:D,F:H,J:L").EntireColumn.Hidden = True
End Sub

これはこれで良いのですが、個人的には不満があります。なぜならこのコードは、
残したくない列を明示しているため、どの列を残したいかをコードから直接読み取る
ことが出来ないからです。

そこで、このように変更してみました。

Sub ColumnHide()
    Dim i   As Long
    Range("B:B,E:E,I:I").EntireColumn.Hidden = True
    For i = 1 To 12
        Columns(i).Hidden = Not Columns(i).Hidden
    Next i
End Sub

変更後の場合、まず一旦、残しておきたい列を隠します。欲しい結果と正反対の
状態を作るわけです。そして次に、対象範囲の列全てについて、表示/非表示の
状態を反転させます。

 Columns(i).Hidden = Not Columns(i).Hidden

Columns(i).Hiddenは True か False の二つしかありませんから、頭に Not を付ける
ことで、現状の正反対の結果を得ることが出来るわけです。

このようにして、目的の列をコード内で確認しつつ、欲しい結果を得ることができ
ました。ところで、同じ理屈で言えば、以下のコードでもOKです。

Sub ColumnHide()
    Range("A:L").EntireColumn.Hidden = True
    Range("B:B,E:E,I:I").EntireColumn.Hidden = False
End Sub

先ほどのコードでは、既に非表示の列まで、強制的に掘り起こされてしまいます。
コード内で直感的に確認できるという点においては、こちらの方が良いかもしれ
ませんが、今回は Not による状態の反転を紹介したかったので、大目に見ていた
だければ幸いです。

参考まで。