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引数の主な定数一覧
定数名 | 値 | 内容 |
---|---|---|
xlCellTypeAllFormatConditions | 14 | 条件付き書式が設定されているセル |
xlCellTypeAllValidation | 6 | データの入力規則が設定されているセル |
xlCellTypeBlanks | 4 | 空白セル |
xlCellTypeComments | -4144 | コメント(メモ)が入っているセル |
xlCellTypeConstants | 2 | 定数が入力されているセル |
xlCellTypeFormulas | -4123 | 数式が入力されているセル |
xlCellTypeLastCell | 11 | ワークシートの最後の使用セル |
xlCellTypeSameFormatConditions | 15 | 条件付き書式が同じセル |
xlCellTypeSameValidation | 7 | 入力規則が同じセル |
xlCellTypeVisible | 12 | フィルターなどで表示されているセル(非表示セル除く) |
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引数 | 数式の戻り値タイプで絞り込み(エラー、数値、文字列など) |
エラー処理が必要 | 該当セルがない場合にエラーが発生するため |
用途例 | 空白セルの色変更、数式セルの書式変更、フィルター可視セルの操作など |