SpecialCells オブジェクトRangeプロパティ

Range

1. 概要

VBAにおけるRangeオブジェクトのSpecialCellsメソッドは、指定した特定の種類のセルだけを抽出して新たなRangeオブジェクトを取得するための便利な機能です。たとえば、空白セルだけ、数式が入っているセルだけ、定数のセルだけ、可視セルだけなど、特定の条件に合致するセルを効率よく取り出すことができます。

ExcelのGUI上で「ジャンプ」→「セル選択」→「特定の条件で選択」と同じような動作をVBAで実現するために使います。


2. 使い方の基本構文

RangeObject.SpecialCells(Type, [Value])
  • RangeObject: SpecialCellsを使いたいセル範囲を表すRangeオブジェクト。
  • Type: 抽出したいセルの種類を指定する定数(必須)。
  • Value: (省略可) xlCellTypeFormulasを使う場合に、数式の戻り値の種類をさらに指定できる。

戻り値は条件に合致したセル範囲のRangeオブジェクトです。該当セルが無い場合はエラー(Run-time error '1004')になるのでエラー処理が必要です。


3. Type引数の主な定数一覧

定数名内容
xlCellTypeAllFormatConditions14条件付き書式が設定されているセル
xlCellTypeAllValidation6データの入力規則が設定されているセル
xlCellTypeBlanks4空白セル
xlCellTypeComments-4144コメント(メモ)が入っているセル
xlCellTypeConstants2定数が入力されているセル
xlCellTypeFormulas-4123数式が入力されているセル
xlCellTypeLastCell11ワークシートの最後の使用セル
xlCellTypeSameFormatConditions15条件付き書式が同じセル
xlCellTypeSameValidation7入力規則が同じセル
xlCellTypeVisible12フィルターなどで表示されているセル(非表示セル除く)

4. Value引数の詳細(xlCellTypeFormulasのとき)

Type:=xlCellTypeFormulasのときは、数式の戻り値の種類によってさらに絞り込みができます。

定数名内容
xlErrors (-10)エラー値を返す数式のセルのみ
xlLogical (-4)TRUE/FALSEの論理値を返す数式
xlNumbers (1)数値を返す数式
xlTextValues (2)文字列を返す数式

例えば、エラーの数式だけ取得したい場合などに便利です。


5. 使用例

例1:空白セルを取得し、色を黄色に塗る

Sub 塗りつぶし_空白セル()
Dim rng As Range
On Error Resume Next ' エラー処理(空白セルがない場合に備える)
Set rng = Range("A1:D10").SpecialCells(xlCellTypeBlanks)
On Error GoTo 0

If Not rng Is Nothing Then
rng.Interior.Color = RGB(255, 255, 0)
Else
MsgBox "空白セルはありません。"
End If
End Sub

例2:数式セルだけを赤文字にする

Sub 数式セルを赤文字に()
Dim rng As Range
On Error Resume Next
Set rng = Range("A1:D10").SpecialCells(xlCellTypeFormulas)
On Error GoTo 0

If Not rng Is Nothing Then
rng.Font.Color = vbRed
Else
MsgBox "数式セルはありません。"
End If
End Sub

例3:エラーを返す数式セルだけを取得

Sub エラー数式セルに印を付ける()
Dim rng As Range
On Error Resume Next
Set rng = Range("A1:D10").SpecialCells(xlCellTypeFormulas, xlErrors)
On Error GoTo 0

If Not rng Is Nothing Then
rng.Interior.Color = RGB(255, 0, 0)
Else
MsgBox "エラー数式セルはありません。"
End If
End Sub

例4:フィルターで表示されているセルだけ操作

Sub 可視セルだけコピー()
Dim rng As Range
Set rng = Range("A1:D100").SpecialCells(xlCellTypeVisible)
rng.Copy Destination:=Range("F1")
End Sub

6. 注意点

  • エラー処理は必須
    SpecialCellsで該当セルがない場合はエラーになります。必ずOn Error Resume Nextなどでエラーを回避するか、エラーハンドリングしてください。
  • 大きな範囲での処理は遅くなる場合あり
    範囲が大きいと処理が遅くなることがあります。必要最小限の範囲で使うのが良いです。
  • 特定のシートでしか使えない定数もある
    例えばxlCellTypeAllFormatConditionsなどはExcelのバージョンや環境に依存する場合があります。

7. 応用例:特定の定数セルだけ書式変更

Sub 定数セルを太字に()
Dim rng As Range
On Error Resume Next
Set rng = Range("A1:E20").SpecialCells(xlCellTypeConstants)
On Error GoTo 0

If Not rng Is Nothing Then
rng.Font.Bold = True
Else
MsgBox "定数セルはありません。"
End If
End Sub

8. 応用例:コメントのあるセルだけにマークを付ける

Sub コメントセルにマーク()
Dim rng As Range
On Error Resume Next
Set rng = Range("A1:D20").SpecialCells(xlCellTypeComments)
On Error GoTo 0

If Not rng Is Nothing Then
Dim c As Range
For Each c In rng
c.Value = c.Value & " ★"
Next c
Else
MsgBox "コメントのあるセルはありません。"
End If
End Sub

9. 特殊なケース:最終セルの取得

Sub 最終使用セルを選択()
Dim lastCell As Range
Set lastCell = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell)
lastCell.Select
End Sub

xlCellTypeLastCellはシートの最後に使われているセルの位置を返します。ただし、ExcelのUsedRangeの動作に依存するので注意が必要です。


10. まとめ

項目内容
目的特定の種類のセルだけを抽出する
主なType定数空白(xlCellTypeBlanks)、数式(xlCellTypeFormulas)、定数(xlCellTypeConstants)、可視セル(xlCellTypeVisible)など
Value引数数式の戻り値タイプで絞り込み(エラー、数値、文字列など)
エラー処理が必要該当セルがない場合にエラーが発生するため
用途例空白セルの色変更、数式セルの書式変更、フィルター可視セルの操作など
タイトルとURLをコピーしました