エクセルマクロ・VBA達人養成塾 小川です。
今日は、VBAのテクニカルな話。
[1] Applicationオブジェクトのプロパティを切り替えてから
[2] やりたい処理を実行し
[3] それからApplicationオブジェクトのプロパティ元に戻す
といった処理の流れでプログラムを書くことはよくあります。
全体の流れとしては、 [1] と [3] の処理はセットの中に、 [2] の処理が入っているわけです。
ここで、この手の処理の流れのプログラムを書くとき、メンテナンス性のために、
Application.ScreenUpdating = False/True で挟まれたコードを一段右にインデントして表示したくなることもあります。
つまり、以下の感じ。
[1]
[2]
[3]
例えば、僕の手元に、今こんなサンプルコードがあります。
1 2 3 4 5 6 7 8 9 10 | Sub SortAct() Application.ScreenUpdating = False '[1] Worksheets( "main" ).Range( "A" ).CurrentRegion.Sort _ Key1:=.Range( "F6" ), Order1:=xlAscending, _ Key2:=.Range( "G6" ), Order2:=xlAscending, _ Header:=xlYes '[2] Application.ScreenUpdating = True '[3] End Sub |
これの、 .Sort メソッドのところを一段インデントさせたい。
しかし、明示的な入れ子構造もないところで理由もなくインデントするのはナンセンス。
ということで、どうするか。
With Application … End With でくくってしまう、というのはいちおうありそうです。
こんな感じ↓。
1 2 3 4 5 6 7 8 9 10 11 12 | Sub SortAct_indent() With Application .ScreenUpdating = False '[1] Worksheets( "main" ).Range( "A" ).CurrentRegion.Sort _ Key1:=.Range( "F6" ), Order1:=xlAscending, _ Key2:=.Range( "G6" ), Order2:=xlAscending, _ Header:=xlYes '[2] .ScreenUpdating = True '[3] End With End Sub |
[2] の部分が長くつづくと、 [1] に対応する [3] を見つけるのがとても大変になります。
[3] のコードを入れるタイミングも逃しかねない。
ですが、このスタイルで書けば、いちおうそういう問題は起こりにくくなります。