Word 2007 以降のバージョンで、コンテンツ コントロールの追加や削除をしていないにもかかわらず ContentControlBeforeDelete および ContentControlAfterAdd イベントが発生する場合がある

現象
Microsoft Office Word 2007 以降のバージョンで、ContentControlBeforeDelete および ContentControlAfterAdd イベントが、コンテンツ コントロールの追加や削除をしていないにもかかわらず、コンテンツ コントロール内で以下の特定の操作を実行すると発生します。

この現象は、コンテンツ コントロールの内容に以下の変更を行なった後、[元に戻す] または [やり直す] を実行すると発生します。
  • 半角英数以外の文字を入力する
  • フォントの書式を変更する
  • 段落書式を変更する
  • スタイルを変更する
  • オブジェクトを挿入する
原因
この現象は、コンテンツ コントロールに対して行なった特定の変更に対して [元に戻す] または [やり直す] を実行すると、Word の内部でコンテンツ コントロールが再構築され、その際にイベントが発生するように実装されていることが原因で発生します。
回避策
ContentControlBeforeDelete および ContentControlAfterAdd のイベントが、コンテンツ コントロールの削除または追加により発生したイベントであるか、もしくは、[元に戻す] または [やり直し] の実行により発生したイベントであるかを判断するには、以下のパラメータ値で判断してください。

ContentControlBeforeDelete または ContentControlAfterAdd イベントの InUndoRedo パラメータの値が "True" の場合は、[元に戻す] または [やり直す] で発生したイベントとなります。

また、[元に戻す] または [やり直す] で発生するイベントは Word の実装によってトリガが発生しますが、実際にはコントロールは追加または削除されません。そのため、イベント引数の ContentControl オブジェクト ID の変更の有無でも判断することができます。
詳細

問題の再現手順

  1. Word を起動します。
  2. [開発] タブをクリックし、[リッチテキスト コントロール] をクリックして、Word 文書に挿入します。
  3. [Visual Basic] アイコンをクリックします。
  4. [表示] メニューの [イミディエイト ウィンドウ] をクリックします。
  5. [ThisDocument] に、確認用の以下のコードを入力します。
    Private Sub Document_ContentControlAfterAdd(ByVal NewContentControl As ContentControl, ByVal InUndoRedo As Boolean)Debug.Print "ContentControlAfterAdd"End SubPrivate Sub Document_ContentControlBeforeDelete(ByVal OldContentControl As ContentControl, ByVal InUndoRedo As Boolean) Debug.Print "ContentControlBeforeDelete"End Sub
  6. Word 文書に戻り、[リッチテキスト コントロール] に半角英数字以外の任意の文字列を入力します。
  7. Ctrl + Z キーを押して、入力前の状態に戻します。

結果

Document.ContentControlBeforeDelete、Document.ContentControlAfterAdd イベントが発生し、イミディエイト ウィンドウに以下のイベントが出力されます。

ContentControlBeforeDelete
ContentControlAfterAdd
プロパティ

文書番号:2188032 - 最終更新日: 10/04/2016 14:06:00 - リビジョン: 4.0

Microsoft Office Word 2007, Microsoft Word 2010

  • kbharmony kbexpertiseinter kbtshoot kbbug KB2188032
フィードバック