MW211 EXIT

devlog
ExcelVBA/【未解決】エラー時の関数名
2019年10月29日
例えば以下のような例外が発生した場合に、どの関数(どのクラスのどのメソッド)で
発生したかをログに出力できたらすばらしい。
┌──────────────────────────────────────┐
│    On Error GoTo l_Catch                                                   │
│    MsgBox 1 / 0                                                            │
│    Exit Sub                                                                │
│l_Catch:                                                                    │
│    MsgBox Err.Description                          '→「0で除算しました。」│
└──────────────────────────────────────┘

でも、その簡単な方法が今のところ見当たらない。
例えば以下みたいに簡単に指定できればいいのだが。
┌──────────────────────────────────────┐
│    MsgBox __CLASS__                                                        │
│    MsgBox __METHOD__                                                       │
│    MsgBox __FUNC__                                                         │
└──────────────────────────────────────┘

まず、実行中の行番号がわかれば以下でいける。
#といっても、自身のソースファイル名を指定(With句の部分)する必要があるが
  モジュールなら「Application.VBE.ActiveCodePane.CodeModule」で取得できるが
┌──────────────────────────────────────┐
│With ThisWorkbook.VBProject.VBComponents("Moduleモジュール").CodeModule     │
│    MsgBox .ProcOfLine(Erl, 0)                                '→関数名     │
│End With                                                                    │
├──────────────────────────────────────┤
│With ThisWorkbook.VBProject.VBComponents("Classクラス").CodeModule          │
│    MsgBox .Name()                                             '→クラス名  │
│    MsgBox .ProcOfLine(Erl, 0)                                 '→メソッド名│
│End With                                                                    │
└──────────────────────────────────────┘
行番号は隠し関数の「Erl()」で取得できるのだが、微妙なのがその前準備。

普段使わない行番号を振っておかなければならないのだ。
┌──────────────────────────────────────┐
│77: On Error GoTo l_Catch                                                   │
│    MsgBox 1 / 0                                                            │
│    Exit Sub                                                                │
│l_Catch:                                                                    │
│    MsgBox Erl                                                     '→「77」│
├──────────────────────────────────────┤
│77: On Error GoTo l_Catch                                                   │
│88: MsgBox 1 / 0                                                            │
│    Exit Sub                                                                │
│l_Catch:                                                                    │
│    MsgBox Erl                                                     '→「88」│
└──────────────────────────────────────┘
かなりめんどくさい、これは却下か。

他にもっと簡単な方法はないものか。
分類:ExcelVBA