有限会社 Lab.3s (ラボ.スリーエス) Tel:024(557)7571 福島県福島市泉長滝12-17 |
||||||||
障害対応を効率化するためのVBA擬似構造化例外処理 VBAでは例外が発生したときに次のダイアログが表示されます。
この様な例外が、他のユーザが使用中に発生しかつ開発者に連絡も取れない場合などは困ったことになります。 ユーザがここから何をすれば分らないという状況に陥ってしまいますし、誤操作、電源断などによるデータの消失や不整合も起こりえます。 また、連絡が取れたとしても場所が離れていれば、現象の調査も容易ではありません。 いずれにしても、ユーザ、開発者双方が無駄な時間(=コスト)を消費することになります。 プロシージャ毎に例外処理を的確に定義するには開発時に膨大な時間がかかります。
Code Analyze Toolを使用すると、「VBAのエラー処理仕様*1」と「Erl関数」を応用して障害発生時に次のようなログを出力する例外ロジックを簡単に実装することができます。 例外情報ログ
「→」が例外の発生したプロシージャ名、 「↑」が中位の呼出元プロシージャ名、 「└」が最高位の呼出し元プロシージャ名、 ()内の数値は例外の発生行番号または下位プロシージャの呼出行番号、 これだけの情報があると「発生プロシージャと関連プロシージャを特定する」という作業を省き次の調査に進めますので、障害対応時間を大幅に短縮可能です。 以降、「処理の構成(考え方)」、「例外発生時の動作」、「必要なコードの設定方法」の順に説明していきます。
擬似構造化例外処理の構成
擬似構造化例外処理は、以下の要素で構成されます。 ●共通例外プロシージャ(例外処理専用) 例外の発生したプロシージャの例外トラップ手続き(後述)から呼出されるプロシージャです。 このとき受け取る次の情報に基づき、処理(1)、(2)を実行します。 呼出レベル プロシージャ名 モジュール名 (1) 例外情報、受け取り情報をログにスタック (2) 呼出レベルにより、次の処理を実行 最高位以外のとき 例外を再発行(例外を上位のプロシージャに引継ぐ) 最高位のとき スタックログの出力 障害メッセージの表示 その他(ワークブックのクローズなど)
●例外トラップ手続き 通常(利用者が定義する)プロシージャに定義する手続きです。 例外トラップ時に共通例外プロシージャを呼出し、次の情報を引き渡します。 呼出レベル プロシージャ名 モジュール名
●行ラベル 通常(利用者が定義する)プロシージャの行に設定するラベル(行番号)です。 ログに例外が発生した行番号を表示するために設定します。
擬似構造化例外処理による例外発生時の動作 「例外トラップ手続き」と「共通例外プロシージャ」が連携し、次の順に例外を処理します。 下位プロシージャの呼出し @、A 例外のキャッチによる共通例外プロシージャ呼出し B 例外の再発行による上位プロシージャへの引継ぎ C、E (VBAの例外処理仕様による) 引継いだ例外のキャッチによる共通例外プロシージャ呼出し D、F 擬似構造化例外処理の終了による復帰 G (共通例外プロシージャの処理内容に準ずる)
例外トラップ手続きおよび行ラベルの設定方法
例外トラップ手続きおよび行ラベルの設定例 黄色の部分が例外トラップ手続き、水色の部分が行ラベルです。
例外トラップ手続きの設定(定型文挿入機能を使用します) 定型文挿入機能は、あらかじめ登録された定型文(プロシージャコメント文、エラー処理文など)を、ショートカットキーでコードに挿入する機能です。 定型文の設定方法については、ヘルプをご参照願います。
定型文管理ファイルには、擬似構造化例外処理用の検証用に次の定型文が登録されています。 (赤字のパラメタは挿入時に変更されます)
●モジュール名定数の設定 モジュール宣言部にキャレットを移動して、Ctrl+Shift+3を押下します。 (モジュール追加時に設定してください)
●例外トラップ手続きの設定
宣言終了文にキャレットを移動して、Ctrl+Shift+1を押下します。
★例外トラップ手続き設定時の問題点および対処法 「Code Analyze Tool」は、ソースコードおよびフォーム定義などからプロシージャの種別を判定します。 例外トラップ手続の挿入時、プロシージャ種別に基づき呼出レベル(上記コードの「"S"」の部分)には、次のいずれかの直定数が設定されます。 "E"(最高位。イベントプロシージャ) "S"(最高位以外。その他のプロシージャ) しかし、「Code Analyze Tool」の仕様では次に該当するプロシージャを「その他のプロシージャ」と判定するため擬似構造化例外処理に不整合★が発生します。 ★最高位プロシージャであるにも関わらず、呼出レベルが"S" マクロメニューから実行されるプロシージャ OnAction、OnKeyプロパティに指定されたプロシージャ ワークシート、フォーム、レポート用関数プロシージャ これを回避するためには、つぎのいずれかの対処が必要となります。 (1)例外トラップ手続き設定後に、呼出レベルを"S"から"E"に変更する。 (2)プロシージャ名にイベントプロシージャ判定用プリフィックスを 「Code Analyze Tool」は、名前にこのプリフィックスが付加されたプロシージャを、イベントプロシージャとして取り扱います。 例えば、このプリフィックスが"Evt_"のとき、プロシージャ名が"Evt_セル移動"であればイベントプロシージャとして取扱い、例外トラップ手続の設定時、呼出レベルには"E"が設定されます。 このプリフィックスはオプション設定で変更可能です。 ★注意事項 例外トラップ手続き設定後にプロシージャ名を変更したときは、共通例外プロシージャ呼出文のプロシージャ名もあわせて変更してください。
行ラベルの設定(行ラベル設定機能を使用します) 行ラベルの設定は次のいずれかの方法で行ってください。 ●ショートカットキーによる設定・解除 編集中のプロシージャ内の行ラベルの設定(Ctrl+L)、 ●行ラベルダイアログによる設定・解除 モジュール、プロジェクト単位の設定が可能です。 IDEコマンドバーの
このように、「Code Analyze Tool」を使用すると開発時にひと手間かけることで障害対応時間を大幅に短縮できます。
(参考:定型文挿入機能フォーム)
|
||||||||
|Lab.3sについて|特定商取引に関する法律に基づく表記|個人情報の取扱について|商標等について|お問い合わせ| Copyright (C) 2005-2008 Lab.3S Corp. All Rights Reserved. |