• 締切済み

Wordの文章中の一致した文字のある段落を削除する

MS-Wordの文章を検索して行頭に一致した文字がある段落を削除するマクロを作りたいと思いチャレンジしています。 たとえば,文章を頭から順に検索して,行頭にある文字が検索文字と一致した場合,その段落を削除して,次の行を検索し続け,文書が終わったら終了するようなマクロです。 小生,WordVBAを2日ほど前から学び始めたばかりで,ネットや参考書を探しまして,"@"マークが行頭にある段落を削除するというサンプルを作るところまでは何とかできたのですが,これを文章全体に一括して実行できるマクロにするにはどうすればよいかに手こずっています。 このマクロがあると仕事の効率がぐんとアップしますので,何とかしたいと思っています。 是非ご教いただければ大変ありがたく思います。 <サンプル> Sub test_DeleteParagraph() Selection.HomeKey Unit:=wdStory, Extend:=wdMove With Selection.Find .Forward = True .ClearFormatting .MatchWholeWord = True .MatchCase = False .Wrap = wdFindContinue If .Execute(FindText:="@", Forward:=True, Format:=True) = True Then Selection.HomeKey Unit:=wdLine, Extend:=wdMove Selection.MoveDown Unit:=wdParagraph, Extend:=wdExtend lVal = Selection End If Selection.Delete End With Selection.Find.ClearFormatting End Sub

  • mebot
  • お礼率33% (1/3)

みんなの回答

回答No.3

No.1の回答者です。 No.2の回答でスキルがないので分からないと書きましたが、スキル向上 のために調べてみるとWordマクロでもLeft関数が使えるようですね。 これを利用して、先頭の文字列が2文字以上でも検索できるものを用意しました。 Sub test6_DeleteParagraph() ' test5_の改良版 Dim para As Paragraph Dim Npara As Variant Dim LeftString As String For Each para In ActiveDocument.Paragraphs ' 指定文字があったら段落として選択  With para  ' 左から2文字目までの文字列を指定  LeftString = Left(para, 2)   If LeftString = "|v" Then    .Range.Select    Npara = para ' 選択範囲を次の段落まで拡張    With Npara     .Expand Unit:=wdParagraph     .MoveEnd Unit:=wdParagraph, Count:=1     .Delete    End With   End If  End With Next End Sub マクロの中の LeftString = Left(para, 2) で段落内の左から2文字 を取得して、指定文字列と取得した文字列が一致した段落と次の段落を 削除するようにしたものです。 たぶん、この回答で希望していることができると思います。 この質問に回答することで、少しですがスキルが向上したので、私個人として 勉強になりました。

回答No.2

No.1の回答者です。 test2_DeleteParagraphのマクロでは、検索した文字列のある段落範囲 に拡張されませんでしたね。 Selection.Findだけの場合は、前のままのRange.Expandでの拡張範囲の 設定ができないためでしたね。 前のものを修正してもよいのですが、面倒なのでRange.Expandを使える 方法を新たに作り直しました。 Sub test4_DeleteParagraph() ' test2_の改良版 Dim rng As Range Set rng = ActiveDocument.Range(0, 0) ' 検索文字を指定 With rng.Find  .Text = "@" End With ' 検索結果がTrueなら、次の段落まで拡張して削除を繰り返し  With rng   Do While .Find.Execute = True    .Expand Unit:=wdParagraph    .MoveEnd Unit:=wdParagraph, Count:=1    .Delete   Loop  End With End Sub 前の回答でも書きましたが、上記マクロは段落内に特定の文字があった 場合に、次の段落まで拡張して削除をするものです。検索する文字列が 段落内のどこにあっても、段落ごと削除されます。 段落先頭の文字が条件なら、以下の修正マクロでも可能です。 Sub test5_DeleteParagraph() ' test3_の改良版 Dim para As Paragraph Dim Npara As Variant For Each para In ActiveDocument.Paragraphs ' 指定文字があったら段落として選択  With para   If .Range.Characters.First = "@" Then    .Range.Select    Npara = para ' 選択範囲を次の段落まで拡張    With Npara     .Expand Unit:=wdParagraph     .MoveEnd Unit:=wdParagraph, Count:=1     .Delete    End With   End If End With Next End Sub このマクロの場合、先頭の1文字のみ対象にしていて、先頭以外に指定の 文字があっても削除されません。 それと、文字数は2文字以上を対象にはできません。 先頭の2文字以上を指定する方法は、私のスキルでは分かりません。

回答No.1

以下のように修正すれば可能だと思います。 Sub test2_DeleteParagraph() Selection.HomeKey Unit:=wdStory, Extend:=wdMove Selection.Find.ClearFormatting  With Selection.Find ' Selection.Findを使う場合は条件を入れたほうが良い   .Format = True   .Text = "@"   .Forward = True   .ClearFormatting   .MatchWholeWord = True   .MatchCase = False   .Wrap = wdFindContinue   .MatchAllWordForms = False   .MatchSoundsLike = False   .MatchWildcards = False   .MatchFuzzy = False    ' 検索結果がTreeなら、段落まで拡張して削除を繰り返し   With Selection    Do While .Find.Execute = True     .Range.Expand Unit:=wdParagraph     .Delete    Loop   End With  End With End Sub 上記マクロは、段落内に特定の文字があった場合に、段落へと拡張して 削除をするものですが、段落先頭の文字が条件なら、以下のマクロでも 可能です。 Sub test3_DeleteParagraph() Dim para As Paragraph For Each para In ActiveDocument.Paragraphs  With para   If .Range.Characters.First = "@" Then    .Range.Delete   End If  End With Next End Sub

mebot
質問者

お礼

早速のアドバイスをありがとうございました。 ご教示いただいたスクリプトで試してみました。 test2_DeleteParagraphでは,"@"は削除されたのですが,そのあとのテキストは残ってしまいました。 段落の削除が上手くいかないようです。 test3_DeleteParagraphでは,"@"が行頭にある段落が見事に削除されました。 これらのスクリプトを手本にして,行頭に"|v"のある段落を削除し,さらにその次の段落も削除するマクロを作りたいと思っています。 いろいろと試していますが,なかなかうまくいきません。 test2_DeleteParagraphでは,どうしても次の段落が削除できません。 test3_DeleteParagraphでは,行頭の検索が2文字になってしまいますので,このままではできないため試行錯誤していおります。 もしお時間がありましたら,アドバイスをいただけると大変ありがたいです。 よろしくお願いいたします。

mebot
質問者

補足

あれからいろいろ試してみました。 行頭の2文字を検索する件については,ワードの置換機能を使って事前に「@」に置換しておくことで対応しようと思います。 その後,このマクロを実行することで,行頭に「@」がある段落がまず削除され,その次の段落も削除されるようになりました。 親切にアドバイスいただきありがとうございました。 <サンプル> Sub DeleteParagraph() Selection.HomeKey Unit:=wdStory, Extend:=wdMove Selection.Find.ClearFormatting With Selection.Find ' Selection.Findを使う場合は条件を入れたほうが良い .Format = True .Text = "@" .Forward = True .ClearFormatting .MatchWholeWord = True .MatchCase = False .Wrap = wdFindContinue .MatchAllWordForms = False .MatchSoundsLike = False .MatchWildcards = False .MatchFuzzy = False ' 検索結果がTreeなら、段落まで拡張して削除を繰り返し With Selection Do While .Find.Execute = True Selection.HomeKey Unit:=wdLine, Extend:=wdMove Selection.EndKey Unit:=wdLine, Extend:=wdExtend Selection.Delete Selection.HomeKey Unit:=wdLine, Extend:=wdMove Selection.MoveDown Unit:=wdParagraph, Extend:=wdExtend Selection.Delete Loop End With End With End Sub

関連するQ&A

  • Wordのマクロの繰り返しと停止

    Wordで"XX"の場所に"★"の後にある文字列を挿入、という以下のマクロを記録したのですが、この作業を★がなくなるまで繰り返したいと思っております。どのように記入すればよいでようか? Selection.HomeKey Unit:=wdStory Selection.Find.ClearFormatting With Selection.Find .Text = "★" .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchByte = False .MatchAllWordForms = False .MatchSoundsLike = False .MatchWildcards = False .MatchFuzzy = False End With Selection.Find.Execute Selection.Delete Unit:=wdCharacter, Count:=1 Selection.Delete Unit:=wdCharacter, Count:=1 Selection.EndKey Unit:=wdLine, Extend:=wdExtend Selection.Cut Selection.HomeKey Unit:=wdStory Selection.Find.ClearFormatting With Selection.Find .Text = "XX" .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchByte = False .MatchAllWordForms = False .MatchSoundsLike = False .MatchWildcards = False .MatchFuzzy = False End With Selection.Find.Execute Selection.Paste Selection.TypeBackspace End Sub

  • WORD VBA 繰り返し処理

    WORD VBAについて教えてください。 つぎのようなマクロがあり、これを検索する文字列がなくなるまで、繰り返して、処理するようにしたいのですが、どうすればよいのでしょうか? Sub Macro1() Selection.Find.ClearFormatting With Selection.Find .Text = "あ" .Replacement.Text = "" .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchByte = False .MatchAllWordForms = False .MatchSoundsLike = False .MatchWildcards = False .MatchFuzzy = True End With Selection.Find.Execute Selection.MoveRight Unit:=wdCharacter, Count:=1 End Sub

  • ワードで選択範囲だけの改行を削除するマクロ

    こんにちは いつもお世話になっています ワード2010で、選択範囲だけの部分の改行を削除するマクロを記録マクロで作ったのですが、選択部以外もすべて改行してしまいます。どこがいけないのでしょうか。あるいは、操作の仕方でしょうか。以前は使えていたと思うのですが、仕様が変わったのでしょうか。 任意の範囲を選択しておいて、記録を開始しました。 よろしくお願いします。 Sub Macro1() ' ' Macro1 Macro ' ' Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = "^p" .Replacement.Text = "" .Forward = True .Wrap = wdFindAsk .Format = False .MatchCase = False .MatchWholeWord = False .MatchByte = False .MatchAllWordForms = False .MatchSoundsLike = False .MatchWildcards = False .MatchFuzzy = False End With Selection.Find.Execute Replace:=wdReplaceAll End Sub ネット上で見つけた以下のマクロでもすべての改行が削除されます。 http://okwave.jp/qa/q960285.html Sub Macro14() Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = "^p" .Replacement.Text = " " End With Selection.Find.Execute Replace:=wdReplaceAll End Sub

  • Word2010特定の名前を置き換えるマクロ

    例えば、Wordの文章で「田中」とあるものを「山田」に変えたい場合は、置き換えの機能を使ってマクロの記録ができると思います。 しかし、こうするとテキストボックスやヘッダフッタに記載された文字は変更できないように思います。 どうすれば、これらの文字も含めて置換の対象とすることができるか教えてください。 Sub Macro() Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = "山田" .Replacement.Text = "田中" .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchByte = False .MatchAllWordForms = False .MatchSoundsLike = False .MatchWildcards = False .MatchFuzzy = True End With Selection.Find.Execute Replace:=wdReplaceAll End Sub

  • ワードでマクロがうまくいきません。

    よろしくお願いします。 マクロの知識はほとんどないのですが、 「マクロの記録」の機能を使い、ワードで 「スペースを探し出し、そのスペースにアンダーラインを引く。」 ために、 -------------------- 編集ー置換ー 検索する文字列にスペースをタイプ、 置換後の文字列にスペースをタイプ、 オプションの書式で、フォント、下線、一重下線 すべて置換 -------------------- マクロの記録を選択した後、上のように作業しました。 そしてマクロの記録をとめました。 マクロの記録中の操作では、思い通りに置換されるのですが、 次にそのマクロを作動させると、なにもおこりません。 なにか変な操作をしたのか、と五度くらい試したのですが、 やはり動きません。 中身は、↓のようでした。 -------------------- Sub Macro2() ' Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = " " .Replacement.Text = " " .Forward = True .Wrap = wdFindContinue .Format = True .MatchCase = False .MatchWholeWord = False .MatchByte = False .MatchAllWordForms = False .MatchSoundsLike = False .MatchWildcards = False .MatchFuzzy = True End With Selection.Find.Execute Replace:=wdReplaceAll End Sub -------------------- どうしてうまく動かないのでしょうか。 教えていただけるとありがたいです。よろしくお願いします。

  • word2007 マクロ

    下記マクロは蛍光ペン部分を消して、その文字数分にアンダーラインを引くマクロになります これを改造して、赤文字を消して、その文字数分を空欄にしたいのです。 ですが、wdColorRedの入れ方が分かりません。ご教授お願いします。 Sub Problem() '蛍光ペン部分を消して、アンダーラインを引く Selection.Find.ClearFormatting Selection.Find.Highlight = True Selection.Find.Replacement.ClearFormatting Selection.Find.Replacement.Highlight = False With Selection.Find.Replacement.Font .Underline = wdUnderlineSingle .StrikeThrough = False .DoubleStrikeThrough = False .Outline = False .Shadow = False .Hidden = False .AllCaps = False .Superscript = False .Subscript = False End With With Selection.Find .Text = "*" .Replacement.Text = " ^z" .Forward = True .Wrap = wdFindContinue .Format = True .MatchCase = False .MatchWholeWord = False .MatchByte = False .MatchAllWordForms = False .MatchSoundsLike = False .MatchFuzzy = False .MatchWildcards = True End With Selection.Find.Execute Replace:=wdReplaceAll End Sub

  • 特定の色のマーキングだけを解除するマクロ

    Wordのマクロについての質問です 複数の色でマーキングしている文書があり、 特定の色のマーキングだけを解除するマクロを 作成していますが、マーキングの色の指定の仕方がわかりません。 マーキングの色の指定はどのよう(どこ)にすれば、よいのですか。 Sub マーキングなし() ' Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting Selection.Find.Replacement.Highlight = False With Selection.Find .ClearFormatting .Highlight = True .Text = "" .Replacement.Text = "" .Forward = True .Wrap = wdFindContinue .Format = True End With Selection.Find.Execute Replace:=wdReplaceAll end sub

  • macroコードを短縮できるでしょうか。

    下記のコードで、実行できます。大部分はマクロを記憶し、同じ処理を重ねただけのものです。 目的は、ワードで選択した文字列の中から数字を削除します。 ただし、下記のような場合は削除しません。 【請求項1】、項2、ないし3、いずれか1、【0019】、第3の、 この処理を行うために、差別化しました。 まず、数字を赤字で太字にしました。 次に、上記の、削除しては具合が悪い数字については、明朝で標準に戻すようにしてから、赤字で太字の数字を削除しました。 2000文字を超えるので、途中大幅にカットしました。 以下は、コードです。 ~~~~~~~~~~~~~~~~~~~~~~~~ Private Sub 符号削除() Selection.Find.ClearFormatting Selection.Find.Font.Bold = True Selection.Find.Replacement.ClearFormatting With Selection.Range.Find .ClearFormatting .Text = "第1" .Replacement.Text = "" .Replacement.Font.Color = 1 .Replacement.Font.Bold = False .Execute Replace:=wdReplaceAll End With Selection.Find.ClearFormatting Selection.Find.Font.Bold = True Selection.Find.Replacement.ClearFormatting With Selection.Range.Find .ClearFormatting .Text = "第2" .Replacement.Text = "" .Replacement.Font.Color = 1 .Replacement.Font.Bold = False .Execute Replace:=wdReplaceAll End With Selection.Find.ClearFormatting Selection.Find.Font.Bold = True Selection.Find.Replacement.ClearFormatting With Selection.Range.Find .ClearFormatting .Text = "又は2" .Replacement.Text = "" .Replacement.Font.Color = 1 .Replacement.Font.Bold = False .Execute Replace:=wdReplaceAll End With ↓以下、20まで繰り返し Selection.Find.ClearFormatting Selection.Find.Font.Bold = True Selection.Find.Replacement.ClearFormatting With Selection.Range.Find .ClearFormatting .Text = "乃至20" .Replacement.Text = "" .Replacement.Font.Color = 1 .Replacement.Font.Bold = False .Execute Replace:=wdReplaceAll End With Selection.Find.ClearFormatting Selection.Find.Font.Bold = True Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = "1" .Replacement.Text = "" .Forward = True .Wrap = wdFindContinue .Format = True .MatchCase = False .MatchWholeWord = False .MatchByte = False .MatchAllWordForms = False .MatchSoundsLike = False .MatchWildcards = False .MatchFuzzy = False End With Selection.Find.Execute Replace:=wdReplaceAll ↓以下、9,0まで繰り返し Selection.Find.ClearFormatting Selection.Find.Font.Bold = True Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = "9" .Replacement.Text = "" .Forward = True .Wrap = wdFindContinue .Format = True .MatchCase = False .MatchWholeWord = False .MatchByte = False .MatchAllWordForms = False .MatchSoundsLike = False .MatchWildcards = False .MatchFuzzy = False End With Selection.Find.Execute Replace:=wdReplaceAll Selection.Find.ClearFormatting Selection.Find.Font.Bold = True Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = "0" .Replacement.Text = "" .Forward = True .Wrap = wdFindContinue .Format = True .MatchCase = False .MatchWholeWord = False .MatchByte = False .MatchAllWordForms = False .MatchSoundsLike = False .MatchWildcards = False .MatchFuzzy = False End With Selection.Find.Execute Replace:=wdReplaceAll End Sub ~~同じ繰返しを短くする部分の正規表現の使い方やloopを指南していただけたら幸甚です。

  • Wordマクロ

    Wordでワイルドカードを使った置換マクロを作ったのですが、 「MatchWildcardsとMatchSoundsLike、MatchAllWordForms、MatchFuzzyは、同時にTrueに設定することはできません。」 というエラーが出てしまいます。 MatchSoundsLike、MatchAllWordForms、MatchFuzzyは、 ソースに書いてないしTrueにもしていません。 どこが悪いのでしょうか? 以下がソースファイルです、よろしくお願いいたします。 Sub substitute() ' Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = "[!a-f]{1,}" .Replacement.Text = "@" .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchByte = False .MatchAllWordForms = False .MatchSoundsLike = False .MatchWildcards = True .MatchFuzzy = False End With Selection.Find.Execute Replace:=wdReplaceAll End Sub

  • 以下のようなマクロを作成しましたが、文章の最後まで連続置換をしたい場合

    以下のようなマクロを作成しましたが、文章の最後まで連続置換をしたい場合はどうすればよいのでしょうか。 ご教示をお願い致します。 ************************ Selection.Find.ClearFormatting With Selection.Find .Text = "<G>*<M>" .Replacement.Text = "" .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchByte = False .MatchAllWordForms = False .MatchSoundsLike = False .MatchFuzzy = False .MatchWildcards = True End With Selection.Find.Execute Selection.Font.Name = "MS ゴシック" Selection.Find.ClearFormatting With Selection.Find .Text = "<G>*<M>" .Replacement.Text = "" .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchByte = False .MatchAllWordForms = False .MatchSoundsLike = False .MatchFuzzy = False .MatchWildcards = True End With End Sub ************************

専門家に質問してみよう