クラスモジュールに移してみる

昨日は、書類の提出状況に対応する色でセルを塗りつぶして見える化するプロシージャについて、その内容を幾つかのプロシージャに分割してみた。
infoment.hatenablog.com
今日は更に、その幾つかをクラスモジュールに委ねてみる。
f:id:Infoment:20190220220021p:plain
まず、クラスモジュールを一つ作成する。名前は、お好みに合わせて。私はgoogle翻訳で出た「Document Submission Status」(書類提出状況)を、そのまま使用することにする。

クラスモジュール(DocumentSubmissionStatusClass)

使う側にしてみれば、途中経過は多分「あまり興味がない」。とにかくセルを渡したら、内容に対応する色で塗りつぶしてくれれば、それでいい訳で。

色を決めたり、それを辞書に登録するところは、ユーザーから見えなくてもいい。Privateにしてしまおう。

Option Explicit

' 書類提出状況別に、対応する色を返す関数。
Private Function GetColor(doc_1 As String, doc_2 As String) As Long
    If doc_1 = "〇" And doc_2 = vbNullString Then
        GetColor = vbBlue
    ElseIf doc_1 = vbNullString And doc_2 = "〇" Then
        GetColor = vbRed
    ElseIf doc_1 = "〇" And doc_2 = "〇" Then
        GetColor = vbYellow
    Else
        GetColor = vbWhite
    End If
End Function

' セルの記載内容から、管理番号を抽出して返す関数。
Private Function GetControlNumber(target As Range) As String
    If target.Value = vbNullString Then
        GetControlNumber = vbNullString
    Else
        GetControlNumber = Left(Split(target.Value, vbLf)(1), 7)
    End If
End Function

' 各管理番号について、提出書類の状況に対応する色を返す関数。
Private Function GetColorDict() As Dictionary
    ' 書類提出状況管理テーブル。
    Dim Tb As ListObject
    Set Tb = Sheets("書類提出状況管理").ListObjects(1)
    
    Dim Dict As Dictionary
    Set Dict = New Dictionary
    
    Dim doc(1 To 2) As String
    
    Dim r As Range
        For Each r In Tb.ListColumns("管理番号").DataBodyRange
            doc(1) = r.Offset(, 1)
            doc(2) = r.Offset(, 2)
            Dict(r.Value) = GetColor(doc(1), doc(2))
        Next
        
    Set GetColorDict = Dict
End Function

' 処理範囲を受け取って、各セルに着色するプロシージャ。
Public Sub VisualizeSubmissionStatus(target_range As Range)
    Dim r As Range
    Dim Dict As Dictionary
    Set Dict = GetColorDict
    Dim ControlNumber As String
        For Each r In target_range
            ControlNumber = GetControlNumber(r)
            If Dict.Exists(ControlNumber) Then
                r.Interior.Color = Dict(ControlNumber)
            End If
        Next
End Sub
標準モジュール

ほとんどをクラスモジュールに委ねてしまったので、こちらは閑散としている。

Sub test()
    Dim DSS As DocumentSubmissionStatusClass
    Set DSS = New DocumentSubmissionStatusClass
    
    Call DSS.VisualizeSubmissionStatus(Selection)
End Sub

いつどのような場合にクラスモジュールを使うべきか否か、様々な意見があると思う。しかしもし、クラスモジュールを使ってみたいという人が居たならば、例えば導入として

  1. まず標準モジュールで作ってみる。
  2. 機能ごとにサブプロシージャを切り分けてみる。
  3. クラスモジュールにしてみる。

など、段階的に体験してみると良いかもしれない。
※今回の例が、クラスモジュールを使用するのに適しているか否か、使い方として正しいか否かは、また別のお話ということでm(_ _)m

参考まで。