処理の共通化について
プログラムを書かれている方であれば、同じような処理を何度も書く場合、その部分を切り出して共通化する、というようなことを行っていると思います。
それにより、バグの削減や保守性向上につなげることができます。
本日はこれについて、簡単な例ですが書いてみようと思います。
VB.NETでExcelを扱う場合ですが、Excelアプリケーションオブジェクトやブック、シート、セル等(COM オブジェクト)に対して操作を行った場合、その都度「COMオブジェクトの解放」というのを行う必要があり、これが一つでも抜けるとExcelのプロセスが正しく終了しません。
説明が上手くなくて申し訳ありませんが、「何かしたら必ず後始末をする必要がある」ということです。
例えば以下のような処理①があったとします。
(処理①)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
1. Excelオブジェクトを生成する
2. このオブジェクトを使って、あるブックを参照する
3. このブックのシートを参照する
4. このシートの指定のセルを参照する
5. この参照したセルに値をセットする
6. このセルについての解放処理を行う
(※4〜6をループせず100回行う。)
7. このシートについての解放処理を行う
8. このブックについての解放処理を行う
9. このExcelオブジェクトについての解放処理を行う
10.処理終了
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
この場合ですと、例えば4.〜6.の100回の処理のうち、1回でも6.の処理が抜けると正しく終了してくれません(そして「どこが抜けているか??」と虱潰しに探すことになってしまいます)。
そこで4.〜6.を関数にして、以下の処理②のようにすると、その負担をいくらか減らすことができそうです。
(処理②)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
1. Excelオブジェクトを生成する
2. このオブジェクトを使って、あるブックを参照する
3. このブックのシートを参照する
●関数 SetValToCellの呼び出しを100回行う。
7. このシートについての解放処理を行う
8. このブックについての解放処理を行う
9. このExcelオブジェクトについての解放処理を行う
10.処理終了
→以下、処理の切り出し部分
(関数 SetValToCell)
4. このシートの指定のセルを参照する
5. この参照したセルに値をセットする
6. このセルについての解放処理を行う
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
また以下の処理③のようにしてやると、もう少し負担が減り、さらに他の箇所でも再利用しやすくなるのかな、と思います。
(処理③)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
●クラスchildを生成する。(1.〜3.が実行される)
●クラスchildのSetValToCellのCallを100回行う。
●クラスchildを破棄する。(7.〜9.が実行される)
10.処理終了
→以下、処理の切り出し部分
(クラス parent 生成時)
1. Excelオブジェクトを生成する
2. このオブジェクトを使って、あるブックを参照する
3. このブックのシートを参照する
(クラス parent 破棄時)
7. このシートについての解放処理を行う
8. このブックについての解放処理を行う
9. このExcelオブジェクトについての解放処理を行う
(parent継承クラス child のメソッド SetValToCell)
4. このシートの指定のセルを参照する
5. この参照したセルに値をセットする
6. このセルについての解放処理を行う
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
おそらく他にもっと良い方法があるのでは…と思いますが、プログラムを組む際は、できる限りこういうことも頭に入れてやっていきたいと思います。
ちなみに、私が開発したシステムには、下記の様なシステムがあります。
⇒ http://msystm.co.jp/user_sbw_zaiko.html 楽天在庫情報一括更新システム
⇒ http://msystm.co.jp/user_sbw_toku.html とくとく店長連携システム
【.Net系】
⇒ http://msystm.co.jp/mecs_top.html 経営診断データ自動作成システム
⇒ http://msystm.co.jp/user_kyoiku.html 漢文編集ソフトウェア「漢文工房」