VBAで委譲(コンポジション)を利用したシンプルなデザインパターンのAdapter(アダプター)パターンのサンプルです。
CMyData.cls(データクラス)
Public Name As String
Public Sub DebugPrint()
Debug.Print "name=" & Me.Name
End Sub
CAdapter.cls(Adapterクラス)
Implements CMyData
'委譲元のクラス
Private m_MyData As CMyData
'追加項目
Public isMarried As Boolean
Private Sub Class_Initialize()
Set m_MyData = New CMyData
End Sub
Private Sub Class_Terminate()
Set m_MyData = Nothing
End Sub
'委譲元クラス(CMyData)とのインターフェース実装
Private Sub CMyData_DebugPrint()
Call Me.DebugPrint
End Sub
Private Property Let CMyData_Name(ByVal RHS As String)
Me.Name = RHS
End Property
Private Property Get CMyData_Name() As String
CMyData_Name = Me.Name
End Property
'アダプター公開インターフェース
Public Property Let Name(ByVal RHS As String)
'CAdapterクラスで名前を加工して委譲元へ渡す
m_MyData.Name = RHS & " that is Using Adapter Class"
End Property
Public Property Get Name() As String
Name = m_MyData.Name
End Property
Public Sub DebugPrint()
m_MyData.DebugPrint
If Me.isMarried = True Then
Debug.Print "Sorry, I'm Married"
End If
End Sub
MainForTest.bas(使い方の例)
Sub Main()
'委譲元(CMyData)を直接使う場合
Dim myData As CMyData
Set myData = New CMyData
myData.Name = "My Name is myData"
Call myData.DebugPrint
'アダプター(CAdapter)を使う場合
Dim adapter As CAdapter
Set adapter = New CAdapter
adapter.Name = "My Name is myData"
adapter.isMarried = True
Call adapter.DebugPrint
End Sub
イミディエイトウィンドウの出力結果
name=My Name is myData
name=My Name is myData that is Using Adapter Class
Sorry, I'm Married
この記事の更新履歴
この記事は、生成AIを活用した自動レビュー・更新フローにより内容を見直し、必要な修正を反映しています。
2026年9月11日
- 変更CAdapterクラスのProperty Get Nameプロパティで、戻り値の代入先がMyData_Nameとなっていた誤りをNameに修正しました。
- 削除リンク切れとなっていた古い外部ブログのzipダウンロードリンクを削除しました。
- 変更ソースコードの表示をblockquoteタグからpre/codeタグに変更し、体裁を整えました。

