Excel VBAでマクロを組んでいると、
「離れたセルをまとめて操作したい」
「A列とC列だけ処理したい」
「条件に合ったセルだけを一括で書式変更したい」
といった場面に必ず直面します。
このときに必要になるのが、非連続セルの指定・操作です。
しかし実際には、
- 非連続セルをどう指定すればよいか分からない
- Unionは知っているが、使いどころが曖昧
- Selectを使うべきか迷う
- コードが複雑になってしまう
といった悩みを持つ方が非常に多いのが現実です。
この記事では、
VBAで非連続セルを安全・柔軟に操作するための考え方と実装方法を、
Unionを中心に、Selectの正しい使い方・使わない設計まで含めて、
実務目線で徹底解説します。
目次
- ✅ VBAで非連続セルを扱えないと実務で必ず詰まる理由
- ✅ 非連続セルとは何か【基本概念】
- ✅ 非連続セルを指定する基本方法【Union関数】
- ・Unionの基本構文
- ・Unionの基本使用例
- ✅ Unionを使うメリットと注意点
- ・Unionのメリット
- ・Union使用時の注意点
- ✅ 動的に非連続セルを組み立てる方法【実務頻出】
- ・基本パターン(条件付きUnion)
- ✅ 非連続セルに対する代表的な操作例
- ・値を一括設定する
- ・書式をまとめて変更する
- ・フォント設定を変更する
- ✅ For Each を使った非連続セル処理
- ✅ 非連続セルとSelectの関係【使うべき?使わないべき?】
- ✅ それでもSelectを使ってよいケース
- ・ユーザーに選択状態を見せたい場合
- ✅ Selectを使う場合の安全対策
- ✅ 非連続セルをRows・Columnsで扱う考え方
- ・列単位でまとめる例
- ・行単位でまとめる例
- ✅ 非連続セル操作でよくあるエラーと対処法
- ・NothingをUnionしようとしている
- ・シートが意図せず切り替わる
- ✅ 実務で使える非連続セル設計ルール
- ✅ (補足)可視セルと非連続セルの関係
- ✅ まとめ:非連続セル操作はUnion設計がすべて
✅ VBAで非連続セルを扱えないと実務で必ず詰まる理由
VBAの入門段階では、連続したセル範囲だけを扱うケースがほとんどです。
そのため、「Range("A1:A10")」のような指定には慣れていても、
離れたセルをまとめて操作する方法は後回しにされがちです。
しかし実務では、データは必ずしもきれいに並んでいません。
不要な列が混ざっていたり、条件によって処理対象が飛び飛びになったりします。
このような状況で非連続セルを扱えないと、
ループが増え、コードが冗長になり、保守性が一気に下がります。
まずは、非連続セル操作がなぜ重要なのかを整理しましょう。
✅ 非連続セルとは何か【基本概念】
非連続セルとは、
隣り合っていない複数のセルや範囲をまとめたものです。
例として、
- A1 と C1
- A1:A5 と C1:C5
- 条件に合致した複数のセル
などが該当します。
Excelの画面操作では、
Ctrlキーを押しながらクリックすることで非連続選択が可能ですが、
VBAでは別の考え方が必要になります。
✅ 非連続セルを指定する基本方法【Union関数】
VBAで非連続セルを扱う際の中心となるのが Union です。
・Unionの基本構文
Union(Range("A1"), Range("C1"))
このように、
複数のRangeオブジェクトを1つのRangeとしてまとめることができます。
・Unionの基本使用例
Dim rng As Range
Set rng = Union(Range("A1"), Range("C1"))
rng.Font.Bold = True
これにより、
A1とC1を同時に太字にできます。
✅ Unionを使うメリットと注意点
Unionは非常に便利ですが、
正しく理解していないとエラーや想定外の動作を引き起こします。
・Unionのメリット
- 非連続セルを1つのRangeとして扱える
- 書式変更や値設定を一括で行える
- ループ処理を減らせる
・Union使用時の注意点
- NothingのRangeを含めるとエラーになる
- 動的に組み立てる場合は初期化が必要
- Selectなしでも操作可能だが、理解が必要
✅ 動的に非連続セルを組み立てる方法【実務頻出】
実務では、
条件に合致したセルを後から追加していくケースが多くなります。
・基本パターン(条件付きUnion)
Dim rng As Range
Dim i As Long
For i = 1 To 10
If Cells(i, 1).Value > 100 Then
If rng Is Nothing Then
Set rng = Cells(i, 1)
Else
Set rng = Union(rng, Cells(i, 1))
End If
End If
Next i
この書き方は、
非連続セル処理の王道パターンです。
✅ 非連続セルに対する代表的な操作例
UnionでまとめたRangeは、
通常のRangeと同じように扱えます。
・値を一括設定する
rng.Value = "対象"
・書式をまとめて変更する
rng.Interior.ColorIndex = 6
・フォント設定を変更する
rng.Font.Bold = True
✅ For Each を使った非連続セル処理
UnionでまとめたRangeは、
For Each で個別処理することも可能です。
Dim c As Range
For Each c In rng
c.Value = c.Value * 1.1
Next c
この方法は、
セルごとに異なる処理を行いたい場合に有効です。
✅ 非連続セルとSelectの関係【使うべき?使わないべき?】
Unionを使えば、
Selectを使わずに非連続セルを操作することが可能です。
Union(Range("A1"), Range("C1")).Font.Bold = True
原則として、
自動処理・安定性を重視する場合はSelectは不要です。
参考:【VBA】Selectionは使うべき?使わないべき?正しい考え方と実務判断
✅ それでもSelectを使ってよいケース
非連続セル操作でも、
Selectを使うべきケースは存在します。
・ユーザーに選択状態を見せたい場合
Union(Range("A1"), Range("C1")).Select
- ユーザー操作補助ツール
- 確認用マクロ
- インタラクティブな処理
このような場合は、
Selectが仕様そのものになります。
✅ Selectを使う場合の安全対策
Selectを使う場合は、
必ず対象範囲を明示します。
Application.Goto Union(Range("A1"), Range("C1"))
この方法は、
ActiveSheet依存を減らせるため、
Selectより安全なケースもあります。
✅ 非連続セルをRows・Columnsで扱う考え方
非連続セルは、
必ずしもUnionだけで処理する必要はありません。
・列単位でまとめる例
Union(Columns(1), Columns(3)).Font.Bold = True
・行単位でまとめる例
Union(Rows(2), Rows(5)).Interior.ColorIndex = 6
構造を意識すると、
コードが大幅に簡潔になります。
参考:【VBA】Range・Cells・Rows・Columnsの指定方法を徹底解説【基本と使い分け】
✅ 非連続セル操作でよくあるエラーと対処法
・NothingをUnionしようとしている
Set rng = Union(rng, Cells(1, 1))
👉 初回判定を必ず入れる
・シートが意図せず切り替わる
👉 With Worksheets("Sheet1") を使用する
✅ 実務で使える非連続セル設計ルール
実務では、次のようなルールを決めておくと安定します。
- 条件抽出 → Unionでまとめる
- 一括処理 → Selectなし
- ユーザー操作 → Selectあり
- 動的処理 → Nothing判定必須
✅ (補足)可視セルと非連続セルの関係
オートフィルター後の可視セルも、
結果的に非連続セルになります。
Range("A1:A100").SpecialCells(xlCellTypeVisible)
このRangeも、
Unionと同じ感覚で扱うことができます。
✅ まとめ:非連続セル操作はUnion設計がすべて
- 非連続セルは実務で必須スキル
- UnionでRangeをまとめて扱う
- 動的処理では初期化が重要
- Selectは仕様次第で使い分ける
- 設計視点を持つとコードが安定する
非連続セルを正しく扱えるようになると、
VBAコードは一気に実務レベルに進化します。
「動くコード」から「壊れないコード」へ、
ぜひ今回の考え方を取り入れてみてください。