tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルReplace:=Word.WdReplace.wdReplaceOneを入れるとFind.Executeの検出位置が変わります
記事No9416
投稿日: 2009/09/22(Tue) 20:33
投稿者camputer
 こんばんは、いつも行き詰った時に勉強させていただいております。camputerと申します。
プログラム歴10年(うちVB.NET歴約1年)です。
開発環境はXP+Word2003+VB2008になります。
質問させていただきます。どうぞよろしくお願いいたします。

 Word文書の置換において、
まず一度検索実行して( Find.Execute() )から、その後に
@「検索継続」のみするか( Find.Execute() )、
A「検索継続+置換をする」か(Find.Execute(Replace:=Word.WdReplace.wdReplaceOne) )を
選択したいのですが、@とAで何故か検出位置が異なっております。
 Word文書の
「aaa
 aaa」(←Word文書の1行1文字目から2行3文字目)
で「a」の検索を下のコードで実行いたしますと、
Find.Execute()の場合だとメッセージボックスが
「a/0」
「b/0」
「c/1」
となるのに対し、Find.Execute(Replace:=Word.WdReplace.wdReplaceOne)の場合だと
「a/0」
「b/0」
「c/4」
となり、Word文書の1行目をすべて飛ばして2行1文字目の「a」が1番に
検出されてしまいます。。。

    (長くなりますが,宣言文も載せさせていただきます)
          Dim mywd As New Word.Application
            Dim myDocs As Word.Documents = mywd.Documents
      Dim myDoc As Word.Document = myDocs.Open("C:\Test.doc")
                   :
             :
            Dim mywdApp As Word.Application = mywd.Application
            Dim mywdAppSele As Word.Selection = mywdApp.Selection
            Dim mywdAppSeleFind As Word.Find = mywdAppSele.Find
            Dim mywdAppSeleFindRep As Word.Replacement = mywdAppSeleFind.Replacement
      mywdAppSeleFind.ClearFormatting()
            mywdAppSeleFindRep.ClearFormatting()
            MRComObject(mywdAppSeleFindRep)
           
              mywdAppSele.WholeStory()
                With mywdAppSele.Find
                    .Text = "a"
                    .Replacement.Text = "z"
                    .Forward = True
                    .Wrap = Microsoft.Office.Interop.Word.WdFindWrap.wdFindContinue
                    .Format = False
                    .MatchCase = True
                    .MatchWholeWord = False
                    .MatchByte = False
                    .MatchAllWordForms = False
                    .MatchSoundsLike = False
                    .MatchWildcards = False
                    .MatchFuzzy = True
                End With

                MsgBox("a" & "/" & mywdAppSele.Start)
                mywdAppSeleFind.Execute()
                MsgBox("b" & "/" & mywdAppSele.Start)

                'mywdAppSeleFind.Execute()  '←@ ↓A  問題の2行でございます
                mywdAppSeleFind.Execute(Replace:=Word.WdReplace.wdReplaceOne)
                MsgBox("c" & "/" & mywdAppSele.Start)

 色々とテストいたしましたところ、1文字目に検索対象がある時のみ起こる現象のようで、
「baa
 aaa」
を検索いたしますと、どちらのコードでも
「a/0」
「b/1」
「c/1」
となり、同じ検索を実行することができます。

 いつもは検索で引っかかったコードや引数などを,自分で手当たり次第変更したり,
多数のサンプルを作って試すことで原因を掴むのですが,本案件につきましては
解決に至りませんでした。。。原因が想像つきません。。
何か怪しそうなところを御指摘・アドバイスいただけないでしょうか。
 何卒よろしくお願いいたします。

[ツリー表示へ]
タイトルいったん質問クローズさせてください.
記事No9418
投稿日: 2009/09/25(Fri) 21:54
投稿者camputer
 こんばんは、質問させていただいたcamputerでございます。

 質問させていただいた後ずっと、色々なパターンでテストを行ってみましたが,
本症状に関してはもしかすると、VBの、というよりもOfficeに関する何かに
起因して発生するという可能性もあるのかな?とも思えてきたのと,
今ちょうどNEWマークが消えてしまったということもありますので,
タイトル通りいったん質問をクローズさせていただければと思います。
本質問については当分,VB花ちゃん内で留めさせていただければと思います.

 さまざまなパターンの文書を作成してみまして
@「検索継続」のみするか( Find.Execute() )、
A「検索継続+置換をする」か( Find.Execute(Replace:=Word.WdReplace.wdReplaceOne) )
の比較を行ってみましたが、現時点で他にはこれらの動作の違いは発見されませんでした。
そこで今回のような「1行1列目に検索対象が存在する」場合のみ例外処理を
入れておく事にしようかな、と考えております。(あまり例外処理ばかり通してしまうと
コードが重たくなるので、好ましくないと思うのですが。。。^^;  あとおそらく
原因が分かっていないで類似したバグに気付かないままコーディングし続けることに
なるのは避けたいので、できれば根本解決が不可でも何が原因なのかだけでも把握して
おきたかったもので。。。)
 本症状については,応急処置による対応でも自分が作りたいソフトが何とか
できそうなので,このままコーディングを続けようと思います。


 >花ちゃん様
 VB掲示板とサイトのご提供をどうもありがとうございます。
おかげでいつもお名前しか閲覧させていただけなかったような
VB界のVIPの方々からアドバイスいただけて非常に光栄でございます.
検索・自己流テストだけでは解明できなかった問題の多くが解決できております。
(私の思い込みや勘違いを御指摘いただくことが多々ですが。。。^^;)
 上記のような理由で,いったんクローズさせていただければと思います.

 また何か原因が解明できそうな症状等発見いたしましたら,私からこの書き込みの続きに
ご報告させていただきたいのと,その時には是非今お世話になっているVB花ちゃんに
いらっしゃる上級者の方々からご意見をいただきたいので,本案件の投稿については
当分はVB花ちゃん内に留めさせていただきたいと思います.
どうぞよろしくお願いいたします.



 本質問を少しでも閲覧してくださった方々、また原因を少しでも考えてくださった方々に
心より御礼申し上げます。
(こんな変な質問はあまり閲覧していただいてないかもしれませんが。。。^^;
もし一人で騒いでおりましたら申し訳ございません orz)

 どうもありがとうございました!!! camputer.

[ツリー表示へ]