トップ回答者
VB.NETからWord文書内の同じスタイルの複数の文字列を取得したい

質問
-
お世話になります。
VB2008を使用して、Word2010の文書中にある段落内のスタイル文字列を取得したいのですが、
2個目以降の文字列をどのように取得したら良いのか、わかりません。ご存知の方お教え下さい。
Word文書の例:
スタイル1文字列(1) スタイル2文字列 スタイル1文字列(2) その他の文字列
やりたいこと:
上記例で、2個目以降のスタイル1文字列を抽出したい。
出来ていること:
一個目のスタイル1文字列は、以下のコードで取得できました。
'レンジのスタートとエンドを段落と合わせる r = objDocument.Paragraphs(i).Range '最初の文字列取得 With r.Find .ClearFormatting() .Forward = True .Format = False .MatchCase = False .MatchWholeWord = False .MatchByte = False .MatchAllWordForms = False .MatchSoundsLike = False .MatchFuzzy = False .MatchWildcards = False .Style = ”スタイル1” .Execute() End With
よろしく、お願い致します。
回答
-
Execute()を繰り返せば次の結果に進みますよ
Option Strict Off Module Module1 Sub Main() Dim objWord As Object Dim objDocument As Object objDocument = GetObject("C:\Test.doc") objWord = objDocument.Application objWord.Visible = False If (objDocument.Paragraphs.Count >= 1) Then For Each objStyle As Object In objDocument.Styles Console.WriteLine(objStyle.NameLocal) Dim objRange As Object Dim paragraphEnd As Long For i As Integer = 1 To objDocument.Paragraphs.Count objRange = objDocument.Paragraphs(i).Range paragraphEnd = objRange.End objRange.End = objRange.Start With objRange.Find Call .ClearFormatting() .Forward = True .Format = True .MatchCase = False .MatchWholeWord = False .MatchByte = False .MatchAllWordForms = False .MatchSoundsLike = False .MatchFuzzy = False .MatchWildcards = False .Style = objStyle.NameLocal Do While .Execute If (objRange.Start > paragraphEnd) Then '段落を超えたら段落検索を終了 Exit Do End If If (objRange.End > paragraphEnd) Then '結果の末尾が段落を超えたら段落末尾に修正 objRange.End = paragraphEnd End If Console.WriteLine(vbTab & objRange.Text) If (objRange.End = paragraphEnd) Then '段落末尾まで検索したら段落検索を終了 Exit Do End If Loop End With Next Next objDocument.Saved = True End If objWord.Quit() End Sub End Module
個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
- 回答の候補に設定 星 睦美 2013年7月29日 2:41
- 編集済み gekkaMVP 2013年7月30日 9:03 ミス修正
- 回答としてマーク MitsuoTAKEI 2013年7月31日 0:44
すべての返信
-
Mitsuo TAKEI さん、投稿ありがとうございます。
フォーラム オペレーターの星 睦美です。今回の質問に関して、私のほうでも考えてみました。
>2個目以降の文字列をどのように取得したら良いのか、わかりません。ご存知の方お教え下さい。Mitsuo TAKEI さんは以下のどのステップで質問をしたいのでしょうか。
ステップ1.2個目以降の文字列はどのようにしたら取得できるか、考えて、手順をひとつずつ言葉(文章)に書きだす。
例 - スタイル1文字列かどうか判定する処理。
- その処理を全ての段落を判定しおえるまで繰り返す。
ステップ2.人間が話したり、書いたりする言葉をプログラミング言語に置き換えてみます。
(コードの例を書いていただきましたので、Visual Basic の基本的な構文はご存じだと思います。)
ステップ3.作成したプログラムを実行して結果を確認してみます。MSDN フォーラムの回答者が役立つアドバイスができるのは、ステップ3で作成したプログラムの結果に関して質問した場合です。
もしステップ1やステップ2の場合は、書籍や以下のようなインターネットのページを参考にしたほうが効率的ではないかと思います。
・Visual Basic 2012/2010 超やさしい文法:
http://adonetvb.com/Learning/
日本マイクロソフト株式会社 フォーラム オペレーター 星 睦美
- 編集済み 星 睦美 2013年7月25日 2:03 例を追記
-
Execute()を繰り返せば次の結果に進みますよ
Option Strict Off Module Module1 Sub Main() Dim objWord As Object Dim objDocument As Object objDocument = GetObject("C:\Test.doc") objWord = objDocument.Application objWord.Visible = False If (objDocument.Paragraphs.Count >= 1) Then For Each objStyle As Object In objDocument.Styles Console.WriteLine(objStyle.NameLocal) Dim objRange As Object Dim paragraphEnd As Long For i As Integer = 1 To objDocument.Paragraphs.Count objRange = objDocument.Paragraphs(i).Range paragraphEnd = objRange.End objRange.End = objRange.Start With objRange.Find Call .ClearFormatting() .Forward = True .Format = True .MatchCase = False .MatchWholeWord = False .MatchByte = False .MatchAllWordForms = False .MatchSoundsLike = False .MatchFuzzy = False .MatchWildcards = False .Style = objStyle.NameLocal Do While .Execute If (objRange.Start > paragraphEnd) Then '段落を超えたら段落検索を終了 Exit Do End If If (objRange.End > paragraphEnd) Then '結果の末尾が段落を超えたら段落末尾に修正 objRange.End = paragraphEnd End If Console.WriteLine(vbTab & objRange.Text) If (objRange.End = paragraphEnd) Then '段落末尾まで検索したら段落検索を終了 Exit Do End If Loop End With Next Next objDocument.Saved = True End If objWord.Quit() End Sub End Module
個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
- 回答の候補に設定 星 睦美 2013年7月29日 2:41
- 編集済み gekkaMVP 2013年7月30日 9:03 ミス修正
- 回答としてマーク MitsuoTAKEI 2013年7月31日 0:44
-
マイクロソフトからのお知らせに、かんたん フォーラム ガイド -他の言語で表示するには? を投稿しました。
(現在、ユーザーのスレッドの一覧ページを表示した際に他の言語で表示される場合があるようです。)
フォーラムの使い方など他にもご質問がありましたら、MSDN /TechNet フォーラムへのご意見ご要望 に投稿いただければ参考にさせていただきます。
これからもよろしくお願いします。
日本マイクロソフト株式会社 フォーラム オペレーター 星 睦美