2018年07月21日

VBAでのインターフェース実装例

■インターフェースの基本
VBAでのインターフェース実装例と使い方の例です。
Englishクラス、Japaneseクラスは別クラスでありながら、sayサブルーチンにインスタンスを渡すことができ、さらにgreetingを実行した時はそれぞれの実装で処理されるのがミソです。
(なおVBAではインターフェースモジュールというのはないので、クラスモジュールを使います。)

IPersonインターフェース
'IPersonインターフェース

'挨拶を返すプロシージャ
Public Function greeting() As String
End Function
Englishクラス
'IPersonインターフェースを実装したEnglish具象クラス
Implements IPerson
Public Function IPerson_greeting() As String
IPerson_greeting = "Hello."
End Function
Japaneseクラス
'IPersonインターフェースを実装したJapanese具象クラス
Implements IPerson
Public Function IPerson_greeting() As String
IPerson_greeting = "こんにちは。"
End Function
呼び出し側(ActiveXボタンを貼り付けてイベントプロシージャを記述)
Private Sub CommandButton1_Click()
'具象クラスの変数を宣言
Dim person1 As New English
Dim person1 As New Japanese

'インスタンスをsayサブルーチンに渡す
Call say(person1)
Call say(person2)
End Sub

'挨拶を表示させるサブルーチン
Private Sub say(ByRef arg As IPerson)
'sayサブルーチンは具象クラスが何であるかを知ることなく、greetingを呼び出す。
Call MsgBox(arg.greeting)
End Sub

■イテレータの実装
インターフェースを利用してイテレータ機能を実現します。

IIteratorインターフェース
'イテレータインターフェース

'次の要素がある場合にtrueを返す
Public Function hasNext() As Boolean
End Function

'次の要素を返す。
Public Function getNext() As Variant
End Function
mySetクラス
'イテレータインターフェースを実装したmyData具象クラス
Implements IIterator

'反復処理中のインデックス
Private index As Integer

'保持している配列
Private myData As Variant

'配列変数を受け取ってセットする。
Public Sub setData(ByRef arg As Variant)
index = 0
myData = arg
End Sub

'次の要素がある場合にtrueを返す。
Public Function IIterator_hasNext() As Boolean
IIterator_hasNext = index <= UBound(myData)
End Function

'次の要素を返す。
Public Function IIterator_getNext() As Variant
IIterator_getNext = myData(index)
index = index + 1
End Function
呼び出し側(ActiveXボタンを貼り付けてイベントプロシージャを記述)
Private Sub CommandButton1_Click()
'MySetのインスタンスを作成
Dim myData As MySet
Set myData = New MySet
'データをセット
Call myData.setData(Array("aa", "bb", "cc"))

'イテレータインターフェースで宣言し、MySetのインスタンスを代入
'(myData.hasNextができないためこのようにします)
Dim myItr As IIterator
Set myItr = myData

'イテレータによるデータの取り出し
While myItr.hasNext
Call MsgBox(CStr(myItr.getNext))
Wend
End Sub
タグ:Excel VBA
posted by Hiro at 10:59| Comment(0) | プログラム