前回記事にてExcelVBAマクロを使ってaccdb(mdb)のテーブル作成&削除、フィールド追加&削除について紹介しました。
そのまとめにて冗長なプログラムの最適化について紹介する事を伝えていたので、今回は実際に最適化していくところを紹介します。
※この方法は僕が普段行っている方法で他にもっと良いやり方があるかもしれません
共通な定義部分をプロシージャから外す
まずは各プロシージャに書いている共通な定義部分をプロシージャの外で行うようにし、各プロシージャではそれを共通利用するようにします。
その対象となる部分はDBファイル名とプロバイダーの定義です。

各プロシージャで共通に使う定義となるのでモジュール内定数として定義します。

定義できたら各プロシージャの定義は不要になるので削除し、コンパイルでエラーが発生しない事を確認しておきましょう。
操作前処理、操作後処理をまとめる
実際にデータベースの操作をするには操作前にデータベースへの接続、操作後にはデータベースを閉じる処理が必要になります。

これらも操作を行う前後で共通に必要となる処理なのでまとめたプロシージャを作り、それを呼び出すようにします。

こうする事で操作前処理と操作後処理がすっきりして目的となるデータベースの操作が目立つプロシージャになります。(変数「adodbConn」のNewは関数「beforeCtrl()」で実装しているため、Newを外しました)

操作内容のパラメータ化
次は操作内容をパラメータ化して呼び出し元で指定できるようにします。
こうする事でデータベースの操作が柔軟に行えるようになり、プロシージャの再利用も可能になります。
ここは各プロシージャで変わってくるので1つずつ考えながらやっていきましょう。
テーブル情報の取得プロシージャ
現状ではすべてのテーブルの情報を出力しています。

パラメータを使って特定のテーブル情報のみ出力できるようにしてみましょう。

パラメータ「sTableName」を追加して呼び出し元からテーブル名を指定できるようにしました。
全てのテーブル情報を見る事もできるようにOptionalを使って省略可能とし、省略時は全テーブル情報を出力するようにしています。
テーブルの作成プロシージャ
現状では作成するテーブルのテーブル名が固定になっています。

パラメータを使ってテーブル名を指定できるようにしてみましょう。

パラメータ「sTableName」を追加して呼び出し元からテーブル名を指定できるようにしました。
フィールドの追加プロシージャ
現状では追加するフィールドが固定になっています。

フィールドには名前と型の指定が追加したい分だけ必要になるので手っ取り早く2次元配列を使って指定できるようにしてみましょう。

パラメータ「sTableName」と「arrayColumn()」を追加して呼び出し元から追加するテーブル名とフィールドの名前と型を2次元配列で指定できるようにしました。
フィールドの削除
現状では削除するフィールドが固定になっています。

削除するフィールド名とテーブル名を指定できるようにしてみましょう。

パラメータ「sTableName」と「sColumnName」を追加して呼び出し元から削除するフィールドを指定できるようにしました。
テーブルの削除
現状では削除するテーブルが固定になっています。

削除するテーブル名を指定できるようにしてみましょう。

パラメータ「sTableName」を追加して呼び出し元から削除するテーブルを指定できるようにしました。
各プロシージャの呼び出し
最後に改修した各プロシージャを呼び出すテスト用のプロシージャを作ります。

前半は作成するテーブルと追加するフィールドに関する定義をしています。
各プロシージャは「Call」にて呼び出しています。
各プロシージャの呼び出し後に内容確認のため「showTableInfo()」プロシージャを呼び出しています。
まとめ
かなりざっくりとですがプログラムの整理ができました。
今回修正したプログラムをテキストデータとして置いておきます。
次はクラスモジュールを使って更に使い勝手良くできる方法について紹介しようと思います。
コメント