次のようにワークシートあり。住所録を○○リスト、△△リスト、□□リストの3つのリストと番号で確認し、住所録の備考に結果を入力するとします。
1.クラスモジュールを追加して、名前をプロパティで変更します。ここでは「住所録」とします。
2.住所録クラスモジュールをコーディングします。住所録に何か変更を加えてワークシートに戻すには、データを一旦配列にしたほうが早いので、住所録クラスをインスタンス化したらInitializeで配列にするところまでをまずコーディングします。
Private TableRange_住所録 As Range
Private Array_住所録 As Variant
Private Sub Class_Initialize()
With Worksheets("住所録")
Set TableRange_住所録 = .Cells(1, 1).CurrentRegion.Resize(.Cells(Rows.Count, 1).End(xlUp).Row - 1, 5).Offset(1, 0)
End With
Array_住所録 = TableRange_住所録.Value
End Sub
3.配列とした住所録は引数として、3つのリストと確認して、ワークシートに戻すには、Function関数を使います。3つのリストを確認するコードに共通する部分は、インターフェースクラスとして抽出し定義します。クラスモジュールを追加して、インターフェースクラスの名前は頭に「I」を付けることになっていますので、「IValidator」とします。(Validate:確認するの意。)
Option Explicit
Public Function Validate(p_Array As Variant) As Variant
End Function
4.インターフェースを定義しましたので、リストとの確認は、インターフェースを実装したメソッドクラスとしてコーディングします。冒頭にImplements IValidatorと記述することでインターフェースを実装します。また、インターフェースを実装すると、インターフェースで定義したメソッドを、「インターフェースクラス名_インターフェースで定義したメソッド名」でコーディングすることになります。確認対象となるリストを配列として、番号をDictionaryに格納し、引数とした住所録の番号と一致すれば結果を返すようにします。クラス名は「住所録_確認_○○リスト」とします。
Option Explicit
Implements IValidator
Private TableRange_○○リスト As Range
Private Array_○○リスト As Variant
Private Dictionary_○○リスト As New Dictionary
Private Sub Class_Initialize()
Set TableRange_○○リスト = Worksheets("○○リスト").Cells(1, 1).CurrentRegion
Array_○○リスト = TableRange_○○リスト.Value
Dim i As Long
For i = LBound(Array_○○リスト, 1) To UBound(Array_○○リスト, 1)
If Dictionary_○○リスト.Exists(Array_○○リスト(i, 1)) = False Then
Dictionary_○○リスト.Add Array_○○リスト(i, 1), i
End If
Next i
End Sub
Public Function IValidator_Validate(p_Array As Variant) As Variant
Dim i As Long
For i = LBound(p_Array, 1) To UBound(p_Array, 1)
If Dictionary_○○リスト.Exists(p_Array(i, 1)) = True Then
p_Array(i, 5) = "○○"
End If
Next i
IValidator_Validate = p_Array
End Function
5.△△リスト、□□リストとの確認も同じような内容になります。住所録クラスはデータクラス、住所録_確認_◯◯リストクラスはメソッドクラスとして、住所録クラスに従属するような関係になります。
6.クラスメソッドを住所録クラスのメソッドとしてコーディングします。
Option Explicit
Private TableRange_住所録 As Range
Private Array_住所録 As Variant
Private Sub Class_Initialize()
With Worksheets("住所録")
Set TableRange_住所録 = .Cells(1, 1).CurrentRegion.Resize(.Cells(Rows.Count, 1).End(xlUp).Row - 1, 5).Offset(1, 0)
End With
Array_住所録 = TableRange_住所録.Value
End Sub
Public Sub 確認_○○リスト()
Dim DataBaseHandler As IValidator
Set DataBaseHandler = New 住所録_確認_○○リスト
TableRange_住所録 = dbh.Validate(Array_住所録)
End Sub
Public Sub 確認_△△リスト()
Dim DataBaseHandler As IValidator
Set DataBaseHandler = New 住所録_確認_△△リスト
TableRange_住所録 = dbh.Validate(Array_住所録)
End Sub
Public Sub 確認_□□リスト()
Dim DataBaseHandler As IValidator
Set DataBaseHandler = New 住所録_確認_□□リスト
TableRange_住所録 = dbh.Validate(Array_住所録)
End Sub
7.住所録をインスタンス化すると、住所録にメソッドとして定義したメソッドクラスをインテリセンスにより自動メンバ表示されるようになりました。
標準モジュール
8.実行結果
9.クラス分けしたメソッドをまとめたり、整理して実行するには、クラスモジュールを使います。クラス名は「ClientFacade」とします。
Public Sub 住所録_確認()
Dim object As New 住所録
obj.確認_○○リスト
obj.確認_△△リスト
obj.確認_□□リスト
End Sub
10.過去記事と合わせるとクラスモジュールの整理状況はこのようになりました。