Image

有限会社 Lab.3s (ラボ.スリーエス)

Tel:024(557)7571

福島県福島市泉長滝12-17

HOMEコード解析ツールフリーソフトExcelシステム開発Lab.3sについてお問い合わせ

 

障害対応を効率化するためのVBA擬似構造化例外処理

VBAでは例外が発生したときに次のダイアログが表示されます。

Image

 

この様な例外が、他のユーザが使用中に発生しかつ開発者に連絡も取れない場合などは困ったことになります。

ユーザがここから何をすれば分らないという状況に陥ってしまいますし、誤操作、電源断などによるデータの消失や不整合も起こりえます。

また、連絡が取れたとしても場所が離れていれば、現象の調査も容易ではありません。

いずれにしても、ユーザ、開発者双方が無駄な時間(=コスト)を消費することになります。

プロシージャ毎に例外処理を的確に定義するには開発時に膨大な時間がかかります。

 

Code Analyze Toolを使用すると、「VBAのエラー処理仕様*1」と「Erl関数」を応用して障害発生時に次のようなログを出力する例外ロジックを簡単に実装することができます。
 *1例外が発生したプロシージャで処理されない場合、例外を呼出元のプロシージャに引き継ぐ。

Image

例外情報ログ

------------------------------------------------<<例外情報>>

Excel.Version = 11.0

OS.Vertion = Windows (32-bit) NT 5.01

ワークブック名 = C:\LOG\VBA擬似構造化例外処理サンプル.xls

発生日時 = 2012/02/25 22:48:17

エラーNo = 13:型が一致しません。

 S_例外発生元 (4)  Mod_Test

       S_呼出レベル2 (8)  Mod_Test

       S_呼出レベル1 (3)  Mod_Test

       SBt_例外発生_Click (1)  Sheet1

」が例外の発生したプロシージャ名、

」が中位の呼出元プロシージャ名、

」が最高位の呼出し元プロシージャ名、

()内の数値は例外の発生行番号または下位プロシージャの呼出行番号、
その右はモジュール名です。

これだけの情報があると「発生プロシージャと関連プロシージャを特定する」という作業を省き次の調査に進めますので、障害対応時間を大幅に短縮可能です。

以降、「処理の構成(考え方)」、「例外発生時の動作」、「必要なコードの設定方法」の順に説明していきます。

 

 

 

擬似構造化例外処理の構成

 

擬似構造化例外処理は、以下の要素で構成されます。

共通例外プロシージャ(例外処理専用)

例外の発生したプロシージャの例外トラップ手続き(後述)から呼出されるプロシージャです。

このとき受け取る次の情報に基づき、処理(1)、(2)を実行します。

呼出レベル

プロシージャ名

モジュール名

(1) 例外情報、受け取り情報をログにスタック

(2) 呼出レベルにより、次の処理を実行

最高位以外のとき

例外を再発行(例外を上位のプロシージャに引継ぐ)

最高位のとき

スタックログの出力

障害メッセージの表示

その他(ワークブックのクローズなど)

 

例外トラップ手続き

通常(利用者が定義する)プロシージャに定義する手続きです。

例外トラップ時に共通例外プロシージャを呼出し、次の情報を引き渡します。

呼出レベル

プロシージャ名

モジュール名

 

行ラベル

通常(利用者が定義する)プロシージャの行に設定するラベル(行番号)です。

ログに例外が発生した行番号を表示するために設定します。

 

 

 

擬似構造化例外処理による例外発生時の動作

「例外トラップ手続き」と「共通例外プロシージャ」が連携し、次の順に例外を処理します。

Image

下位プロシージャの呼出し @、A

例外のキャッチによる共通例外プロシージャ呼出し B

例外の再発行による上位プロシージャへの引継ぎ C、E

(VBAの例外処理仕様による)

引継いだ例外のキャッチによる共通例外プロシージャ呼出し D、F

擬似構造化例外処理の終了による復帰 G

(共通例外プロシージャの処理内容に準ずる)

 

 

例外トラップ手続きおよび行ラベルの設定方法

 

例外トラップ手続きおよび行ラベルの設定例

黄色の部分が例外トラップ手続き、水色の部分が行ラベルです。
これを、当ツールを利用し効率よく入力していきます。

Public Sub S_呼出レベル1()

    

    Dim I              As Long

 

    On Error GoTo L_例外手続

    

1:     I = 0

    

2:     If I = 0 Then

3:         Debug.Print "*****"

    End If

    

4:     Call S_呼出レベル2

    

    Exit Sub

 

L_例外手続:

5:     Call S_共通例外処理("S", "S_呼出レベル1", DIf_モジュール名)

End Sub

 

例外トラップ手続きの設定(定型文挿入機能を使用します)

定型文挿入機能は、あらかじめ登録された定型文(プロシージャコメント文、エラー処理文など)を、ショートカットキーでコードに挿入する機能です。

定型文の設定方法については、ヘルプをご参照願います。

 

定型文管理ファイルには、擬似構造化例外処理用の検証用に次の定型文が登録されています。

(赤字のパラメタは挿入時に変更されます)

1.例外トラップ手続き設定用定型文

    On Error GoTo L_例外手続

         

    %Exit

 

L_例外手続:

    Call S_共通例外処理("%PT", "%PN", DIf_モジュール名)

%Exit → "End Sub""End Function""End Property"のいずれか

%PT   → イベントプロシージャ→"E"、その他のプロシージャ→"S"

%PN   → プロシージャ名

2.共通例外処理修正用定型文

    Call S_共通例外処理("%PT", "%PN", DIf_モジュール名)

%PT、%PN → 同上

3.モジュール名定数設定用定型文

Private Const DIf_モジュール名 = "%MN"

%MN   → モジュール名

 

モジュール名定数の設定

モジュール宣言部にキャレットを移動して、Ctrl+Shift+3を押下します。

(モジュール追加時に設定してください)

 

例外トラップ手続きの設定

(設定前)

Public Sub S_呼出レベル1()

    

End Sub ←宣言終了文

宣言終了文にキャレットを移動して、Ctrl+Shift+1を押下します。

(設定後)

Public Sub S_呼出レベル1()

    

    On Error GoTo L_例外手続

         

    Exit Sub

 

L_例外手続:

    Call S_共通例外処理("S", "S_呼出レベル1", DIf_モジュール名)

End Sub

例外トラップ手続き設定時の問題点および対処法

「Code Analyze Tool」は、ソースコードおよびフォーム定義などからプロシージャの種別を判定します。

例外トラップ手続の挿入時、プロシージャ種別に基づき呼出レベル(上記コードの「"S"」の部分)には、次のいずれかの直定数が設定されます。

"E"(最高位。イベントプロシージャ)

"S"(最高位以外。その他のプロシージャ)

しかし、「Code Analyze Tool」の仕様では次に該当するプロシージャを「その他のプロシージャ」と判定するため擬似構造化例外処理に不整合が発生します。

最高位プロシージャであるにも関わらず、呼出レベルが"S"

マクロメニューから実行されるプロシージャ

OnAction、OnKeyプロパティに指定されたプロシージャ

ワークシート、フォーム、レポート用関数プロシージャ

これを回避するためには、つぎのいずれかの対処が必要となります。

(1)例外トラップ手続き設定後に、呼出レベルを"S"から"E"に変更する。

(2)プロシージャ名にイベントプロシージャ判定用プリフィックスを
付加する。

「Code Analyze Tool」は、名前にこのプリフィックスが付加されたプロシージャを、イベントプロシージャとして取り扱います。

例えば、このプリフィックスが"Evt_"のとき、プロシージャ名が"Evt_セル移動"であればイベントプロシージャとして取扱い、例外トラップ手続の設定時、呼出レベルには"E"が設定されます。

このプリフィックスはオプション設定で変更可能です。

注意事項

例外トラップ手続き設定後にプロシージャ名を変更したときは、共通例外プロシージャ呼出文のプロシージャ名もあわせて変更してください。

 

行ラベルの設定(行ラベル設定機能を使用します)

行ラベルの設定は次のいずれかの方法で行ってください。

ショートカットキーによる設定・解除

編集中のプロシージャ内の行ラベルの設定(Ctrl+L)、
解除(Ctrl+Shift+L)に使用します。

行ラベルダイアログによる設定・解除

モジュール、プロジェクト単位の設定が可能です。

IDEコマンドバーの Image をクリックすると表示されます。

Image

 

 

 

このように、「Code Analyze Tool」を使用すると開発時にひと手間かけることで障害対応時間を大幅に短縮できます。

 

 

 

(参考:定型文挿入機能フォーム)

Image

 

 

Lab.3sについて特定商取引に関する法律に基づく表記個人情報の取扱について商標等についてお問い合わせ

Copyright (C) 2005-2008 Lab.3S Corp. All Rights Reserved.