Excelマクロでコードを簡潔に!Withステートメントの使い方と実例

ようこそ♪ささぽんのExcel教室へ。
マクロを書き始めて少し慣れてくると、
「もっとスッキリ書けないかな?」
「毎回同じオブジェクト名を書くの、ちょっと面倒…」
と感じること、ありませんか?
そんなときに覚えておきたいのが、With ステートメントです!
この記事では、Withを使うことでコードがどう見やすくなるのか、どう効率化できるのかを、実例とともにわかりやすくご紹介します。

この記事は以下のような方におすすめです!
・マクロの記述に慣れてきて、コードの整理や効率化を考え始めた方
・同じワークブックやシートに繰り返しアクセスするマクロを書いている方
・「誰かが読んでも分かりやすいコード」を目指したい方
このブログは「基礎からExcelマクロを学びたいと考えている方」や、
「独学での習得に壁を感じた方」に向けて、やさしく、わかりやすく、丁寧に解説しています。
読み終わるころにはきっと、
「Excelマクロって意外と簡単かも!」「もっとやってみたい!」と思えるはず。
一緒に楽しく学びながら、Excelマクロ使いを目指しましょう!
目次
1. Withステートメントとは?
Excelマクロを書けるようになってくると、同じオブジェクトに対して複数行に渡る処理を書く場面が出てきますよね。
しかし、そのたびに毎回 Worksheets(“Sheet1”) や Workbooks(“元データ.xlsx”) などと書いていたら、コードが長く、読みにくくなってしまいます。
そんなときに使えるのが、Withステートメントです。
■基本の書き方と構文
Withステートメントの基本構文は以下のようにとてもシンプルです。
With オブジェクト
.プロパティ = 値
.メソッド
End With
ポイントは「Withで始めてEnd Withで終わる」ということ。
そしてその中に書く処理をドット(.)から始めることで、オブジェクトの記述を省略できます!
例えば、「集計」シートのセルに値を入れるとき:
With Worksheets("集計")
.Range("A1").Value = "合計"
.Range("B1").Value = 100
End With
このように、オブジェクト(ここでは「Worksheets(“集計”)」)を一度だけ指定すれば、その中の処理はすべてそのオブジェクトに対して実行されます。
特に、プロパティやメソッドが複数行にわたるような処理では、Withを使うだけでコードが一段と読みやすくなります!
■Withステートメントの活躍シーン
Withステートメントは、特定のオブジェクトに対して複数の処理を行いたいときに特に役立ちます。
例えば:
- シート内の複数のセルに値を入力・書式設定する
- 同じワークブック内で複数の範囲をコピー&貼り付けする
- グラフや図形など、1つのオブジェクトの複数プロパティを調整する
など、「オブジェクト名の繰り返しが面倒」と感じる場面では、原則Withが使えます!
逆に、1行しか操作がないときは無理に使わなくても大丈夫です。
Withはあくまで「読みやすく」「書きやすく」するための道具です。
■Withを使わない場合と比較してみよう
Withステートメントの良さを実感するために、Withステートメントを「使わない場合」と「使った場合」を比べてみましょう!
①複数セルへの値入力
「売上集計」シートのB2〜D2セルにデータを入力する処理です。
Withを使わない場合:
Worksheets("売上集計").Range("B2").Value = "商品A"
Worksheets("売上集計").Range("C2").Value = 1500
Worksheets("売上集計").Range("D2").Value = "円"
Withを使った場合:
With Worksheets("売上集計")
.Range("B2").Value = "商品A"
.Range("C2").Value = 1500
.Range("D2").Value = "円"
End With
このように、同じシートへの操作を1つにまとめるだけで、処理内容がグループ化されて分かりやすくなります!
②セルへの入力と書式設定
続いて、「見積書」シートのA1セルに文字を入力し、太字・文字サイズ・背景色を設定する処理です。
Withを使わない場合:
Worksheets("見積書").Range("A1").Value = "件名:売上報告"
Worksheets("見積書").Range("A1").Font.Bold = True
Worksheets("見積書").Range("A1").Font.Size = 14
Worksheets("見積書").Range("A1").Interior.Color = RGB(230, 230, 250)
Withを使った場合:
With Worksheets("見積書").Range("A1")
.Value = "件名:売上報告"
.Font.Bold = True
.Font.Size = 14
.Interior.Color = RGB(230, 230, 250)
End With
このようにRangeまで含めてWithで指定すると、より深い階層の繰り返しも省略できて、さらにスッキリ&読みやすいコードになります!
2.Withを使う3つのメリット
ここでは、Withステートメントが持つ3つのメリットを詳しく見ていきましょう!
■読みやすさ:処理のまとまりが明確になる
Withを使うことで、「この処理はこのオブジェクトに対するもの」というまとまりが明確になります。
例えば:
With Worksheets("売上集計")
.Range("B2").Value = "商品A"
.Range("C2").Value = 1500
.Range("D2").Value = "円"
End With
これを見るだけで、「売上集計シートに処理をしている箇所」ということが一目で分かります。
処理のかたまりとして視覚的に区切られるので、読み手の思考もスムーズに進みやすいです。
もしWithを使わずにこれらの処理を書いたら、コード全体が長くなり、どこで探している対象物に対しての処理を書いているのか分かりづらくなってしまいます。
Withは「ここからここまではこの対象に対する処理ですよ」と、コードに小さな囲み枠をつけるようなイメージです。
コードを読みやすくする気遣いとして、ぜひ取り入れていきましょう!
■保守性:修正箇所を最小限にできる
Withステートメントのもう1つの大きなメリットは、後からの修正が楽になる=保守性が高まることです。
たとえば、最初にマクロが対象にしていた「売上集計」シートの名前が、「月次集計」に変更になったとします。
先ほどの例を使って見てみましょう:
With Worksheets("月次集計")
.Range("B2").Value = "商品A"
.Range("C2").Value = 1500
.Range("D2").Value = "円"
End With
Withを使っていれば、対象オブジェクトを一ヶ所書き換えるだけで修正完了です。
マクロが複雑になるほど、「後から修正しやすいコードかどうか」はとても重要です。
特に長く使うマクロでは、保守性のためにもぜひWithステートメントを積極的に使うようにしましょう。
■書きやすさ:繰り返しの記述が減る
Withステートメントは、記述を省略する分、もちろん書くときの手間も減らしてくれます!
例えば:
ThisWorkbook.Worksheets(1).Range("A1").Value = "部門"
ThisWorkbook.Worksheets(1).Range("B1").Value = "売上"
ThisWorkbook.Worksheets(1).Range("C1").Value = "利益"
このコードをWithステートメントで書くと:
With ThisWorkbook.Worksheets(1)
.Range("A1").Value = "部門"
.Range("B1").Value = "売上"
.Range("C1").Value = "利益"
End With
ThisWorkbook.Worksheets(1) のように少し長めのオブジェクト指定を何度も書くのは手間が大きいですが、Withを使えば1行目に書くだけで済みます!
Withステートメントは、「読みやすさ」「保守性」「書きやすさ」の3つを同時に叶えてくれる、とても便利な記述方法です。
積極的にWithを取り入れて、使いやすいマクロを作っていきましょう!
3.ネストで整理!Withステートメントの応用テクニック
Withステートメントには、ネストを使った応用テクニックもあります。
階層構造をすっきり整理したいときに便利な方法です!
■ネストでオブジェクトの階層をきれいに整えよう
Withの中にさらにWithを書く、いわゆるネスト構造を使うと、階層的なオブジェクト操作を整理して書くことができます。
例えば:
With Workbooks("部署別データ.xlsx")
With .Worksheets("営業部")
.Range("A1").Value = "営業実績"
End With
End With
このように書くことで、Workbooks(“部署別データ.xlsx”) や Worksheets(“営業部”) を何度も書かずに済むだけでなく、ワークブックとワークシートの階層構造が視覚的にイメージできるようになります。
ただし、ネストが深くなりすぎると、かえって読みづらくなることもあります。
例えば:
With Workbooks("部署別データ.xlsx")
With .Worksheets("営業部")
With .Range("A1")
.Value = "営業実績"
.Font.Bold = True
End With
End With
End With
セルまでネストにしてしまうと、どのWithが何を指しているのかが見えづらくなり、逆に混乱を招いてしまう可能性があります。
ネストは「構造を整理するための道具」なので、1〜2階層程度を目安に使うのがオススメです!
■ネストで整理!ブック内の複数シート処理をひとまとめに
ネスト構造が力を発揮する例として、同じブック内で複数のシートに異なる処理をする場合を紹介します。
例えば、先ほどのWorkbooks(“部署別データ.xlsx”) とWorksheets(“営業部”) のネスト処理にWorksheets(“開発部”)が追加された場合を考えてみましょう:
With Workbooks("部署別データ.xlsx")
With .Worksheets("営業部")
.Range("A1").Value = "営業実績"
End With
With .Worksheets("開発部")
.Range("A1").Value = "開発進捗"
End With
End With
このように書くことで、ワークブックの指定は一度だけで済み、各シートへの処理もブロックごとに整理されて見通しが良くなります。
同じ対象ブックに対して複数の処理があるときは、今回のようにネストの中で複数の子オブジェクト(ここではシート)単位で処理を書くと、全体がまとまりのあるコードになります。ぜひ活用してみてください!
4. Withを使うときに気をつけたいこと
Withステートメントはコードを整理するのにとても便利ですが、使い方を誤ると、かえって読みづらくなることもあります。
この章では、Withを使うときに注意しておきたいポイントや判断のコツを、具体例と一緒に紹介します!
■1行の処理では無理に使わない
Withはとても便利な記法ですが、すべての場面で使うのが正解というわけではありません。
むしろ、処理が1行で終わるようなケースや、対象がすぐに分かるシンプルな処理では、Withを使わないほうが読みやすいコードになります。
例えば:
Worksheets("集計").Range("A1").Value = "合計"
この処理でWithを使うと:
With Worksheets("集計")
.Range("A1").Value = "合計"
End With
たしかに見やすくはなりますが、かえって読む単語数が増えてしまうことになります。
Withを使うかどうかは以下の点を確認して判断しましょう:
- 同じオブジェクトへの処理が複数行にわたるか
- 後からオブジェクト名を変える可能性があるか
- オブジェクト単位でコードをまとめた方が見やすいか
こういった要素がない場合は、あえて使わず、1行で書くことも検討しましょう。
■別のオブジェクトに対する処理は混ぜない
Withステートメントは、特定のオブジェクトに対する処理をまとめて記述するための構文です。
そのため、Withの中では対象オブジェクトに限定した処理だけを書くのが基本です。
例えば:
With Worksheets("売上")
.Range("A1").Value = "合計"
Worksheets("仕入").Range("B1").Value = "仕入額"
End With
このコードでは、Withで指定した「売上」シートの中に、別の「仕入」シートに対する処理が混ざってしまっています。
実行したら問題なく動作しますが、敢えてWithの中に書く必要はないですよね。
見返した時に読みやすくなるよう、Withの中には、本当に同じ対象に対する処理だけを書くということを意識しましょう!
Withステートメントは、使い方次第でコードを見やすく整えることができますが、「いつ・どこで使うか」の見極めもとても大切です。
無理に使いすぎたり、対象を曖昧にしたりすると、本来の読みやすさが損なわれることもあるので注意しましょう。
「読み手の視点」で使いどころを選ぶことが、スマートなマクロへの第一歩です!
5.まとめ
今回は、Excelマクロでコードの見た目をスッキリ整える「Withステートメント」について、基本の書き方から応用のネスト構造、使う際の注意点までを解説しました。
■Withの基本:繰り返し対象を1回の指定でスッキリ!
マクロの中で同じオブジェクトを何度も指定する処理があるとき、Withを使えばそれを一度の指定でまとめて記述できます。
Withステートメントを使うメリットを改めて確認しましょう:
- 同じオブジェクトを何度も書かずに済むので、手間とミスが減る
- 処理のまとまりが明確になるため、コードの流れを把握しやすくなる
- 後から対象オブジェクトを変更するときも1行だけ直せば良く、修正が簡単になる
- コードが短く・整理された印象になるので、読み手にも親切
このように、見やすさと修正のしやすさの両方に効果があるのが、Withを使う最大のメリットです!
■ネスト構造でオブジェクトの階層もスッキリ整理
Withステートメントは、ネストにして使うことで、オブジェクトの階層構造をそのままコードに表現することもできます。
これは特に、「ブックの中のシート」「シートの中のセル」など、対象が階層的になっている処理で効果を発揮します。
ネスト構造をうまく使うと:
- ワークブック → ワークシート → 範囲(セル) といった階層が自然にコードで表現できる
- 対象が深い処理でも、繰り返しの指定を避けてスッキリ書ける
- 同じブック内の複数シートに処理をしたいときにも、まとめて書きやすい
という点が優れています。
ただし、ネストが深くなりすぎると逆に読みにくくなるので、1〜2階層までにとどめるのがベストです。
「階層構造を整理する道具」として、うまく使い分けていきましょう!
Withは便利な反面、「とりあえず使えばいい」というものではありません。
使うかどうかは、処理の内容や見た目のバランスを見て決めるのが大切です。
最初から完璧に使い分ける必要はありません。
まずは簡単な処理から少しずつ取り入れてみましょう!
\ Excelマクロ制作も承っています /
各種クラウドソーシングサイトにて業務効率化ツールの作成・カスタマイズを承っております。
ご相談・お見積もりは無料ですので、まずはお気軽にご覧ください!