Excel VBA | 実務で超使う「離れたセル × 自動化パターン」

VBA
スポンサーリンク

ここまで紹介してきた「条件一致セル処理」「複数シート一括処理」「配列高速処理」を クラスモジュール化して再利用可能にする 例を示します。クラス化することで、共通処理をひとまとめにして、プロジェクト全体で使い回せるようになります。


クラスモジュール clsCellProcessor の例

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

' clsCellProcessor クラスモジュール

Option Explicit

Private pTargetRange As Range

' 対象範囲を設定
Public Property Set TargetRange(rng As Range)
    Set pTargetRange = rng
End Property

' 条件一致セルを赤枠にする
Public Sub HighlightZero()
    Dim c As Range
    For Each c In pTargetRange
        If c.Value = 0 Then
            c.BorderAround ColorIndex:=3, Weight:=xlMedium
        End If
    Next c
End Sub

' 背景色が黄色のセルをクリア
Public Sub ClearYellow()
    Dim c As Range
    For Each c In pTargetRange
        If c.Interior.Color = vbYellow Then
            c.ClearContents
        End If
    Next c
End Sub

' 配列で高速変換(例:NG→OK)
Public Sub ReplaceNG()
    Dim arr As Variant
    Dim i As Long
    
    arr = pTargetRange.Value
    For i = 1 To UBound(arr, 1)
        If arr(i, 1) = "NG" Then
            arr(i, 1) = "OK"
        End If
    Next i
    pTargetRange.Value = arr
End Sub
VB

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

Sub 実務処理例()
    Dim ws As Worksheet
    Dim proc As clsCellProcessor
    
    ' クラスのインスタンス生成
    Set proc = New clsCellProcessor
    
    ' 各シートのC列を対象に「金額ゼロセル赤枠」
    For Each ws In ThisWorkbook.Worksheets
        proc.TargetRange = ws.Range("C2:C" & ws.Cells(ws.Rows.Count, "C").End(xlUp).Row)
        proc.HighlightZero
    Next ws
    
    ' ActiveSheetのB列を対象に「NG→OK」変換
    proc.TargetRange = ActiveSheet.Range("B2:B1000")
    proc.ReplaceNG
End Sub
VB

応用パターン

  • 複数シート一括処理 → 標準モジュール側でシートをループし、クラスに渡す
  • 条件ごとにメソッド化HighlightZero, ClearYellow, ReplaceNG のように分ける
  • 柔軟な拡張 → 新しい条件処理を追加するだけで再利用可能

クラス化のメリット

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

練習課題

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

こうしたクラスモジュール化を進めると、実務で超使える「離れたセル × 自動化」パターンを再利用可能なライブラリ化できます。

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