VBAでコードを書いているとき、同じオブジェクトに対して何度も同じ記述を繰り返していませんか?
こんな感じ
「Range(“A1”).Font.Size = 12」「Range(“A1”).Font.Bold = True」…
上記のようなコードでも問題なく実行できるけど、
処理速度が遅くなる、コードを改善するとき書き換えるのが大変になる、など
いろんなデメリットが生じます。
上記のような冗長な記述は、
「With構文」を使うことで、驚くほどスッキリとしたコードに書き直す
ことができるんです。
本記事では、With構文の基礎から実践的な使い方まで、コピペできるサンプルコードや図を使って徹底解説します。
With構文は
コードの行数を半分に減らしながら可読性も高められる魔法のような構文
です。
この記事を参考にして、スマートなVBAコードを書けるようにしましょう。
目次
【VBA】With構文とは?初心者でもわかる基礎知識
With構文の活用は、みやすくて修正のしやすいVBAコード作りに欠かせないテクニックです。
With構文を使うことで同じオブジェクトに対する複数の操作をまとめて書くことができ、
コードをすっきりさせることができる!処理速度をアップさせることができる、などのメリット
があります。
WorksheetやRangeオブジェクトを扱う際は必ずWith構文を使うようにしましょう。
With構文の基本的な書き方と文法ルール
With構文の基本的な書き方は、とても簡単です。
「With」から始まり「End With」で終わる
たったこれだけ!
With構文を使う場合と使わない場合の比較をするサンプルコードがこちら
'With構文を使わない場合
Range("A1").Interior.Color = RGB(255, 255, 0)
Range("A1").Font.Bold = True
'With構文を使う場合
With Range("A1")
.Interior.Color = RGB(255, 255, 0)
.Font.Bold = True
End With
あるセル範囲の背景色を黄色にして文字を太字にするという意味です。
2行目から3行目は、With構文を使わない場合のコード
6行目から9行目は、With構文を使った場合のコード
です。
始まりでRange(“A1”)を宣言しているので、終わりまでRange(“A1”)を省略することができます。
従来のコードとWith構文の違いを理解しよう
従来の書き方とWith構文の最大の違いは、コードの見やすさと書きやすさにあります。
With構文を使わない場合、オブジェクト名を何度も書く必要がありますが、With構文を使えばピリオド(.)だけの入力で完了。
これは特に長いオブジェクト参照を何度も書く必要がある場合に効果を発揮します。
With構文を使うメリット3つを解説
With構文を活用するメリットがこちら
- 入力量の削減
- 可読性の向上
- 保守性の向上
ガッツポーズの人
オブジェクト名を何度も書く必要がなくなるのでVBA開発スピードが上がり、やり直しが発生してもWith構文で宣言したオブジェクト1箇所を変更するだけで済む
With構文の活用はメリットしかありません!!
With構文の具体的な使い方と実践例
実務でWith構文を使う機会は非常に多く、特にExcelのセル操作やシート設定で活躍します。
ここからはWith構文を使った実践的なサンプル事例を交えて説明していきます。
Excelでよく使うWith構文の記述方法
Excelでの代表的なWith構文の使用例を見てみましょう。以下は、セルの書式設定を一括で行う例です:
セルの書式設定を一括で処理するサンプルコードがこちら
With Worksheets("Sheet1").Range("A1:B10")
.Font.Name = "メイリオ"
.Font.Size = 11
.HorizontalAlignment = xlCenter
.Interior.Color = RGB(255, 255, 200)
.Borders.LineStyle = xlContinuous
End With
1行目のコードは、シート1のA1セルからB10セルの範囲を指定
2行目から6行目のコードは、セルの書式設定を細かく指定する
7行目のコードは、With構文を終了させる
という意味です。
広い範囲で書式設定を細かく指定することができます。
Range操作を効率化するWith構文テクニック
Range操作では、With構文を使うことで複雑な処理も簡潔に書けるようになります。
特定の条件で検索して値を設定するというサンプル事例がこちら
A列に適当なテキストを入力します。
この中から「検索値」というテキストを探し出し、背景色を黄色にして「見つかりました」というテキストをB列に表示する
という処理をします。
サンプルコードがこちら
Sub test()
With Range("A1:A100").Find(What:="検索値", LookIn:=xlValues)
If Not .Address = "" Then
.Offset(0, 1).Value = "見つかりました"
.Interior.Color = RGB(255, 255, 0)
End If
End With
End Sub
2行目のコードは、A1セルからA100セルの範囲で「検索値」というテキストを検索するをWith構文で指定する
3行目のコードは、With構文で指定した内容が見つからない場合何もしない、見つかった場合4行目と5行目の処理をする
という意味です。
実行結果がこちら
ガッツポーズの人
複数のWithを組み合わせた実践的なコード例
より複雑な処理では、With構文を入れ子にして使うこともできます。
下記のサンプルコードは
シート名が「集計表」でA1セルからA10の範囲を背景色を黄色にして罫線を引く
という処理を行います。
Sub test()
With Worksheets("集計表")
With .Range("A1:A10")
.Interior.Color = RGB(240, 240, 240)
With .Borders
.LineStyle = xlContinuous
.Weight = xlThin
.Color = RGB(0, 0, 0)
End With
End With
End With
End Sub
2行目のコードは、1つ目のWith構文で「集計表」シートを指定
3行目から4行目のコードは、2つ目のWith構文でA1セルからA10セルを指定し背景色を黄色に編集する
5行目から8行目のコードは、3つ目のWith構文でA1セルからA10セルを指定し罫線を引く
という意味です。
編集しながらWith構文で指定するオブジェクトをどんどん増やしていき最後にWith構文を解除しています。
With構文でVBA初心者が迷うポイントと解決策
VBA初心者が始めてWith構文を使うとき、
どこまで省略していいの?どこにドット(.)を付ければいいの?など、
慣れるまで戸惑ってしまいますよね。
ここからは、VBA初心者がWith構文の活用で迷っていしまうポイントや解決方法を解説していきます。
ドット忘れには要注意
With構文で最も多い失敗パターンは、ドット(.)の付け忘れです。
良い例と悪い例を示したサンプルコードがこちら
'間違った例
With Range("A1")
Interior.Color = RGB(255, 255, 0) 'ドットがない!
Font.Bold = True 'ドットがない!
End With
'正しい例
With Range("A1")
.Interior.Color = RGB(255, 255, 0)
.Font.Bold = True
End With
With構文を宣言した後のコードにドット(.)を付け忘れてしまうことがあります。
コードが長くなればなるほど気づきにくいミスなので注意してください。
With構文のネスト(入れ子)を使いこなすコツ
With構文を宣言し終了させる前に次のWith構文を宣言させる(ネストする)場合、
1つ目のWithはどのこまで?2つ目のWithはどこまで??
と迷うことがあります。
コードが見づらいサンプルコードがこちら
Sub test()
With Worksheets("Sheet1")
With .Range("A1:A10")
With .Font
.Name = "Arial"
.Size = 12
.Bold = True
End With
With .Interior
.Color = RGB(240, 240, 240)
.Pattern = xlSolid
End With
End With
End With
End Sub
こんな問題を解決する方法が、インデントを正しく設定することです。
正しくインデントされたサンプルコードがこちら
Sub test()
With Worksheets("Sheet1")
With .Range("A1:A10")
With .Font
.Name = "Arial"
.Size = 12
.Bold = True
End With
With .Interior
.Color = RGB(240, 240, 240)
.Pattern = xlSolid
End With
End With
End With
End Sub
インデントの方法は人によって好き嫌いがあるので自分なりの方法を見つけてください。
上記のサンプルコードは、
A1セルからA10セルを範囲指定、テキストの種類や大きさを指定、背景色を指定、をWith構文を使って処理する
というサンプル事例です。
A1セルからA10セルに適当なテキストを入力した状態でVBAを実行すると以下のような結果になります。
2行目のコードは、1つ目のWith構文でシートを指定
3行目のコードは、2つ目のWith構文でA1セルからA10セルを指定
4行目から8行目のコードは、3つ目のWith構文でフォント設定を指定し、「種類」「大きさ」「太字」を編集
9行目のコードは、3つ目のWith構文を解除
10行目から12行目のコードは、セルの書式を指定し背景色の色とパターンを編集する
という意味です。
シートの指定で1つ目のWith構文を宣言し、セル範囲の指定で2つ目のWith構文を宣言、フォントの指定で3つ目のWith構文を宣言しフォントの処理が終わったらWith構文を1つ解除。次にセルの書式設定を指定で3つ目のWith構文を宣言する
といった使い方をしています。
デバッグ時の効率的なトラブルシューティング
With構文でエラーが発生した場合のデバッグ方法として、F8キーを使った1行ずつの実行が効果的です。
こんな感じ
また、Debug.Printを使って処理を確認することでデバックの効率をアップさせることができます。
Debug.Printを使ったサンプルコードがこちら
Sub test()
With Range("A1")
Debug.Print .Address '処理対象のセルを確認
.Value = "テスト"
Debug.Print .Value '設定された値を確認
End With
End Sub
実行結果がこちら
1つ目の結果の「$A$1」は、3行目のコードによる処理結果
2つ目の結果の「テスト」は、5行目のコードによる処理結果
という意味です。
長いコードを実行する場合、Debug.Printを使えば途中結果を知ることができるので、
どの部分で不具合が生じているのか
を正確に把握することができます。
関連記事「VBA初心者でもできる上手なデバック方法」では、効率的にデバックする方法が解説されています。
VBAを設定したけどエラーが発生して思い通りに動作しない こんな問題を『デバック』で解決します。 私はエクセル業務の効率をアップさせるために、エクセル作業を自動化するVBAをいくつも開発してきました。 そこで問題となるのは、VBAを実行したらエラーが発生して作業が中断されてしまうことです。 疲れ果てた人なぜエラーが出るの?どこが間違ってるかわからない。。。 このようにお困りの方は、本記事で解説する『デバックのテクニック』を参考にしてみてください。 難しいと思われがちなVBA... 【VBAのデバック方法】初心者でも5分で解決するテクニックをご紹介 - mamemametochan.com |
頑張って作成したVBAが思い通りに動かなくて困っている!という方は是非参考にしてみてください。
実務でWith構文を使いこなすためのテクニック
実際のエクセル業務に導入するVBAコードで、With構文を効率的に使うためのテクニックをお伝えします。
別にWith構文を使わなくても思い通りの処理はできる!と考えている方もいらっしゃいますが、
With構文を活用することでよりメンテナンス性の高いコードが書ける
ようになります。
慣れるまでは大変かと思いますが、自由にWith構文を使えるようにしておきましょう。
With構文で作業効率を劇的に改善する方法
With構文を使って作業効率を向上させるには、
よく使う処理をまとめること
が重要です。
下記のサンプルコードは、複数のシートに同じ設定を適用するという内容です。
Sub シート一括設定()
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
With ws
'印刷設定
With .PageSetup
.Orientation = xlLandscape
.Zoom = False
.FitToPagesTall = 1
.FitToPagesWide = 1
End With
'ヘッダー設定
With .Range("A1:F1")
.Font.Bold = True
.Interior.Color = RGB(230, 230, 230)
.Borders.LineStyle = xlContinuous
End With
End With
Next ws
End Sub
6行目から11行目のコードは、With構文でページ設定を行う
14行目から18行目のコードは、With構文で見出しの設定を行う
4行目と19行目のコードは、繰り返し指定されるシートをWith構文で宣言する
という意味です。
複数シートのページ設定と見出し設定を最低限のWith構文で処理することで、
不要なオブジェクトの参照を省略する
ことができます。
実務で使える応用的なWith構文活用例
データの取り込みや集計など、複雑な処理が求められるVBAにはWith構文の活用が必須です。
With構文を使わず効率の悪いコードだと、「メモリー不足」のエラーとなる可能性があります。
エクセル業務でよく使われる効率の良いサンプルコードがこちら
Sub データ集計()
With Worksheets("集計")
'検索範囲の設定
With .Range("A2:A" & .Cells(.Rows.Count, "A").End(xlUp).Row)
'オートフィルター適用
.AutoFilter Field:=1, Criteria1:="完了"
'集計結果の出力
With .Offset(0, 1)
.Font.Color = RGB(0, 0, 255)
.NumberFormat = "#,##0"
End With
End With
End With
End Sub
2行目のコードは、With構文でシートを指定する
4行目のコードは、With構文で検索するセル範囲を指定する
9行目のコードは、With構文で集計結果を出力する
という意味です。
With構文を宣言する順番がとても大切でサンプル事例では
シートの指定 → セル範囲の指定 → フィルターをかける → 集計結果を出力する → 順番にWith構文を解除する
という順番になっています。
ガッツポーズの人
まとめ:With構文を自由自在に使いこなすためには!?
With構文の基礎から応用まで、段階的に説明してきました。
With構文を自由自在に使いこなすためには
いろんなコードを書きまくる!そしていろんなコードを見まくる!!
です。
自分では「With構文なんて完璧に使いこなせているぜ!」と思っていても、もっとキレイにまとめられるかもしれません。
ちなみに、私はWith構文の使い方がめちゃくちゃ下手くそ。。。
別の方が作ったコードを見て「こんなキレイなコードに書き方があったのか・・・」と驚かされることばかりです。
徐々に上手に使えるようになればいいかな!くらいな楽な気持ちで使っています。
With構文の導入に迷ったとき参考にする基本サンプルコードがこちら
サンプルコード①
'Step 1: 単一のセル操作
With Range("A1")
.Value = "練習"
.Font.Bold = True
End With
サンプルコード②
'Step 2: 範囲の操作
With Range("A1:B5")
.Value = 1
.Interior.Color = RGB(255, 255, 0)
End With
サンプルコード③
Sub 練習用サンプル()
'シート設定の例
With ActiveSheet
.Name = "練習用"
With .Range("A1:D5")
.Interior.Color = RGB(240, 240, 240)
.Borders.LineStyle = xlContinuous
With .Font
.Name = "メイリオ"
.Size = 11
End With
End With
End With
End Sub
たまに見返すことで、
「あーー、こうやって使うんだったー」
という気づきに繋がります。
With構文の導入が苦手!という方は上記サンプルコードを活用してみてください。
慣れるまで難しく感じると思いますが、焦らず活用していきましょう。
この記事を読んで、
「VBAやってみたい!」「いろんなエクセル業務の自動化に挑戦したい!!」
と感じてくれた方はエクセルVBAの情報を定期的に配信しているメルマガへの登録を検討してみてください。
エクセル業務で苦しんだ私の経験を元に、
実務で役立つVBA情報をお届けしています。
この記事が、あなたの業務効率化への第一歩となることを願っています。