Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Excel 2016)
エクセルでワードを操作する
投稿日時: 20/06/12 06:20:02
投稿者: さむさむ

いつもお世話になっています。
エクセルでワードオブジェクトを操作しています。
内容はワードの特定行の変更です。コードは下記になります。
    With wdDoc.Content.Find '日付
            .Text = wds.Item(2).Text
                  TutiB = StrConv(Format(YMD, "ggge年m月d日"), vbWide) & " "
            .Replacement.Text = Replace(.Text, .Text, TutiB) '2行目の日付を換える
            .Forward = True
            .Execute Replace:=1
        End With
ワード2行目の日付を書き換えるものなのですが、日付のところで3行目への改行が入っています。
コードを実行すると改行コードまで変更され2行目と3行目が一つのセンテンスになります。
これを回避することができません。どううした指定文字列のみ変換できるでしょうか?
また、なぜこうなんでしょうか?ご教示ください。
またこれは
 With ActiveDocument.Sentences(i)
          With .Find
            .Text = ActiveDocument.Sentences(i).Text
             TutiB = StrConv(Format(rewd(j), "ggge年m月d日"), vbWide)
            .Replacement.Text = Replace(.Text, .Text, TutiB )
            .Forward = True
            .Execute Replace:=2
          end with
end with
でも同じ事象です。

回答
投稿日時: 20/06/12 07:44:31
投稿者: WinArrow
投稿者のウェブサイトに移動

2行目
と表現されていますが
 
日付は、表の中(セル)に入っていませんか?

回答
投稿日時: 20/06/12 10:49:04
投稿者: sk

引用:
ワード2行目の日付を書き換えるものなのですが、
日付のところで3行目への改行が入っています
コードを実行すると改行コードまで変更され
2行目と3行目が一つのセンテンスになります

引用:
With wdDoc.Content.Find '日付
     .Text = wds.Item(2).Text
           TutiB = StrConv(Format(YMD, "ggge年m月d日"), vbWide) & " "
     .Replacement.Text = Replace(.Text, .Text, TutiB) '2行目の日付を換える
     .Forward = True
     .Execute Replace:=1
End With

引用:
.Text = ActiveDocument.Sentences(i).Text

Sentences コレクションから取得した Range オブジェクトの Text プロパティが返す値、
つまり文章全体のテキストの最後の文字が改行コードだからです。
 
「改行コードを含む文字列」を「改行コードを含まない文字列」で
置換しているわけですから、そうなるのは当然の結果です。
 
引用:
これを回避することができません。どううした指定文字列のみ変換できるでしょうか?

検索文字列に改行コードが含まれないようにするか、
置換文字列に改行コードを加えるようにするか、
どちらかで対応なさればよろしいでしょう。

回答
投稿日時: 20/06/12 14:23:05
投稿者: simple

ご指摘にありますように、改行コードを補う案です。

  .Replacement.Text = TutiB  & vbCr
としてみたらどうでしょうか。

回答
投稿日時: 20/06/12 14:43:22
投稿者: sk

もし本来の目的が「文書の 2 つめの段落(≠文章)に記述されている日付
(恐らく文書の発信日)を書き換えること」であって、その段落に
日付しか記述されていないのであれば、特に検索も置換もする必要はなく、
ただその段落のテキスト(改行コードを除く)を書き換えるコードを
実行するだけで済む問題だと思います。

回答
投稿日時: 20/06/13 17:04:43
投稿者: WinArrow
投稿者のウェブサイトに移動

置換対象の文字列が
表の中に入っている場合、
目視できている文字数+2バイト(Chr(13)+chr(7)となります。
それを考慮する必要があります。

回答
投稿日時: 20/06/13 18:31:31
投稿者: WinArrow
投稿者のウェブサイトに移動

> .Text = wds.Item(2).Text
 ↓
 Chr(13)が出現するまでの文字列にする
  
  .Text = Left(wds.Item(2).Text, InStr(wds.Item(2).Text, Chr(13)) - 1)

投稿日時: 20/06/14 12:57:47
投稿者: さむさむ

ありがとうございました。WordVBAのヘルプを読み直ししました。
下記で解決しました。
Sub WordOp(Fl, At, nob, YMD, ad, Jiyu)  FLは使わない
    Dim wdApp As Word.Application
    Set wdApp = CreateObject("word.application")
    wdApp.Visible = True
    Dim wdDoc As Word.document
     
     
    foldePath = ThisWorkbook.Path & "\見本\"
    Filename = Dir(foldePath & "*.docx") '" & Fl & "*")  FLは今回は1ファイルしかないので不要
    wdfilepath = foldePath & Filename 'Application.GetOpenFilename("Word ファイル (*.Doc), *.Doc")
     
    Set wdDoc = wdApp.Documents.Open(wdfilepath)
     
    DoEvents
    DoEvents
     
 
    rewd = Array(nob, Format(YMD, "ggge年m月d日"), At, ad, Jiyu)
    Rew = Array("〇", "令和2年〇〇月○○日", "あて", "東京都", "備考")
     
    With wdDoc
        For m = 0 To 4
            ew = .Characters.Count
            Set myRange = .Range(Start:=1, End:=ew)
             
            With myRange.Find
                .ClearFormatting
                .Text = Rew(m)
                With .Replacement
                    .ClearFormatting
                    .Text = rewd(m)
                End With
                .Execute Replace:=1, _
                Format:=True, MatchCase:=True, _
                MatchWholeWord:=True 'wdReplaceAll
            End With
            Set myRange = Nothing
        Next
        For K = 1 To 2
            .Sentences(K).FitTextWidth = MillimetersToPoints(42.3)
        Next
    End With
    Set wdDoc = Nothing
    Set wdApp = Nothing
End Sub