0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

VBA_データのクラス化とメソッドのクラス化

Last updated at Posted at 2025-04-21

次のようにワークシートがあり。住所録を○○リストを、△△リスト、□□リストの3つのリストと番号で突合し、住所録の備考に結果を入力するとします。

20250421_10.jpg

20250421_11.jpg

20250506_05.JPG

20250506_06.JPG

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関数を使います。各メソッドに共通する部分をインターフェースクラスとして抽出し定義します。クラスモジュールを追加して、インターフェースクラスの名前は頭に「I」を付けることになっていますので、「IValidator」とします。(Validate:確認するの意。)

クラスモジュール_IValidator
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.△△リスト、□□リストとの確認も同じような内容になります。住所録クラスはデータクラス、住所録_確認_◯◯リストクラスはメソッドクラスとして、住所録クラスに従属するような関係になります。

20250421_12.jpg

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.住所録クラスをインスタンス化すると、住所録クラスにメソッドとして定義したメソッドクラスをインテリセンスにより自動メンバ表示されるようになりました。

20250421_13.jpg

8.使用例

標準モジュール_Module1
Public Sub 住所録_確認_○○リスト()
    Dim object As New 住所録

    object.確認_○○リスト
    object.確認_△△リスト
    object.確認_□□リスト
End Sub

9.実行結果

20250421_14.jpg

10.クラス分けしたメソッドをまとめたり、整理して実行するには、クラスモジュールを使います。クラス名は「ClientFacade」とします。

クラスモジュール_ClientFacade
Public Sub 住所録_確認_全リスト()
    Dim object As New 住所録
    
    object.確認_○○リスト
    object.確認_△△リスト
    object.確認_□□リスト
End Sub

11.過去記事と合わせるとクラスモジュールの整理状況はこのようになりました。

20250421_16.jpg

12.使用例

標準モジュール_Module1
Public Sub 確認_住所録2()
    Dim object As New ClientFacade
    
    object.住所録_確認_全リスト
End Sub
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?