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

VBAによるword文書の一括処理について教えて下さい。
※当方の環境はWin10(64bit)でwordは2007年版を使っております。

復数の段落からなるword文書に対して、
各段落の先頭(行頭)に文字列を追加したいと考えております。
=> 段落の数が多いため、vbaを使って下記のようなマクロを作り、
一括で処理しようとしているのですが、期待する動作にならず困っております。

下記サンプルのfor eachで、
(1)のmsgboxによる段落(内容)表示のみですと、
期待通りに各段落の内容がポップアップ表示されたのですが、
(2)の文字列追加の部分を追加すると、
同じ段落内で繰り返し<sample>が追加されてしまいます。

例えば、一つ目の段落が「私は山田です」だとすると、
<sample>私は山田です
<sample><sample>私は山田です
<sample><sample><sample>私は山田です
...
のように1つ目の段落に対して処理が繰り返されてしまいます。


=> 何故このような動作になるのかのロジックを理解していないため、
どこを直せば良いのか分からない状態です。
=>当方vbaの初心者のため、基礎的な勘違いをしているかもしれませんが、
ご教示お願い致します。


==== 以下、マクロのサンプル ====================
Sub Macro1_test()

Dim myPara As Paragraph

'### 選択範囲の段落を対象に繰り返し処理
For Each myPara In Selection.Range.Paragraphs

'(1) 各段落の文字列を確認
MsgBox myPara.Range.Text

'--- (2) 各段落の先頭に文字列(<sample>)を追加 -----
tmp = "<sample>" & myPara.Range.Text
myPara.Range.Text = tmp
'=> 本当は文字列を代入したら、次の段落に進んでほしい…が、
' 何故か同じ段落内で繰り返される
'---------------------------------------------------------

Next myPara

End Sub
==== ここまで、マクロのサンプル ==================

A 回答 (2件)

質問のマクロだと、選択範囲がNextの前で解除されるので、同じ段落を繰り返し処理するのだと思います。



変数のtmpを使わないで、WordのVBAにあるInsertBefore メソッドを使ったほうが確実です。
https://msdn.microsoft.com/ja-jp/library/office/ …
マクロの例
' ==== 以下、マクロのサンプル ====================
Sub Macro2_test()
Dim myPara As Paragraph

'### 選択範囲の段落を対象に繰り返し処理
For Each myPara In Selection.Range.Paragraphs

 With myPara.Range
   ' (1) 各段落の文字列を確認
  MsgBox myPara.Range.Text
  ' (2) 確認した段落の先頭に指定文字列を追加
  .InsertBefore "<sample>"
 End With

Next

End Sub
' ==== 以下、マクロのサンプル ====================
    • good
    • 0
この回答へのお礼

御礼が遅くなり失礼しました。
例示して頂いた「InsertBefore」や「InsertAfter」を使えば、
段落の先頭・末尾に文字列が追加され、
ループも期待通りに動作することが確認できました。

ただ、先頭・末尾以外に文字列を付け加えたい場合や、
段落の文字列全体を置換するような場合には
別の方法が必要なのでもう少し勉強してみたいと思います。

お礼日時:2017/04/25 15:09

No.1の回答者です。


マクロの最後にあるコメントが間違っていますね。
' ==== ここまで、マクロのサンプル ================
を入れるつもりが、貼り付けるものを間違えました。

質問のマクロだと、選択範囲であるSelection.Range.Paragraphsを使用
していますが、文書全体ならActiveDocument.Range.Paragraphsにして
処理してもよいですね。

' ==== 以下、マクロのサンプル ====================
Sub Macro3_test()
Dim myPara As Paragraph

' ### 文書全体の段落を対象に繰り返し処理
For Each myPara In ActiveDocument.Range.Paragraphs

With myPara.Range
.InsertBefore "<sample>"
End With

Next

End Sub
' ==== ここまで、マクロのサンプル ================
    • good
    • 0
この回答へのお礼

御礼が遅くなり失礼しました。
コメントの修正までして頂きありがとうございます。

お礼日時:2017/04/25 15:09

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