9

初期化イベントで発生するエラー以外の VBA ユーザーフォーム内のエラーは、呼び出し元のメソッドにバブルアップされているようには見えません。エラーを強制的に発生させる方法はありますか?

VBA ユーザーフォームには、次のように定義されている userform_error という名前のイベントが含まれています。

Private Sub UserForm_Error(
    ByVal Number As Integer, 
    ByVal Description As MSForms.ReturnString, 
    ByVal SCode As Long, 
    ByVal Source As String, 
    ByVal HelpFile As String, 
    ByVal HelpContext As Long, 
    ByVal CancelDisplay As MSForms.ReturnBoolean
)

ユーザー フォームでエラーが発生したときに UserForm_Error イベントが呼び出されるのは理にかなっているように見えますが、そうではないようです。実際、Userform_Error に関するドキュメントは見つかりません。

MSDN、Bing、Google、StackOverflow、DuckDuckGo を検索しましたが、適切な方法や UserForm_error の実際の動作に関するドキュメントを見つけることができませんでした。

4

3 に答える 3

5

これについて正確な情報を提供することは困難です。コンポーネントは古いものです。ほんの少しの背景。

UserForm オブジェクトは、ActiveX コンポーネント ライブラリである Microsoft Forms 2.0 によって実装されます。フォームを任意のアプリケーションに追加するための汎用ライブラリであり、Office アプリに限定されませんでした。これは、マシンの c:\windows\syswow64\fm20.dll (32 ビット マシンの場合は system32) にあります。このコンポーネントのドキュメントは、以前は fm20.chm によって提供されていました。このヘルプ ファイルは Microsoft から入手できなくなりましたが、Google クエリで見つけることができます。ただし、それを提供するほとんどのサイトは非常に怪しげに見えます。 これは最もぬるぬるしていませんでした。実際にこのファイルを表示するのは非常に面倒です。目次を参照することはできますが、どのページにもテキストが表示されなくなりました。

私が見つけた 1 つの回避策は、HTML Workshop ユーティリティを使用してファイルを逆コンパイルすることでした。これにより、f3evtError.htm という名前のファイルが作成されました。次のようになります (内容を編集しています)。


エラー イベント

コントロールがエラーを検出し、呼び出し元のプログラムにエラー情報を返すことができない場合に発生します。

構文

Private Sub object_Error( ByVal Number As Integer, ByVal Description As MSForms.ReturnString, _
    ByVal SCode As SCode, ByVal Source As String, ByVal HelpFile As String, _
    ByVal HelpContext As Long, ByVal CancelDisplay As MSForms.ReturnBoolean)

エラー イベントの構文には、次の部分があります。

  • 必要なオブジェクト。有効なオブジェクト名。
  • 索引: 必須。このイベントに関連付けられた MultiPage 内のページのインデックス。
  • 番号: 必須。コントロールがエラーを識別するために使用する一意の値を指定します。
  • 説明: 必須。エラーのテキストによる説明。
  • Sコード: 必須。エラーの OLE ステータス コードを指定します。下位 16 ビットは、Number 引数と同じ値を指定します。
  • ソース: 必須。イベントを開始したコントロールを識別する文字列。
  • HelpFile: 必須。エラーを説明するヘルプ ファイルの完全修飾パス名を指定します。
  • HelpContext: 必須。エラーの説明を含むヘルプ ファイル トピックのコンテキスト ID を指定します。
  • CancelDisplay: 必須。エラー文字列をメッセージ ボックスに表示するかどうかを指定します。

備考

エラー イベント用に記述されたコードによって、コントロールがエラー状態にどのように応答するかが決まります。

エラー状態を処理する能力は、アプリケーションによって異なります。アプリケーションが処理できないエラーが発生すると、Error イベントが開始されます。


残念ながらこれだけです。コンポーネントは非常に多くの異なる種類の ActiveX ホストで使用でき、エラー トラップはホスト実装の詳細であるため、あいまいです。最後の段落はあなたが本当に求めているものだと思います。Office のドキュメントでは言及されていないため、実際には Office アプリがこのイベントをトリガーしないと想定するのはかなり安全だと思います。イベントが VBA エディターで引き続き表示されるという事実は、オブジェクト モデルの動作の副作用にすぎません。エディターがそれをフィルターで除外する簡単な方法はありません。オブジェクトの公開されたすべてのイベントを表示するだけです。

于 2013-08-06T02:57:49.780 に答える
1

ユーザー フォーム コード (クラス) でエラーをトラップし、エラー トラップ コードで、モジュール内のプロシージャを呼び出してエラーの詳細をメイン コードに渡すことができます。

または、呼び出し元のコードでUserForm 変数WithEventsを宣言し、エラーが発生したときに独自のエラー イベントを発生させることもできます。

于 2013-08-01T00:02:44.053 に答える