2011-07-08 8 views
3

プログラムで単語の文書を繰り返し処理するとき、段落が目次の一部(実際にはフィールドの一部を形成するもの)の一部であるかどうかを知ることができます。Word文書で目次を区別する

私は、Word.Paragraphsコレクションを反復することで、ドキュメントから実体的なテキストの段落の最初のカップルを抽出するはずのVBプログラムを用意しています。私は結果に目次やその他のフィールドの表を含めることを望んでいません、私は人間がヘッダー、タイトルまたは通常のテキスト段落として認識するものが欲しいだけです。しかし、目次があれば、目次だけでなく目次にあるすべての行がWord.Paragraphsの別個の項目として表示されることが分かります。私はこれらを望んでいませんが、段落オブジェクトで、それらを区別して無視することができるプロパティを見つけることができませんでした(私は、他のフィールド型にも適用するためのソリューションが必要であると推測しています。私はまだ実際に遭遇していないが、同じ問題を引き起こす可能性があると推測している)

答えて

1

Wordオブジェクトモデルの制限のため、これを実現する最善の方法は、TOCフィールドコードを一時的に削除し、Word文書を繰り返し処理してから、TOCを再挿入することです。 VBAで、それは次のようになります。

Dim doc As Document 
Dim fld As Field 
Dim rng As Range 

Set doc = ActiveDocument 

For Each fld In doc.Fields 
    If fld.Type = wdFieldTOC Then 
     fld.Select 
     Selection.Collapse 
     Set rng = Selection.Range 'capture place to re-insert TOC later 
     fld.Cut 
    End If 
Next 

段落を抽出するためのコードを反復処理し、その後、

Selection.Range = rng 
Selection.Paste 

あなたは.NETでコーディングしている場合、これはかなり密接に変換する必要があります。また、これはWord 2003以前のバージョンでは機能するはずですが、Word 2007/2010の場合、TOCは作成方法に応じて、追加の検出とコードの書き込みが必要なコンテンツコントロールのような領域を持つことがあります。

+0

ありがとう、それは私が必要としていたものです。私はそれを試しました。あなたのコードはうまくいきました。実際にはコードを単純化しました。文書を保存しないので、最後に復元する範囲を選択する必要はありませんでした.-文書をSaveChangesで閉じました。= False私が必要としたテキスト – PhantomDrummer

0

ドキュメントの各セクションにカスタムスタイルを作成することができます。

Custom styles in Word 2003 (not sure which version of Word you're using)

次に、あなたの段落コレクションを反復処理するときには、.Styleプロパティを確認することができますし、安全に、それはあなたのTOCStyleに等しい場合、それを無視します。

私は同じテクニックがテーブルでもうまくいくと思います。

+0

ありがとうございます。しかし残念なことに、私は単語の文書そのものを制御することができないので、その解決策は不可能です。私はすでに準備されている文書から情報を抽出しようとしています。そのため、すでに存在するスタイルがあればそれを使用しなければなりません。 – PhantomDrummer

+0

TOCに一貫した書式設定規則が適用されていますか? –

+0

残念ながら、私が処理しているdocsという単語は、さまざまなソースから来ているので、一貫した書式設定ルールに頼ることはできません。私は基本的にヘッダーやタイトルなどを区別するためのスタイルに依存しています。文書が不適切にスタイルされているときには時折悪い結果が生じることは承知しています。しかし、一般的な原則を使用して私が望む結果を向上させることができ、段落が目次のようなフィールドの一部であることを区別することができるのは、かなりの改善です。 – PhantomDrummer

1

これは保証されていませんが、標準のWordスタイルがTOCに使用されている(可能性が高い)場合、誰も自分のスタイルに "TOC"が付いていない場合はOKです。これは粗末なアプローチですが、実行可能です。

Dim parCurrentParagraph As Paragraph 

If Left(parCurrentParagraph.Format.Style.NameLocal, 3) = "TOC" Then 

     ' Do something 

End If 
関連する問題