none
VB.NETからWord文書内の同じスタイルの複数の文字列を取得したい RRS feed

  • 質問

  • お世話になります。

    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
     

    よろしく、お願い致します。

    2013年7月24日 1:44

回答

  • 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
    2013年7月25日 9:35

すべての返信

  • 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 例を追記
    2013年7月25日 1:44
  • 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
    2013年7月25日 9:35
  • MitsuoTAKEI さん

    投稿いただいた質問にgekka さんからの返信が参考になるのではないかと思います。
    私から[回答の候補に設定] させていただきましたが、
    さらに回答の内容に質問がありましたら[回答の候補の設定解除] をして返信できます。


    日本マイクロソフト株式会社 フォーラム オペレーター 星 睦美

    2013年7月30日 7:38
  • gekka様

    ご回答ありがとうございました。

    この辺のソースコードは初歩的な知識なのでしょうか?

    Webで検索しても、ヒットしなかったので、質問させていただきました。

    どうもありがとうございました。

    2013年7月31日 0:40
  • 星 睦美 様

    いろいろと、ご配慮いただきまして、ありがとうございました。

    別の質問なのですが、フォーラムの言語がスペイン語?

    になっているのですが、日本語表示させるにはどうしたらよいか

    お教えください。

    2013年7月31日 0:50
  • マイクロソフトからのお知らせに、かんたん フォーラム ガイド -他の言語で表示するには? を投稿しました。
    (現在、ユーザーのスレッドの一覧ページを表示した際に他の言語で表示される場合があるようです。)

    フォーラムの使い方など他にもご質問がありましたら、MSDN /TechNet フォーラムへのご意見ご要望 に投稿いただければ参考にさせていただきます。

    これからもよろしくお願いします。


    日本マイクロソフト株式会社 フォーラム オペレーター 星 睦美

    2013年7月31日 2:03