InterfaceによるなんちゃってUsing句を作る

以下のようなロジックを組んでいていろいろな終了処理めんどくせぇ~
一発でなんとかなんねーかということで、Interface でなんとかしてみた。
かなりめんどくささを強調しているのであまりつっこまないように。

下記の例だと、
・Application.ScreenUpdating の設定
・別Excel 起動時の終了処理
・処理中フォームの開始・終了処理
の処理が面倒な感じです。C# なら Using句とかで自動で終了できて便利ですね。

ありがちな例

ソース

以下、いくつかクラスを作成します。
インターフェイス IConstructorを定義する。

インターフェイス IUsing を定義する。

Excel の高速化クラスを作成、インターフェイス IUsing をImplimentsし、Begin/Finishメソッドに内容を記述する。
参考)VBA マクロの高速化のためのApplication設定をクラスモジュールにまとめる

Excel の起動クラスを作成、インターフェイス IUsing を同様に適用する。

処理中フォームで インターフェイス IUsing を同様に適用する。
フォームもクラスなのでインターフェースが使えます。余談ですが UserForm型って挙動がインターフェースっぽいな。

コンストラクタのヘルパー関数

Using クラスを作成、コンストラクタで各オブジェクトをコレクションに登録、各オブジェクトのBegin メソッドを呼び出す。
また、 Class_Terminate にて各オブジェクトのFinishメソッドを呼び出す。
これにより、IUsingインターフェースのあるクラスであれば、指定されたメソッドの開始処理、終了処理を一括して行うことが可能となります。

改善後

改善後の記述は以下のようになります。すっきりしましたね。
End With で UsingクラスのClass_Terminateが実行され、各クラスのFinishメソッドが実行されます。
エラーの時にはUsingオブジェクトがスコープ外になった時に各クラスのFinishメソッドが実行され、処理のこりが防止できます。

サンプルダウンロード(Using.xlsm)

ABOUTこの記事をかいた人

はてなブックマークで驚愕の1600越えを記録した伝説が今明らかに! エクセル方眼紙 四天王の1人(ほぼ最弱)窓の杜大賞2014 大賞受賞! Excelを便利にする250以上の機能を体系化したアドインはこちらです。