2017-05-20 3 views
1

特定のモジュールから呼び出されたVBAでよりスマートで正確なユーザーフォームの初期化をデバッグする方法があるかどうかは疑問でした。VBAの呼び出されたUserformを正確にデバッグする2016

Userform_initialisatizeに誤ったコードを書き込むとエラーが表示されますが、発生する箇所は表示されません。強調表示されているコードは単にcall Userform_intitializeです。どのコードを推測するかSub Userform_intitializeにエラーが含まれています。

小さなコードを追加するたびにテストランでユーザーフォームを段階的に構築することで、安定したユーザーフォームの初期化コードを効率的に作成できます。私は最後の成功したランから何が変わったのかを知っているから、特に試行が長い時間を費やす場合に、エラーがどこで発生するのかをすぐに知るとかなりの時間を節約できます。

vba Excel 2016のSub Userform_intitializeと呼ばれる部分で正確なエラーが発生した行を抽出する方法はありますか?

+1

「Userform_intitialize」の先頭にブレークポイントを置き、「F8」でステップバイステップを実行できます。しかし、私はなぜあなたが明示的に 'Userform_intitialize'を呼び出すのか困惑しています。このコードは、ユーザーフォームが読み込まれたときに自動的に呼び出されます(フォームのコンストラクタや初期化子など)。それを明示的に(良い習慣の規則によって)呼び出すべきではありません。 –

+0

うわー、ありがとう!私は最終的に抗力を見ることができるサイクリストのように感じる。直感的に隠れたコードを改善するのではなく、何が起きているのか分かります!そのような目が離せない:) まず、ユーザーフォームのシェイプ(たとえば、テキストボックスの数)をシート入力に基づいて計算する必要があります。そのため、動的なユーザーフォームです。私は動的な読み込みと初期化のすべてに困難を抱えていたので、私はこの構築に終わりました。しかし、私はポイントを理解する、私は正確な階層/ユーザーフォームの(の作成)の順序で練習する必要があります。 @ A.S.Hをお寄せいただきありがとうございます! –

+1

私はあなたのポイントを見ます。その場合、フォームを動的に「再初期化/再計算する」という別のルーチンを作成します。このルーチンは、 'Userform_initialize'と同様に任意の場所から呼び出すことができます。後者は最初に最初の構築を行い、別のルーチンを呼び出す必要があります。このような責任の分離は非常に有益です。 –

答えて

1

@A.S.H既に言及したように、Initializeイベントのハンドラは、privateのままである必要があります。これは、Initializeイベント自体がプライベートなので、インスタンス自体によって処理されるように意図されており、他の誰にも処理されないためです。

だから正確なエラーが2016 VBA Excelで呼ばれるサブUserform_intitialize以内に発生したラインでを抽出する方法がありますが?あなたの質問について

、はい、それは、エラーが発生した行番号を抽出するためにことも可能です。しかし、行はソースコードの一部である必要があります。次に、関数VBA.Information.Erlを使用して行番号を取得することができます。例:

ユーザーフォームモジュール

Option Explicit 

Private Const MODULE_NAME As String = "MyUserForm." 

Private Sub UserForm_Initialize() 
    On Error GoTo Error_In_UserForm_Initialize 

1 Const procName As String = "UserForm_Initialize" 

    ' Some code here 
2 Dim d As Date 
3 d = Now 
4 MsgBox "Hi from my userform! 'Now' is '" & d & "'", vbInformation, "Info" 

    ' Here error occures, max. value of Integer is 32.767 
5 Dim i As Integer 
6 i = 40000 

7 Exit Sub 

Error_In_UserForm_Initialize: 
8 Dim errorDescription As String 
9 With Err 
10  errorDescription = "Error '" & .Number & "'" & _ 
          " with description '" & .Description & "'" & _ 
          " occured in procedure '" & MODULE_NAME & procName & "'" & _ 
          IIf(Erl <> 0, " on line '" & CStr(Erl) & "'.", ".") 
11 End With 
12 MsgBox errorDescription, vbCritical, "Error" 
End Sub 

Erlhereまたはhereに関するいくつかの追加の測定値。

関連する問題