TPL_ISIS_TOOLBAR

エクセルのマクロをすっきりさせるwithステートメント

エクセルマクロにおけるWithステートメントとは、オブジェクト名を省略するためにしばしば用いられます。

Withステートメント自体は必須の文法ではなく、Withを使わないで記述しても構文的にエラーになることはありません。

しかし、Withを使わない記述はコード量が増え読みにくく、変更時にも手間が掛かる欠点があります。

Withステートメントの記述方法

With オブジェクト名
End With

WithからEnd Withで囲まれる区間において、「.」で始まる記述は、全てWithの後のオブジェクトのプロパティやメソッドとして扱われます。

Withステートメントの記述例

例えば、EXCELのVBAで最も有名なRangeオブジェクトを例にしてみましょう。

With Range("A1")
 MsgBox .Value
 MsgBox .Address
End With

このマクロを実行すると、セルA1の値とセルA1のアドレスがメッセージボックスで表示されます。

これをWithステートメント無しで書くと次のようになります。

MsgBox Range("A1").Value
MsgBox Range("A1").Address

むしろ行数が2行で済むので、こちらの方が良いのでは?と思うのも当然ですよね。

しかし極端にいえば、Withステートメントの間に書く行が100行だったらどうするでしょう?

「Range("A1")」と100回書くのと、Withを使って1回書くのではどちらの手間が掛かるか一目瞭然ですよね。

また、Range("A1")が、Range("B1")になった場合、Withを使わなければ全ての「A1」を「B1」に変えなくてはなりません。

更にRange型の変数になったら…と、さまざまな変更に対して保守性を高めるのがWithステートメントを使用する理由です。

Withステートメントのネスト

Withステートメントはネスト(入れ子)にすることもできます。

次の例を見てみましょう。

With Range("A1") MsgBox .Value
 MsgBox .Address
 With .Font
  .Bold = True
  .Italic = True
 End With
End With

Withの中にWithがもう1回登場しています。

With .Fontとは、With Range("A1").Fontと同じ意味になりますので、Withステートメント無しで書くと次のようになります。

MsgBox Range("A1").Value
MsgBox Range("A1").Address
Range("A1").Font.Bold = True
Range("A1").Font.Italic = True

これでもまだWithステートメントを使わない方が行数が少なくて済みます。

withステートメントはマクロを見やすくしミスを減らします

しかし、気付いているでしょうか?Withを使ったときの方が、一行が短く済んでいますよね。

階層の深いプロパティやメソッドを呼び出すときに、一行一行全てを記述していくのは非常に非効率ですし間違いも増えます。

Withステートメントの使用は、日本語で主語を決めて話すのとよく似ています。

「あなたの趣味は何で、好きな食べ物は何で、誕生日はいつですか?」と話すところを、

「あなたの趣味は何で、あなたの好きな食べ物は何で、あなたの誕生日はいつですか?」と聞く人はあまりいませんし、くどいですよね。

「あなたの」と一度いったら以降は「あなた」について聞いているのと誰もが想定します。

同じように、Withステートメントを使うことで、すっきりとしたコーディングができるので積極的に利用していきましょう。