「オートフィルターで絞り込んだ結果だけをコピーしたい」「空白セルだけに色を付けたい」といった処理を書こうとすると、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でオブジェクトを受け取る場合、エラーが発生するとformulaCellsはNothingのままになります。If formulaCells Is Nothing Thenで判定することで、エラーが起きても後続処理が安全に止まるようにしています。
よく使うSpecialCellsのType一覧
代表的なType定数を用途別にまとめます。
xlCellTypeVisible:可視セルのみ(非表示行・列を除外)xlCellTypeBlanks:空白セルのみxlCellTypeConstants:数式ではない固定値が入力されたセルxlCellTypeFormulas:数式が入力されたセルxlCellTypeLastCell:使用範囲の最終セルxlCellTypeComments:コメント(メモ)が設定されたセル
xlCellTypeConstantsとxlCellTypeFormulasは、Value引数にxlNumbers(数値)やxlTextValues(文字列)を指定することで、さらに細かく絞り込めます。
まとめ
SpecialCellsメソッドを使うと、条件に合うセルを1行で取得でき、For Eachループで全セルを走査するより高速かつシンプルにコードを書けます。
xlCellTypeVisible:オートフィルター後の可視セルだけをコピーしたいときに便利xlCellTypeBlanks:入力漏れチェックや空白セルへの色付けに使えるxlCellTypeFormulas/xlCellTypeConstants:数式・固定値セルを分けて処理したいときに使える- 該当セルが1つもないと実行時エラー1004が発生するため、
On Error Resume NextとIs Nothing判定を必ずセットで使う
「該当なしでエラーになる」という挙動さえ押さえておけば、SpecialCellsは実務のさまざまな場面で活躍する強力なメソッドです。


コメント