アプリ版:「スタンプのみでお礼する」機能のリリースについて

現在マクロの勉強中です。複数のワード文書に対して文字の置換を行うマクロがないかと調べたところ以下のようなマクロを見つけました。
 最後まで調べたのですが、置換用配列と文書全体を置換のつながりがうまく理解出来ません。
 ato(x) = Replace(parts(1), Chr(13), "")で置換するための文字列を指定していると思うのですが、Replace(置換する文字列を含む文字列, 検索する文字列, 置換する文字列)の構文に当てはめて考えた際にChr(13)で何を検索しているのかがわかりませんでした。どなたかわかる方がいらっしゃいましたら教えて欲しいです。

Sub 複数文書連続処理_リストを元に置換()
Dim mae(100)
Dim ato(100)

'置換用配列
Set paras = ActiveDocument.Paragraphs
x = 0
For i = 1 To paras.Count
thisline = paras(i).Range.Text
parts = Split(thisline, ";")
If UBound(parts) > 0 Then
mae(x) = parts(0)
ato(x) = Replace(parts(1), Chr(13), "")
x = x + 1
End If
Next i

'フォルダの選択
With Application.FileDialog(msoFileDialogFolderPicker)
.Title = "フォルダを選択"
.AllowMultiSelect = False
If .Show = -1 Then
mypath = .SelectedItems(1) & "\"
Else
MsgBox "終了します。"
Exit Sub
End If
End With

'Word文書に対する処理
myfile = Dir(mypath & "*.doc*")
Do While myfile <> ""
Documents.Open FileName:=mypath & myfile
For i = 0 To x - 1
Call 文書全体を置換(mae(i), ato(i))
Next i
ActiveWindow.Close SaveChanges:=wdSaveChanges
myfile = Dir
Loop
End Sub
Function 文書全体を置換(mae, ato)
Set myrange = ActiveDocument.Range(Start:=0, End:=0)
With myrange.Find
.ClearFormatting
.Text = mae
With .Replacement
.ClearFormatting
.Text = ato
End With
.Execute Replace:=wdReplaceAll
End With
End Function

A 回答 (4件)

文書全体を置換する設定がされているので大丈夫です。


  Replace:=wdReplaceAll
これが、文書全体で指定した[検索する文字列]を[置換後の文字列]に
すべて置換する設定なので。

Chr(13)は、Wordにおける段落記号を意味する文字コードです。
[ Enter ]キーを押して改行したときの記号ですね。
[ Shift+Enter ]キーを押したときの段落内改行はChr(11)になります。
ワイルドカードを使った置換などで使用することがあります。
http://office-qa.com/Word/wd390.htm

質問にあるマクロは、こちら↓のものですよね。
https://stabucky.com/wp/archives/13067
Word文書としてマクロのあるファイルに用意したリストを使うのに
必要な処理として、段落記号を含まないで配列を用意する必要がある
ために、Replace関数で処理をしているようです。
thislineの変数に段落全体を取り込むと、段落記号を含んでしまうので
Replace関数で処理をしていますが、取り込むときに最後の一文字分
含まないようにテキストで取り込めば、Replace関数を使わないでも
処理できるようになります。
置換用配列を以下のように書き換えます。

' 置換用配列
Set paras = ActiveDocument.Paragraphs
x = 0
For i = 1 To paras.Count
' 一文字分(段落記号)を除く範囲で取り込む
 With paras(i).Range
  thisline = Left(.Text, .Characters.Count - 1)
 End With
' 取り込んだテキストを配列に
 parts = Split(thisline, ";")
 If UBound(parts) > 0 Then
  mae(x) = parts(0)
  ato(x) = parts(1)
  x = x + 1
 End If
Next i

この書き方でも同じ処理をします。


ちなみに、Function 文書全体を置換(mae, ato) の中の処理について
冗長な書き方をしているので、以下のようにしても大丈夫です。

Function 文書全体を置換(mae, ato)
Set myrange = ActiveDocument.Range(Start:=0, End:=0)
 With myrange.Find
  .Text = mae
  .Replacement.Text = ato
  .Execute Replace:=wdReplaceAll
 End With
End Function
    • good
    • 0
この回答へのお礼

非常に丁寧なご説明ありがとうございます。分かりやすかったです。

お礼日時:2022/03/02 16:28

#2です


改行コードだけでは、しっくりこないかも知れません
食事から帰ったのでので追記します
#1様の回答にある通りです。

ActiveDocument.Paragraphs はアクティブドキュメントの段落コレクションを取得しています。コレクションなのでインデックスで特定行を抽出できます((設定ドキュメントの)全ての段落を対象にしています)
For i = 1 To paras.Count
thisline = paras(i).Range.Text
また、段落なので段落末には改行コードがあると言う事になり
置換時に問題が起こる可能性があります(例えば置き換えた時に段落が増える)
なので改行コードを""に置き換えています。(削除)

>置換用配列と文書全体を置換のつながりがうまく理解出来ません。

このコードは文章全体に対して置換処理を行っていません。(多分)

Set myrange = ActiveDocument.Range(Start:=0, End:=0)

セミコロンで区切られた文字列(段落)でセミコロンの左が置換文字
右が置換後の文字 をセットして
複数の*.doc*に対して 1行目に文字列に該当文字列がある場合
書き換える処理になると思います。

多分、様式や日付などを変更するためのコードではないかと思います

置換文字列は複数、、対象ファイルも複数、、、書き換え箇所は
1行目のみ、、のようですね。
    • good
    • 0

こんにちは


>Chr(13)で何を検索しているのかがわかりませんでした。どなたかわかる方がいらっしゃいましたら教えて欲しいです。
parts = Split(thisline, ";")は理解されているとして 改行コードが分からないと言う事でしょうか。

、、ごめんなさい。Excelですが、、参考サイトでどうぞ
https://www.tuna-kichi.com/entry/CrLf
    • good
    • 0

こんにちは



元のデータが、1行ごとに、
 置換前語句;置換後語句
として記入されているものと想像します。

これを置換前と置換後として配列に読み込んでいますが、置換後語句の最後にある改行コード(=Chr(13))を削除しているものと思います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!