【ExcelVBA・マクロ】SpecialCellsメソッド完全ガイド|可視セル・空白セル・数式セルだけを取得する方法【コピペOK】

ExcelVBA

「オートフィルターで絞り込んだ結果だけをコピーしたい」「空白セルだけに色を付けたい」といった処理を書こうとすると、For Eachで全セルをループして条件分岐するコードになりがちです。実はSpecialCellsメソッドを使えば、こうした処理を1行で書くことができます。

この記事では、SpecialCellsメソッドの基本的な使い方から、可視セル・空白セル・数式セルなど代表的な条件の指定方法、そして実務でつまずきやすい「該当セルが1つもないときのエラー対処」まで解説します。

スポンサーリンク
スポンサーリンク

SpecialCellsメソッドの基本構文

SpecialCellsメソッドは、Rangeオブジェクトに対して「特定の条件を満たすセルだけ」を取得するメソッドです。基本構文は次の通りです。

Range.SpecialCells(Type, Value)

TypeにはxlCellTypeVisible(可視セル)やxlCellTypeBlanks(空白セル)などの定数を指定します。Valueは数式や定数を対象とする場合にデータ型を絞り込むための引数で、省略すると全種類が対象になります。

可視セルだけを取得する(オートフィルター後のコピー)

オートフィルターで絞り込んだ後、Range.Copyをそのまま実行すると、非表示行のデータまで一緒にコピーされてしまうことがあります。xlCellTypeVisibleを使うと、画面に見えている行だけを対象にできます。

Sub 可視セルだけコピー()
    Dim srcRange As Range
    Dim wsSrc As Worksheet
    Dim wsDest As Worksheet

    Set wsSrc = Worksheets("元データ")
    Set wsDest = Worksheets("抽出結果")

    Set srcRange = wsSrc.Range("A1").CurrentRegion

    wsDest.Cells.Clear
    srcRange.SpecialCells(xlCellTypeVisible).Copy Destination:=wsDest.Range("A1")

    MsgBox "可視セルのみコピーしました。"
End Sub

CurrentRegionでデータ範囲全体を取得したあと、SpecialCells(xlCellTypeVisible)で可視セルだけに絞り込んでからコピーしています。フィルターが1つもかかっていない場合は、範囲全体がそのままコピーされます。

空白セルだけを取得する

入力漏れをチェックしたいときは、xlCellTypeBlanksが便利です。空白セルだけを一括で選択し、色を付けることができます。

Sub 空白セルに色を付ける()
    Dim targetRange As Range
    Set targetRange = Worksheets("チェック表").Range("A2:D100")

    On Error Resume Next
    targetRange.SpecialCells(xlCellTypeBlanks).Interior.Color = RGB(255, 255, 0)
    On Error GoTo 0
End Sub

ここで重要なのがOn Error Resume Nextです。SpecialCellsは、条件に合うセルが1つも見つからない場合、実行時エラー1004(「該当セルが見つかりません」)を発生させます。空白セルが1つもない可能性がある処理では、必ずエラー処理を入れておく必要があります。

数式セル・定数セルだけを取得する

xlCellTypeFormulasは数式が入力されているセル、xlCellTypeConstantsは数値や文字列などの固定値が入力されているセルを取得します。どちらもValue引数でデータ型を絞り込めます。

Sub 数式セルだけ抽出する()
    Dim targetRange As Range
    Dim formulaCells As Range

    Set targetRange = Worksheets("集計表").Range("A1:F50")

    On Error Resume Next
    Set formulaCells = targetRange.SpecialCells(xlCellTypeFormulas, xlNumbers)
    On Error GoTo 0

    If formulaCells Is Nothing Then
        MsgBox "数式セルが見つかりませんでした。"
    Else
        formulaCells.Font.Color = RGB(0, 0, 255)
        MsgBox formulaCells.Count & "個の数式セルに色を付けました。"
    End If
End Sub

Setでオブジェクトを受け取る場合、エラーが発生するとformulaCellsNothingのままになります。If formulaCells Is Nothing Thenで判定することで、エラーが起きても後続処理が安全に止まるようにしています。

よく使うSpecialCellsのType一覧

代表的なType定数を用途別にまとめます。

  • xlCellTypeVisible:可視セルのみ(非表示行・列を除外)
  • xlCellTypeBlanks:空白セルのみ
  • xlCellTypeConstants:数式ではない固定値が入力されたセル
  • xlCellTypeFormulas:数式が入力されたセル
  • xlCellTypeLastCell:使用範囲の最終セル
  • xlCellTypeComments:コメント(メモ)が設定されたセル

xlCellTypeConstantsxlCellTypeFormulasは、Value引数にxlNumbers(数値)やxlTextValues(文字列)を指定することで、さらに細かく絞り込めます。

まとめ

SpecialCellsメソッドを使うと、条件に合うセルを1行で取得でき、For Eachループで全セルを走査するより高速かつシンプルにコードを書けます。

  • xlCellTypeVisible:オートフィルター後の可視セルだけをコピーしたいときに便利
  • xlCellTypeBlanks:入力漏れチェックや空白セルへの色付けに使える
  • xlCellTypeFormulasxlCellTypeConstants:数式・固定値セルを分けて処理したいときに使える
  • 該当セルが1つもないと実行時エラー1004が発生するため、On Error Resume NextIs Nothing判定を必ずセットで使う

「該当なしでエラーになる」という挙動さえ押さえておけば、SpecialCellsは実務のさまざまな場面で活躍する強力なメソッドです。

スポンサーリンク
スポンサーリンク
ExcelVBA
シェアする
いがぴをフォローする

コメント

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