【VBAマクロ】withの使い方をマスターしよう【わかりやすく解説】

スポンサードリンク
VBA
  • 他の人が作ったマクロを見たら、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など、時間を生み出すプログラミング術を公開しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。

最後までお読みいただき、ありがとうございました。がんばってください!

タイトルとURLをコピーしました