VBAの SpecialCells を使うと、「値が入っているセルだけ」「空白セルだけ」「エラーのあるセルだけ」といった条件に合うセルをまとめて取得できます。全セルをループしなくて済むため、コードがシンプルになり処理も速くなります。
この記事では、実務でよく使う5つのパターンを解説します。
- 値が入っているセルだけを処理する
- 数式が入っているセルに色をつける
- 空白セルに値を入れる
- フィルターで表示中の行だけを処理する
- エラーのあるセルを目立たせる
SpecialCellsとは?
SpecialCells(種類) は、指定した範囲の中から「特定の条件に合うセルだけ」を取り出す機能です。手動操作では「Ctrl+G(ジャンプ)→ セル選択」でできる操作を、VBAで自動化するイメージです。
よく使う種類は次のとおりです。
xlCellTypeConstants:値が直接入力されているセルxlCellTypeFormulas:数式が入っているセルxlCellTypeBlanks:空白のセルxlCellTypeVisible:フィルターなどで今見えているセル
値が入っているセルだけを処理するには?
A列に値が入っている行だけ、隣のB列に「済」と入力する例です。空白の行はスキップされます。
Dim rng As Range
Dim c As Range
Set rng = Range("A2:A1000").SpecialCells(xlCellTypeConstants)
For Each c In rng
c.Offset(0, 1).Value = "済"
Next c
xlCellTypeConstants は「手入力で値が入っているセル」を対象にします。数式で計算された結果は含まれません。
数式が入っているセルに色をつけるには?
合計などの数式が入っているセルだけを背景色で目立たせる例です。入力セルと計算セルを視覚的に区別したいときに使います。
Dim fml As Range
Set fml = Range("B2:D100").SpecialCells(xlCellTypeFormulas)
fml.Interior.Color = RGB(204, 255, 255)
xlCellTypeFormulas は =SUM() や =IF() などの数式が入っているセルを対象にします。
空白セルに値を入れるには?
入力が抜けているセルに「未入力」と書き込む例です。入力漏れをまとめて埋めたいときに便利です。
Dim blank As Range
Set blank = Range("C2:C100").SpecialCells(xlCellTypeBlanks)
blank.Value = "未入力"
xlCellTypeBlanks は何も入っていない空白セルだけを対象にします。
フィルターで表示中の行だけを処理するには?
フィルターをかけた後、今見えている行だけを太字にする例です。非表示の行には影響しません。
Dim vis As Range
Set vis = Range("A2:A100").SpecialCells(xlCellTypeVisible)
vis.Font.Bold = True
xlCellTypeVisible はフィルターや行の非表示によって隠れているセルを除いた、今画面に見えているセルだけを対象にします。
エラーのあるセルを目立たせるには?
#DIV/0! や #VALUE! などのエラーが入っているセルを赤字にする例です。レポートを出力する前のチェックに使えます。
Dim errRng As Range
Set errRng = Range("A1:D100").SpecialCells(xlCellTypeFormulas, xlErrors)
errRng.Font.Color = RGB(255, 0, 0)
xlCellTypeFormulas, xlErrors のように2つ目の引数を追加すると、数式の中でもエラーになっているセルだけに絞れます。
まとめ
SpecialCells を使うと、条件に合うセルだけをまとめて取得できます。全セルをループする必要がなくなり、コードがシンプルで速くなります。
- 値が入っているセル:
xlCellTypeConstants - 数式が入っているセル:
xlCellTypeFormulas - 空白セル:
xlCellTypeBlanks - フィルター後の見えているセル:
xlCellTypeVisible - エラーのあるセル:
xlCellTypeFormulas, xlErrors
よくある質問
SpecialCellsを使うとエラーになる場合は?
条件に合うセルが1つも見つからない場合、エラーになります。たとえば空白セルが1つもない範囲に xlCellTypeBlanks を使うと「該当セルが見つかりません」というエラーが出ます。事前に On Error Resume Next と On Error GoTo 0 で囲んで、見つからない場合の処理を追加しておくと安心です。
xlCellTypeConstantsとxlCellTypeFormulasの違いは?
xlCellTypeConstants は手入力された値(数字・文字列など)が入っているセルが対象です。xlCellTypeFormulas は =SUM() などの数式が入っているセルが対象です。どちらも「何かが入っているセル」ですが、入り方が違います。
SpecialCellsで取得したセルに対してループ処理はできる?
できます。For Each c In rng のように書くと、取得したセルを1つずつ処理できます。ただし条件に合うセルが1つもない場合はエラーになるので、FAQ1の対処を入れておくと安全です。
数式の中でも特定の種類だけを対象にできる?
できます。xlCellTypeFormulas の後に2つ目の引数を追加することで絞れます。数値のみなら xlNumbers、文字列のみなら xlTextValues、エラーのみなら xlErrors、論理値のみなら xlLogical を指定します。
手動操作のセル選択とSpecialCellsは同じ?
はい、同じです。Excelの「Ctrl+G(ジャンプ)→ セル選択」でできる操作をVBAで行うのが SpecialCells です。手動でできる操作をマクロで自動化したい場合に使います。
動画で学びたい方へ
「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。
VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。



