Excel VBA | UnionやAreasでまとめた範囲をさらにクラス化して再利用する

Excel VBA VBA
スポンサーリンク

ここまでの Union / Areas を使った離れたセル範囲処理 をさらにクラス化して、再利用可能な形にしてみましょう。これにより「複数の離れた範囲をまとめて処理する」ロジックを一箇所に集約でき、プロジェクト全体で使い回せます。


クラスモジュール例 clsRangeProcessor

1. クラスモジュールコード

' clsRangeProcessor クラスモジュール
Option Explicit

Private pTargetRange As Range

' 対象範囲を設定(Unionでまとめた範囲も渡せる)
Public Property Set TargetRange(rng As Range)
    Set pTargetRange = rng
End Property

' 背景色を一括変更
Public Sub SetBackgroundColor(ByVal colorValue As Long)
    If Not pTargetRange Is Nothing Then
        pTargetRange.Interior.Color = colorValue
    End If
End Sub

' 値を一括置換(例:NG→OK)
Public Sub ReplaceValue(ByVal findValue As Variant, ByVal replaceValue As Variant)
    Dim arr As Variant
    Dim i As Long, j As Long
    
    If Not pTargetRange Is Nothing Then
        arr = pTargetRange.Value
        For i = 1 To UBound(arr, 1)
            For j = 1 To UBound(arr, 2)
                If arr(i, j) = findValue Then
                    arr(i, j) = replaceValue
                End If
            Next j
        Next i
        pTargetRange.Value = arr
    End If
End Sub

' 各Areasごとに処理(例:赤枠)
Public Sub BorderEachArea()
    Dim area As Range
    If Not pTargetRange Is Nothing Then
        For Each area In pTargetRange.Areas
            area.BorderAround ColorIndex:=3, Weight:=xlMedium
        Next area
    End If
End Sub
VB

標準モジュールからの呼び出し例

Sub 実務処理例()
    Dim ws As Worksheet
    Dim proc As clsRangeProcessor
    Dim rng1 As Range, rng2 As Range, rng3 As Range, target As Range
    
    Set ws = ActiveSheet
    Set rng1 = ws.Range("A1:A10")
    Set rng2 = ws.Range("C1:C10")
    Set rng3 = ws.Range("E1:E10")
    
    ' 離れた範囲をUnionでまとめる
    Set target = Union(rng1, rng2, rng3)
    
    ' クラスのインスタンス生成
    Set proc = New clsRangeProcessor
    proc.TargetRange = target
    
    ' 背景色を黄色に
    proc.SetBackgroundColor vbYellow
    
    ' NG→OKに置換
    proc.ReplaceValue "NG", "OK"
    
    ' 各Areasごとに赤枠
    proc.BorderEachArea
End Sub
VB

応用パターン

  • Unionでまとめた範囲をクラスに渡す → 離れた列やセルを一括処理
  • Areasをクラス内で処理 → SpecialCellsで抽出した複数範囲をまとめて処理
  • 配列処理をクラスに集約 → 値変換を爆速で再利用可能

クラス化のメリット

  • 再利用性:同じ処理を複数プロジェクトで使い回せる
  • 保守性:処理ロジックをクラスに集約 → 修正は一箇所で済む
  • 可読性:標準モジュール側は「何をするか」だけ書けるのでスッキリ

練習課題

  1. clsRangeProcessor に「背景色が赤のセルだけ削除」メソッドを追加してみる
  2. 「複数列をまとめて配列処理する」メソッドを追加してみる
  3. 「複数シートの売上列を合計して返す」メソッドを追加してみる

こうして Union / Areas × クラス化 を組み合わせると、離れたセル範囲をまとめて処理する仕組みを再利用可能なライブラリとして構築できます。

VBA
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました