VBAで自動化 VBA一覧 セル・シート・ブック操作 操作方法(選択・指定)

【VBA】非連続セルを指定・操作する方法【Union・Selectの使い方】

Excel VBAでマクロを組んでいると、
「離れたセルをまとめて操作したい」
「A列とC列だけ処理したい」
「条件に合ったセルだけを一括で書式変更したい」
といった場面に必ず直面します。

このときに必要になるのが、非連続セルの指定・操作です。

しかし実際には、

  • 非連続セルをどう指定すればよいか分からない
  • Unionは知っているが、使いどころが曖昧
  • Selectを使うべきか迷う
  • コードが複雑になってしまう

といった悩みを持つ方が非常に多いのが現実です。

この記事では、
VBAで非連続セルを安全・柔軟に操作するための考え方と実装方法を、
Unionを中心に、Selectの正しい使い方・使わない設計まで含めて、
実務目線で徹底解説します。

✅ 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コードは一気に実務レベルに進化します。
「動くコード」から「壊れないコード」へ、
ぜひ今回の考え方を取り入れてみてください。

    -VBAで自動化, VBA一覧, セル・シート・ブック操作, 操作方法(選択・指定)