Excel VBAのインターフェイスの使い方に関して、簡単に説明します。
VBAで処理を行う際に、全体的な流れは同じだけど、ファイルごとに一部処理を変えたいときがあると思います。そういうときにインターフェイスを使うと、うまく解決できることがあります。
Public Sub Main()
'ファイルを開く
Call OpenFile()
'処理をする
Call Process()
'ファイルを閉じる
Call CloseFile()
End Sub
Public Sub Process()
Dim objFile As InterfaceBase ← Interfaceクラスの元となるクラス名で宣言する
Select Case ファイル名
Case ファイルA : objFile = New InterfaceFileA() ← 作成時はそれぞれのクラス名で作成する
Case ファイルB : objFile = New InterfaceFileB() ← 作成時はそれぞれのクラス名で作成する
End Select
Do While True
ファイルから1行読み取る
'ループ判定処理
If False = objFile.IsLoop() Then
Exit Do
End If
'ファイル処理を行う
Call objFile.Process()
Loop
End Sub
インターフェイスの基本となるクラスには、必要なメソッド(関数)やプロパティの宣言のみ行います。メソッド(関数)の処理内容の記載はここでは不要です。
■ Interfaceクラス
クラスモジュール名:InterfaceBase
'ループ判定処理
Public Function IsLoop() As Boolean
End Function
'ファイル処理
Public Function Process() As Boolean
End Function
ファイルごとのカスタマイズしたい処理ごとにインターフェイスクラスを作成します。
大きなポイントは2つです。
- クラスの先頭に「Implements InterfaceBase」を記載すること
- 関数名の先頭に「InterfaceBase_XXXX」を追加すること
■ ファイルA用クラス
クラスモジュール名:InterfaceFileA
Implements InterfaceBase ← ここにInterfaceクラスの元となるクラス名を記載
'ループ判定処理
Public Function InterfaceBase_IsLoop() As Boolean
ファイルA用のループ判定処理を記載する
End Function
'ファイル処理
Public Function InterfaceBase_Process() As Boolean
ファイルA用のファイル処理を記載する
End Function
■ ファイルB用クラス
クラスモジュール名:InterfaceFileB
Implements InterfaceBase ← ここにInterfaceクラスの元となるクラス名を記載
'ループ判定処理
Public Function InterfaceBase_IsLoop() As Boolean
ファイルB用のループ判定処理を記載する
End Function
'ファイル処理
Public Function InterfaceBase_Process() As Boolean
ファイルB用のファイル処理を記載する
End Function
このサンプルくらいのプログラムならファイルごとにProcess関数を用意して、対象ファイルごとに振り分けても実現はできますが、カスタマイズしたい種類が多くなってくると同じような関数が増えてコードが見にくくなってしまいます。
インターフェイスクラスを使うと、差分の部分だけの関数になるのでコードも見やすくなります。また、あとで共通の処理を追加したい場合も1か所だけ直せば済むようになるのでメンテナンスも楽になります。
慣れるととても便利なので、ぜひとも使ってみてほしいと思います。