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

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:確認するの意。)

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.実行結果

20250421_14.jpg

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

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

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

20250421_16.jpg

11.ClientFacadeでまとめたメソッドは、次のように実行できます。
標準モジュール
20250421_15.jpg

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?