UndoRecord オブジェクトを使用する

エンド ユーザーが Word で作業すると、元に戻すことができる操作がキュー ("元に戻すスタック") に記録されるため、ユーザーが操作を取り消す場合は、実行したアクションを取り消して元に戻すことができます。 元に戻すスタックは、リボンの Word ユーザー インターフェイスから [元に戻す] ボタンを通じて表示され、各アクションはスタック内の個別のレコードとして一覧表示されます。 Word オブジェクト モデルを使用した自動化では、これらの "元に戻すレコード" も元に戻すスタックに書き込まれますが、 を使用して元に戻すスタックを操作すると問題が発生する可能性があります。

開発者は、一連のアクションを使用して 1 つの論理タスクを実行するコードを記述する場合があります。ここで、各アクションは元に戻すスタック上の個別のエントリとして記録されます。 ただし、エンド ユーザーは各アクションを個別に元に戻すことができますが、個別ではなく、タスクのすべての手順を元に戻すことが論理的な場合があります。

たとえば、次のコード例に示すように、Word 文書のフッターに文書のメタデータを挿入するタスクを実行するコードを作成できます。

Sub AddDocMetadata() 
Dim rngFooter As Range 
 
    Set rngFooter = ActiveDocument.Sections(1) _ 
        .Footers(wdHeaderFooterPrimary).Range 
         
    With rngFooter 
        .Delete 
        .Fields.Add Range:=rngFooter, Type:=wdFieldFileName, Text:="\p" 
        .InsertAfter Text:=vbTab & vbTab 
        .Collapse Direction:=wdCollapseStart 
        .Fields.Add Range:=rngFooter, Type:=wdFieldAuthor 
    End With     
End Sub 

このコードを実行すると、元に戻すスタックには、コードで実行された操作に対応する元に戻すレコードが表示されます。

複数のエントリを対象にした [元に戻す] ボタン。

エンド ユーザーが "メタデータの挿入" タスクをロールバックまたは元に戻す必要がある場合は、タスクに関連付けられている各アクションを個別に元に戻す必要があります (Ctrl キーを押しながら Z キーを押すか、[ 元に戻す ] ボタンのドロップダウン矢印をクリックしてから、元に戻す操作を選択します)。 この場合、エンド ユーザーが 1 つのタスクに関連する一連の操作のうちの一部だけを元に戻すと、文書が予期しない状態になる可能性があります。

Word オブジェクト モデルを使用すると、一連の個々の操作をユーザー設定の元に戻すレコードにリンクすることでまとめて元に戻すことができるため、この問題を回避することができます。 ユーザー設定の元に戻すレコードは、Word オブジェクト モデルでは UndoRecord オブジェクトで表されます。

UndoRecord オブジェクトの使用

UndoRecord オブジェクトは、Word の Application オブジェクトのプロパティです。 ユーザー設定の元に戻すレコードを作成するには、UndoRecord オブジェクトの StartCustomRecord メソッドと EndCustomRecord メソッドを使用します。 たとえば、前の例を変更してユーザー設定の元に戻すレコードを含めたコード例を次に示します。

Dim objUndo As UndoRecord 
 
Sub AddDocMetadata() 
Dim rngFooter As Range 
 
Set objUndo = Application.UndoRecord 
 
'Begin the custom undo record and provide a name for the record 
objUndo.StartCustomRecord ("Add Doc Metadata") 
     
 Set rngFooter = ActiveDocument.Sections(1) _ 
        .Footers(wdHeaderFooterPrimary).Range 
         
 With rngFooter 
        .Delete 
        .Fields.Add Range:=rngFooter, Type:=wdFieldFileName, Text:="\p" 
        .InsertAfter Text:=vbTab & vbTab 
        .Collapse Direction:=wdCollapseStart 
        .Fields.Add Range:=rngFooter, Type:=wdFieldAuthor 
 End With 
 
'End the custom undo record 
objUndo.EndCustomRecord 
     
End Sub 

StartCustomRecord は、ユーザー設定の元に戻すレコードに含める操作の記録を開始するメソッドです。 StartCustomRecord メソッドの引数として、ユーザー設定の元に戻すレコードに名前を付けることができます。 名前を指定しない場合、Word は、レコードの名前として実行された最初のコマンドの Visual Basic 名を使用します。 ユーザー設定の元に戻すレコードの名前は、ユーザー インターフェイスの [元に戻す] ボタンの下矢印をクリックしたときに表示されます。

EndCustomRecord は、ユーザー設定の元に戻すレコードの記録を中止するメソッドです。 コードの StartCustomRecord の呼び出しから EndCustomRecord の呼び出しまでの間に実行されたすべての操作が 1 つの UndoRecord オブジェクトにリンクされます。 ユーザー設定の元に戻すレコードを作成するコードを実行すると、前のコード例の場合と同様に、ユーザー設定の元に戻すレコードが 1 つのエントリとして元に戻すスタックに表示されます。

1 つのエントリを対象にした [元に戻す] ボタン。

UndoRecord オブジェクト メンバー

次の表に、UndoRecord のその他の重要なメンバーを示します。

名前 メンバーの種類 説明
CustomRecordLevel プロパティ 現在アクティブなユーザー設定の元に戻す操作の呼び出し回数を指定する長整数型 (Long) を返します。 読み取り専用です。
CustomRecordName プロパティ すべてのユーザー設定の元に戻すアクションが完了したときに、元に戻すスタックに表示されるエントリを指定する文字列型 ( String ) の値を返します。 読み取り専用です。
IsRecordingCustomRecord プロパティ ユーザー設定の "元に戻す" 操作が記録されているかどうかを示す、ブール型 ( Boolean ) の値を取得します。 読み取り専用です。

ベスト プラクティス

  • ユーザー設定の元に戻すレコードは、それぞれ EndCustomRecord を呼び出して終了するようにしてください。 この呼び出しがない場合、レコードの終了位置が Word で判別されますが、コード実行の意図した位置にならないことがあります。

  • ユーザー設定の元に戻すレコード内で Document オブジェクトの Undo メソッドを呼び出すときは、呼び出す順序に注意してください。 ユーザー設定の元に戻すレコード内で誤った順序で Undo メソッドを呼び出すと、コード実行が意図した結果にならないことがあります。 ユーザー設定の元に戻すレコード内で Undo メソッドを呼び出す例を次に示します。

Sub UndoInUndoRecord() 
   
  Set objUndo = Application.UndoRecord 
  
  objUndo.StartCustomRecord ("New Paragraph") 
  
  ActiveDocument.Content.InsertAfter Text:=" The end." 
  ActiveDocument.Undo 
  ActiveDocument.Content.InsertAfter Text:=" The end, again." 
  ActiveDocument.Content.InsertAfter Text:=" The last end." 
 
  objUndo.EndCustomRecord 
 
End Sub

このコードを実行すると、Undo メソッド呼び出しの前にカスタム元に戻 レコード内の各アクションが元に戻されます。 Undo メソッドの呼び出し後のカスタム元に戻すレコード内の各アクションは、 に戻すスタックを配置します。

  • ユーザー設定の元に戻すレコード内では、文書を切り替えないようにしてください。 次のコード例では、ユーザー設定の元に戻すレコード内で文書を切り替えています。
Dim objUndo As UndoRecord 

Sub SwitchDocsInsideUndo() 
  Set objUndo = Application.UndoRecord objUndo.StartCustomRecord ("New Paragraph") 
  
  'Insert some text into the first document Documents(1).Content.InsertAfter "A new paragraph in doc1." 
  
  'Switch documents to the second document 
  'The custom undo record will terminate here Documents(2).Content.InsertAfter "A new paragraph in doc2." 
  
  objUndo.EndCustomRecord 
End Sub

このコードを実行すると、Word は、コードが 2 番目のドキュメントへの書き込みを開始すると、カスタムの元に戻すレコードを終了します。 プロシージャが終了したとき、"New Paragraph" という名前のユーザー設定の元に戻すレコードは最初の文書でしか記録されません。

  • ユーザー設定の元に戻すレコードを含むコードをデバッグ モードで実行するときは、コードを中断しないようにしてください。 Visual Basic エディターで元に戻すレコードを含むコードをデバッグ モードで実行している場合、コードがブレークポイントに到達すると、現在処理中のユーザー設定レコードがすべて自動的に終了されます。

サポートとフィードバック

Office VBA またはこの説明書に関するご質問やフィードバックがありますか? サポートの受け方およびフィードバックをお寄せいただく方法のガイダンスについては、Office VBA のサポートおよびフィードバックを参照してください。