- 他の人が作ったマクロを見たら、withというのがあったんだけど、これって何?
- withの使い方・書き方を知りたい
このようなお悩みをお持ちですか?
この記事を読むことで、下記のことがわかります。
- withの概要を知れる
- withの使い方・書き方を学べる
- withを使うメリットや注意点がわかる
VBAマクロ歴3年の私が、できるだけわかりやすく解説いたします。
※わかりやすさを重視しております。厳密には解釈が異なる場合がありますことをご了承ください。
VBAマクロのwithとは?
with(withステートメント)は、簡単に言うと省略を行う構文です。
たとえば、下記のような処理が必要になったとき、どのような構文にしますか?
- B2セルの文字を太字にする
- B2セルの文字を斜体にする
- B2セルの文字に下線を引く
- B2セルの文字色を赤にする
- B2セルの背景色を黄色にする
普通なら下記のような構文になるかと思います。
Range("B2").Font.Bold = True
Range("B2").Font.Italic = True
Range("B2").Font.Underline = True
Range("B2").Font.Color = RGB(255, 0, 0)
Range("B2").Interior.Color = RGB(255, 255, 0)
なにやら同じような記述が多いですね…。
withを使った場合の構文が下記です。
With Range("B2")
.Font.Bold = True
.Font.Italic = True
.Font.Underline = True
.Font.Color = RGB(255, 0, 0)
.Interior.Color = RGB(255, 255, 0)
End With
各文にあった「Range(“B2”)」が省略されてスッキリまとまりました。
処理内容はどちらも同じですが、withを使った方が見やすく、わかりやすいですよね。
これがwithステートメントの効果です。
withの概要がわかったところで、withの使い方・書き方を詳しく見ていきましょう。
withの使い方・書き方
前項で軽く紹介しましたが、下記の構文をwithを使って省略する方法を解説いたします。
Range("B2").Font.Bold = True
Range("B2").Font.Italic = True
Range("B2").Font.Underline = True
Range("B2").Font.Color = RGB(255, 0, 0)
Range("B2").Interior.Color = RGB(255, 255, 0)
プロシージャの作成
まずはプロシージャを作成しましょう。
With Range("B2")
End With
マクロを作り始めるときや、For文・If文を作るときと同じです。
withの後ろは、処理対象のオブジェクトを記述します。
今回はB2セルにいろいろな書式を設定したいため、「Range(“B2”)」としています。
処理内容を記述
プロシージャの作成が終わったら、2行目に処理内容を記述していきます。
書き方はいたってシンプルです。
本来なら、「Range(“B2”).Font.Bold = True」と書くところですが、
「Range(“B2”)」はすでに1行目で書いていますので、残りの「.Font.Bold = True」だけを書きます。
With Range("B2")
.Font.Bold = True
End With
For文やIf文のように字下げをすることで、よりわかりやすくなります。
With Range("B2")
.Font.Bold = True
End With
【注意点】
今回の場合は、先頭の「.(ドット)」を書き忘れないようにしましょう。
残りの処理も同様に記述したら完成です。
With Range("B2")
.Font.Bold = True
.Font.Italic = True
.Font.Underline = True
.Font.Color = RGB(255, 0, 0)
.Interior.Color = RGB(255, 255, 0)
End With
あくまでもこれらの処理は「B2セル」に適用されます。
同じ処理を「C2セル」にも適用したい場合は、「Range(“B2:C2”)」と記述するか、For文を使ってください。
【補足】
Range("B2").Font.Bold = True
Range("B2").Font.Italic = True
Range("B2").Font.Underline = True
Range("B2").Font.Color = RGB(255, 0, 0)
上記コードでは、すべての行で「Range(“B2”).Font」までが同じですので、下記のように「.Font」までを省略することができます。
With Range("B2").Font
.Bold = True
.Italic = True
.Underline = True
.Color = RGB(255, 0, 0)
End With
withの使い方、書き方がわかったところで、withを使うメリットや注意点を見ていきましょう。
withを使うメリット・注意点
まずはwithを使うメリットから見ていきましょう。
withを使うメリット
主なメリットは以下の3つです。
- コードの簡略化
- 処理速度の向上
- メンテナンス性の向上
「VBAマクロのwithとは?」で比較したとおり、withを使うことでコードを簡略化することができます。
オブジェクト名の記述を省略できるため、コードがすっきりし、読みやすくなります。
また、オブジェクトを何度も参照する場合、その都度エクセルがオブジェクトを評価するため、処理速度が遅くなることがあります。
withを使うことで、オブジェクトの参照回数が減るため、若干のパフォーマンス向上が期待できます。
さらにwithを使うことで、マクロの編集や修正にもメリットが生まれます。
オブジェクト名を一箇所で定義するため、マクロの修正が容易になります。
withを使う場合の注意点
withを使う場合の注意点や、できればやらない方がいいことを紹介いたします。
- withの中で別のオブジェクトに切り替えない
- ネストしすぎない
- withを使いすぎない
withは特定のオブジェクト(セルなど)に対して連続した指令を与えるものです。
たとえば下記のように、withの中で別のオブジェクトに切り替えてしまうと、意図しない動作をすることがあります。
With Range("B2")
.Font.Bold = True
ActiveCell.Font.Italic = True '← withのオブジェクト(B2)とは異なる
End With
上記のコード3行目は、アクティブセルに指令を与えているため、withのオブジェクトである「B2」以外が処理される場合があります。
また、withを使う時はネストしすぎないようにしましょう。
ネストとは入れ子という意味で、わかりやすく言うと「with」の中に「with」を入れるということです。
With Worksheets("Sheet1")
With .Range("B2")
.Font.Bold = True
.Font.Italic = True
End With
End With
ネストしすぎることで、どのオブジェクトを参照しているのかがわかりにくくなります。
今回の場合は下記のように書き換えましょう。
With Worksheets("Sheet1").Range("B2")
.Font.Bold = True
.Font.Italic = True
End With
withを使いすぎるのも考え物です。
短い処理ならwithを使わない方がわかりやすくなることもあります。
Range("B2").Font.Bold = True
Range("B2").Font.Italic = True
他人が見てもわかりやすくなるようなマクロを作りましょう。
最後に
withステートメントの使い方やメリット・注意点を解説いたしました。
当ブログでは、VBAマクロやPythonなど、時間を生み出すプログラミング術を公開しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。
最後までお読みいただき、ありがとうございました。がんばってください!