処理の共通化について


プログラムを書かれている方であれば、同じような処理を何度も書く場合、その部分を切り出して共通化する、というようなことを行っていると思います。

それにより、バグの削減や保守性向上につなげることができます。

本日はこれについて、簡単な例ですが書いてみようと思います。

VB.NETExcelを扱う場合ですが、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. このセルについての解放処理を行う

                                                                            • -

おそらく他にもっと良い方法があるのでは…と思いますが、プログラムを組む際は、できる限りこういうことも頭に入れてやっていきたいと思います。

ちなみに、私が開発したシステムには、下記の様なシステムがあります。

Excel/VBA系】

⇒ 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 漢文編集ソフトウェア「漢文工房」