ちくのう症(蓄膿症)は「菌」が原因!?

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

このQ&Aに関連する最新のQ&A

A 回答 (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文字
を取得して、指定文字列と取得した文字列が一致した段落と次の段落を
削除するようにしたものです。
たぶん、この回答で希望していることができると思います。

この質問に回答することで、少しですがスキルが向上したので、私個人として
勉強になりました。
    • good
    • 0

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文字以上を指定する方法は、私のスキルでは分かりません。
    • good
    • 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

この回答への補足

あれからいろいろ試してみました。

行頭の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

補足日時:2014/04/11 10:39
    • good
    • 0
この回答へのお礼

早速のアドバイスをありがとうございました。

ご教示いただいたスクリプトで試してみました。

test2_DeleteParagraphでは,"@"は削除されたのですが,そのあとのテキストは残ってしまいました。
段落の削除が上手くいかないようです。

test3_DeleteParagraphでは,"@"が行頭にある段落が見事に削除されました。

これらのスクリプトを手本にして,行頭に"|v"のある段落を削除し,さらにその次の段落も削除するマクロを作りたいと思っています。

いろいろと試していますが,なかなかうまくいきません。

test2_DeleteParagraphでは,どうしても次の段落が削除できません。

test3_DeleteParagraphでは,行頭の検索が2文字になってしまいますので,このままではできないため試行錯誤していおります。

もしお時間がありましたら,アドバイスをいただけると大変ありがたいです。

よろしくお願いいたします。

お礼日時:2014/04/11 08:55

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qword置換で改行は置換できますか?

word置換で改行は置換できますか?

 一斉にEnterでの改行されている部分を置換する方法はないでしょうか?
 あればよろしくおねがいします。

Aベストアンサー

検索と置換画面の「置換」タブ画面で [オプション] を選択し、右下にある「あいまい検索」のチェックを外します。
検索する文字列にカーソルを置いて、[特殊文字] ボタン → 段落記号(P) を選択すると、検索する文字列に 「^p」が入力されます。(直接キー入力してもOKです)

置換後の文字列に置換する文字列、特殊文字を入力して置換をしますが、何も指定しないで、「置換」または「すべて置換」を行うと、改行が削除されます。

特殊文字の一覧項目の「段落記号」は[Enter]による改行で、[Shift]+[Enter]による改行は、「任意指定の行区切り(L)」です。
 

QWORD 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

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
...続きを読む

Aベストアンサー

こんにちは。

>繰り返し処理の書き方を知りたい
それは、サンプルが良くないですね。
直接の回答にはならないかもしれませんが、こういうのはどうかしら?

Sub SampleTest1()
Dim blnFound As Boolean
Dim rngContent As Range
Dim intCount As Integer

blnFound = True
Set rngContent = ActiveDocument.Content
intCount = 0

Do While blnFound = True
  With rngContent.Find
    .ClearFormatting
    .Wrap = wdFindStop
    .Text = "あ"
    .Execute
  End With
  blnFound = rngContent.Find.Found
  If blnFound = True Then intCount = intCount + 1
Loop
MsgBox (intCount & "個見つかりました。")
End Sub

こんにちは。

>繰り返し処理の書き方を知りたい
それは、サンプルが良くないですね。
直接の回答にはならないかもしれませんが、こういうのはどうかしら?

Sub SampleTest1()
Dim blnFound As Boolean
Dim rngContent As Range
Dim intCount As Integer

blnFound = True
Set rngContent = ActiveDocument.Content
intCount = 0

Do While blnFound = True
  With rngContent.Find
    .ClearFormatting
    .Wrap = wdFindStop
    .Text = "あ"
    .Execute
  End...続きを読む

Qワードのマクロで段落番号(文字も含む)取得ってできますか

ワードのマクロで現在のページの段落番号(文字も含む)取得方法ってありますでしょうか。

たとえば、P.3に下記の段落番号があります。
1.1 あいうえおかきくけこ

現在3ページをみています。

マクロで現在表示している段落番号「1.1 あいうえおかきくけこ」を
取得する方法がありましたら教えていただけますでしょうか。

案外ワードのマクロの勉強サイトってエクセルに比べて
少ないんですね。。。

Aベストアンサー

こんばんは。

現在見ているページの指定がちょっと難しいですね。ExcelのようにActiveSheet とは行きません。他にあるのかもしれませんが、Wordのページの概念は物理的に取るしかなかったような気がします。

単に、その場所(Selection)の段落番号の取得というなら簡単ですが、そういう質問ではないような気がします。勝手かもしれませんが、これ以上の手間はあまり取りたくないので、ここまでにさせてください。現実、テキストを取るなら、その全てを、Text で取得し加工するなら可能ですが、段落やら章やら、Wordは良く分かりません。

Sub TestMacro()
Dim a As String
Dim b As String
 With Selection.Paragraphs(1).Range
   a = .ListFormat.ListString
   b = .Text
 End With
 MsgBox a & " " & b
End Sub


>案外ワードのマクロの勉強サイトってエクセルに比べて少ないんですね。。。

大野悟さんという方が本を出していらっしゃいますが、総じて、あまり上級のものは多くないようです。しかし、VBAの上級を目指すとなると避けては通れないので、英文しかないのが、頭が痛いところです。

以下のサイトも内容的には簡単なものが多いです。私たちの世界では、2バイト1バイト(ANSI)混在ですから、ややこしいです。どういうわけか、以前、デフォルトが、Unicode からJISに戻っているようで、どうも良く分からないですね。

私の利用しているところです。
http://word.mvps.org/FAQs/MacrosVBA/index.htm

MSサポートのほうにもサンプルコードはあるのですが、やはりあまり大したものはないようです。

こんばんは。

現在見ているページの指定がちょっと難しいですね。ExcelのようにActiveSheet とは行きません。他にあるのかもしれませんが、Wordのページの概念は物理的に取るしかなかったような気がします。

単に、その場所(Selection)の段落番号の取得というなら簡単ですが、そういう質問ではないような気がします。勝手かもしれませんが、これ以上の手間はあまり取りたくないので、ここまでにさせてください。現実、テキストを取るなら、その全てを、Text で取得し加工するなら可能ですが、段落やら章やら...続きを読む

QWord VBA 表中の空白行を削除する方法

Word2007の表各セルに存在する空白行を削除したく、ネット上で以下のプログラムを見つけて実行しましたが、表外では希望通りに空白行が消えますが、表中の各セルにある空白行が消えません。ファイル数・セル数が多く手作業では時間が掛りすぎますので、なんとか良い方法がないかと四苦八苦しています。VBAは初心者です。宜しくお願いします。


Sub カラ行削除()
'
'
With ActiveDocument.Content.Find
 .Text = "^p^p"
With .Replacement
 .Text = "^p"
End With
 .Execute Replace:=wdReplaceAll
End With
End Sub

Aベストアンサー

質問のマクロにある^pは段落記号なので、段落記号だけが連続している
ものを一つにするものであって、表のセル内であっても空の段落が連続
している場合も有効なはずです。
ただし、セルの最後にある段落記号と少し形の違う[セルの終了記号]と
段落記号が連続している場合には、質問のマクロではできません。

[セルの終了記号]は特殊記号の一つですがで、検索機能でも使える^pの
ような特殊記号と違って、一般機能の検索では探せないらしいです。

マクロで作業ができるなら、以下のGoogleグループにあるマクロで対応
してはいかが。参照先 microsoft.public.word.vba.general より

https://groups.google.com/forum/#!topic/microsoft.public.word.vba.general/rW2kFq07LR4

How to delete blank line at end of table cell?
回答者Klaus氏のマクロ

Sub セルの終了記号と段落記号の連続を削除()
'
Dim tableLoop as Table
Dim cellLoop As Cell
For each tableLoop in ActiveDocument.tables
 For Each cellLoop In tableLoop.Range.Cells
  While Right(cellLoop.Range.Text, 3) = Chr(13) & Chr(13) & Chr(7)
   cellLoop.Range.Characters.Last.Previous.Delete
  Wend
 Next cellLoop
Next tableLoop

End Sub

このマクロは、[セルの終了記号]である Chr(13)&Chr(7)と段落記号が
続いているだけのものを捜し削除してくれるマクロです。
表が複数あっても対応してくれます。

セル内のテキストが書かれた複数段落の途中にある空白行の場合には、
質問にあるマクロで削除できますから問題ないと思います。

質問のマクロにある^pは段落記号なので、段落記号だけが連続している
ものを一つにするものであって、表のセル内であっても空の段落が連続
している場合も有効なはずです。
ただし、セルの最後にある段落記号と少し形の違う[セルの終了記号]と
段落記号が連続している場合には、質問のマクロではできません。

[セルの終了記号]は特殊記号の一つですがで、検索機能でも使える^pの
ような特殊記号と違って、一般機能の検索では探せないらしいです。

マクロで作業ができるなら、以下のGoogleグループにあるマクロで...続きを読む

QWordのマクロで選択中の行番号を取得したい

Wordファイルを操作していると、現在の行番号と桁番号を
画面下で確認できると思います。
5行11桁というように。

これをマクロで取得したいのですが、
どのようにしたら取得できるでしょうか?

画面にコマンドボタンを配置しているのですが、
ボタンを押下する直前にいた場所を取得したのです。

もしご存知でしたら、ご教示ください。
よろしくお願い致します。

Aベストアンサー

行列の現在位置を取得
http://oshiete1.goo.ne.jp/qa3751458.html

こちら↑のマクロから検索(Search)関係を削除して使えるかと思います
ので、参考にしてはいかが。

QWordVBAで規定のところに文字列を挿入したい

 VBA超初心者の質問です。
 ExcelVBAでは値をセルに代入することは出来ますが、WordVBAで規定の場所に文字列を代入するといったことはどうすれば良いのでしょうか?
 できれば、テキストボックスの中身と連動できたらと思うのですが、できますか?
 ちなみに、私はVBAはほとんど知識がありません。
 ただ単にVBAの勉強の手始めにこれだけ教えてください。
 Web検索しても見つからないので、よろしくお願いします。

Aベストアンサー

私もワードのVBAは初心者です。
(テキストボックスの作り方・値のセットのし方)
値は手動でなく、プログラムでセットする方法です。
Sub test05()
ActiveDocument.Shapes.AddTextbox _(msoTextOrientationHorizontal,100 ,100,100,100).Select
Selection.TypeText Text:="東京都文京区"
End Sub
100,・・のところは、Left,Top,Width,Heightの指定です。ワードに貼り付けるコントロールはShapesでまとめられていて、エクセルなどと違うようです。
(所定のところへテキストボックスの値をセットのし方)
「所定のところ」と言うのが、ワードの場合は曲者なような気がする。取りあえず何行目の何文字目と言う指定を知りましたので、記します。
Private Sub TextBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
MsgBox TextBox1.Text
Selection.MoveDown unit:=wdLine, Count:=3
Selection.MoveRight unit:=wdCharacter, Count:=8
Selection.TypeText Text:=TextBox1.Text
End Sub
テキストボックスのイベントを、どれで捕らえるかが難しいが、比較的人為的にしないと起こらないダブルクリックにしました。
テキストボックス内に文字を入れ、テキストボックス内で
ダブルクリックすると3行下の該当文字から8文字目に
入力文字が挿入されます。
ワードのVBAは(1)解説書が少ない。(2)エクセルのように、Cell(Range)に当たる基本的な単位に当たるものが、見つからない。(3)エクセル・アクセスVBAと統一されていない(4)ビジネスなどで利用応用出来る場面が良く見えない。など学習は苦難の道が待っている気がします。OKWEBの質問も回答も少ないようです。お互いに頑張りましょう。

私もワードのVBAは初心者です。
(テキストボックスの作り方・値のセットのし方)
値は手動でなく、プログラムでセットする方法です。
Sub test05()
ActiveDocument.Shapes.AddTextbox _(msoTextOrientationHorizontal,100 ,100,100,100).Select
Selection.TypeText Text:="東京都文京区"
End Sub
100,・・のところは、Left,Top,Width,Heightの指定です。ワードに貼り付けるコントロールはShapesでまとめられていて、エクセルなどと違うようです。
(所定のところへテキストボックスの値をセットのし方...続きを読む

Qワードマクロで画像を選択する方法

「図の挿入」を使って画像ファイルから読み込んで貼り付けた画像を、ワードマクロで選択したいと思っています。
どのようなコードを書けばいいか、教えてください。

ちなみに、以前どなたかがされた質問に対する回答(http://oshiete1.goo.ne.jp/qa2224793.html)で
ActiveDocument.Content.ShapeRange.Select
を使うという方法が提示されていましたが、「図の挿入」で読み込んだ画像ファイルには使えないようです。

よろしくお願いします。

Aベストアンサー

#1のご回答がありますが
私も判らずながらやってみました。
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/vbawd11/html/woobjInlineShapes1.asp
にInlineShapes の説明があります。
ーー
まずエクセルの操作で、挿入ー図ーファイルからでファイル名を指定します。
するとInlineShapes のオブジェクトになるようで、
Sub test02()
For Each ishape In ActiveDocument.InlineShapes
ishape.ConvertToShape
Next ishape

End Sub
を実行するとShape オブジェクトに変換できます。
Sub test01()
Dim pc As Object
Dim ishape As Object
MsgBox ActiveDocument.Shapes.Count
MsgBox ActiveDocument.InlineShapes.Count
For Each pc In ActiveDocument.Shapes
MsgBox pc.Name
Next
End Sub
を実行しますと
メッセージボックスで2と0がでて
Picture 6
などと表示できます。
Sub test03()
ActiveDocument.Shapes("Picture 6").Select
Selection.Delete
End Sub
で削除できました。
ーーー
InlineShapeを捉える件ですが
http://www.keep-on.com/excelyou/2001lng4/200112/01120012.txt
に書いておられますが
Indexでしか捕らえられないのかもしれません。
Sub test04()
MsgBox ActiveDocument.InlineShapes.Count
n = ActiveDocument.InlineShapes.Count
For i = 1 To n
MsgBox ActiveDocument.InlineShapes(i).Height
Next i
End Sub
私もNameでやってみましたができませんでした。
他に方法があるのかどうかわかりません。
Shapes->InlineShapeは選択したものにつき
Sub ConvertToInlineShape()
With Selection
' \\ If we selected a Shape then convert to InlineShape
If .Type = wdSelectionShape Then
.ShapeRange(1).ConvertToInlineShape
End If
End With
End Sub
というコードを見つけました。
Pictureの判別は
Sub test05()
Dim inlineShape
For Each inlineShape In ActiveDocument.InlineShapes
If inlineShape.Type = wdInlineShapePicture Then
MsgBox inlineShape.Height
End If
Next
End Sub
を見つけました。

#1のご回答がありますが
私も判らずながらやってみました。
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/vbawd11/html/woobjInlineShapes1.asp
にInlineShapes の説明があります。
ーー
まずエクセルの操作で、挿入ー図ーファイルからでファイル名を指定します。
するとInlineShapes のオブジェクトになるようで、
Sub test02()
For Each ishape In ActiveDocument.InlineShapes
ishape.ConvertToShape
Next ishape

End Sub
を実行するとShape オブジェクトに変換で...続きを読む

QMS Office Word のマクロで行列の現在位置を取得したいのですが?

Wordで、マクロを組んで、文書から必要箇所を抽出したいと思います。
SelectionオブジェクトのFindプロパティーで文字を検索し、その検索した文字の行、列位置を数値として取得したいのですが、方法が分かりません。
教えて頂ければ幸いです。
【技術者向け】コンピューターで質問しましたが、カテゴリーがずれていたのか回答頂けませんでした。よろしくお願いします。

Aベストアンサー

こんばんは。

いまいち、質問の意味が理解できていないのです。

>SelectionオブジェクトのFindプロパティーで文字を検索し、その検索した文字の行、列位置を数値として取得したいのですが、方法が分かりません。

行と列は、Cells プロパティで、Table がないと、存在しません。
もし、Table があれば、文字検索で「行と列」が、出てくるのでしょうけれども、そうではないような気がします。

それと、本来は、検索して現在位置(行と桁)を取得するマクロは見当たらないのは、この種のFind を使ったマクロは、それ自体が作業本位で、情報取得の目的には、Wordの場合は、あまりしないのだと思います。ステータスバー(画面下)に出てくるからですが。

もし、以下のマクロの解釈が違うようなら、また、レスを付けてください。


'-------------------------------------------------------

Sub TestMacro1()
  Dim myRange As Range
  Dim mySearch As String
  Dim a As Long, b As Long
  mySearch = InputBox("探す文字を入力してください", "検索")
  If mySearch = "" Then Exit Sub
  
  Selection.Find.ClearFormatting
  
  With Selection.Find
   '以下を省略すると誤動作が出る可能性があります。
   '必要ならオプションを入れてください。
    .Text = mySearch
    .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
  Set myRange = Selection.Range
  With myRange
    '行
    a = .Information(wdFirstCharacterLineNumber)
    '桁
    b = .Information(wdFirstCharacterColumnNumber)
  End With
  MsgBox a & " 行 " & b & " 桁"
End Sub

こんばんは。

いまいち、質問の意味が理解できていないのです。

>SelectionオブジェクトのFindプロパティーで文字を検索し、その検索した文字の行、列位置を数値として取得したいのですが、方法が分かりません。

行と列は、Cells プロパティで、Table がないと、存在しません。
もし、Table があれば、文字検索で「行と列」が、出てくるのでしょうけれども、そうではないような気がします。

それと、本来は、検索して現在位置(行と桁)を取得するマクロは見当たらないのは、この種のFind を使ったマ...続きを読む

QWordVBA 置換処理での改行文字の可否

(実際にはExcelのVBAからWordファイルを開いての処理になるのでExcelのVBAで組んでいますが、)
WordのVBAで、置換処理を作成しています。
keyword1 = "検索文字"
keyword2 = "置換文字"
With objSelection.Find
.Text = keyword1
.Forward = True
.MatchWholeWord = True
.Replacement.Text = keyword2
.Execute Replace:=wdReplaceAll
End With
置換処理自体は出来ています。上記処理は置換部分の抜粋です。
しかし行いたいことはタイトルにもあります通り、置換文字中に改行を含めた状態での置換処理です。
長い文字列を置換するだけなら問題ないのですが、改行を含めてしまうと改行文字が別の文字に置き換えられてしまうようです。
置換先でも改行された状態にしたいのですが、これは書き方に問題があるのでしょうか?
もしくは置換処理ではなく、他の方法を取る必要があるのでしょうか?
教えてください。よろしくお願いいたします。

(実際にはExcelのVBAからWordファイルを開いての処理になるのでExcelのVBAで組んでいますが、)
WordのVBAで、置換処理を作成しています。
keyword1 = "検索文字"
keyword2 = "置換文字"
With objSelection.Find
.Text = keyword1
.Forward = True
.MatchWholeWord = True
.Replacement.Text = keyword2
.Execute Replace:=wdReplaceAll
End With
置換処理自体は出来ています。上記処理は置換部分の抜粋です。
しかし行いたいことはタイトルにもあります通り、置換文字中に改行を含めた状態での置換...続きを読む

Aベストアンサー

こんにちは。

>長い文字列を置換するだけなら問題ないのですが、改行を含めてしまうと改行文字が別の文字に置き換えられてしまうようです。

質問の「WordVBA 行の削除」で、偶然に書いたのですが、改行コードの問題で、Excel側は、セルにvbLF が入っているはずですから、

一旦取得した、置換文字を、以下のようにして
keyword2 = Replace(keyword2, vbLf, Chr(11), , , vbBinaryCompare)

置換すればよいのではありませんか?

ちなみに、これが入っているWordテーブルのセルの中で、改行コードの種類が確認できれば、「WordVBA 行の削除」のVBAのほうも可能です。Paragraph 自体の変更はありません。

QEXCEL VBA でのワード置換

EXCEL VBA でのワード置換を教えてください。

EXCELからワードをオープンして文字列置換をしたいです。

Dim wdObj As Object
Dim wdDoc As Object
Dim objSelect As Object
Dim xResult As Boolean

Set wdObj = CreateObject("Word.Application")

wdObj.Visible = True
Set wdDoc = wdObj.Documents.Open(ActiveWorkbook.Path + "\Sample.doc")
Set objSelect = wdObj.Selection

objSelect.Find.Text = "*****"
objSelect.Find.Replacement.ClearFormatting
objSelect.Find.Replacement.Text = Format(35000, "###,###,###")

objSelect.Find.Execute(Replace:=wdReplaceAll)


上記コードで実行したところ、検索はできるのですが、置換ができません。
手動で置換フォームを出してみると、検索文字列、置換文字列ともに目的の文字列が入っています。
そのまま「全て置換」のボタンを押すと、問題なく置換されます。

色々調べてみたのですが、どのサイトもExecuteで置換できるように書かれていて、煮詰まってしまいました。

お知恵をお貸し下さい。

EXCEL VBA でのワード置換を教えてください。

EXCELからワードをオープンして文字列置換をしたいです。

Dim wdObj As Object
Dim wdDoc As Object
Dim objSelect As Object
Dim xResult As Boolean

Set wdObj = CreateObject("Word.Application")

wdObj.Visible = True
Set wdDoc = wdObj.Documents.Open(ActiveWorkbook.Path + "\Sample.doc")
Set objSelect = wdObj.Selection...続きを読む

Aベストアンサー

以下のマクロで試してみて。

Sub test()
 Dim wdObj As Object
 Dim wdDoc As Object
 Dim objSelect As Object
 Dim xResult As Boolean

 Set wdObj = CreateObject("Word.Application")
 wdObj.Visible = True

 Set wdDoc = wdObj.Documents.Open(ActiveWorkbook.Path + "\Sample.doc")
 Set objSelect = wdObj.Selection

 objSelect.Find.ClearFormatting
 objSelect.Find.Replacement.ClearFormatting
 
 With objSelect.Find
  .Text = "*****"
  .Replacement.Text = Format(35000, "###,###,###")
  .Forward = True
  .MatchFuzzy = True
  .MatchWholeWord = False
  .MatchCase = True
  .MatchWildcards = False
  .Forward = True
  .Wrap = 1 'wdFindContinue
  .Format = False
  .Execute , , , , , , , , , , 2 'wdReplaceAll
 End With

End Sub

ExcelでWordの置換を操作する場合
Find.Execute のパラメータを省略する場合「, , , , , , , , , , 2」の
ように書くほうが確実みたい。
https://msdn.microsoft.com/ja-jp/library/microsoft.office.interop.word.find.execute(v=office.11).aspx

それと、Selection.Find を使う場合は、条件を省略しないほうが良い
らしいです。
https://oshiete.goo.ne.jp/qa/5559086.html

以下のマクロで試してみて。

Sub test()
 Dim wdObj As Object
 Dim wdDoc As Object
 Dim objSelect As Object
 Dim xResult As Boolean

 Set wdObj = CreateObject("Word.Application")
 wdObj.Visible = True

 Set wdDoc = wdObj.Documents.Open(ActiveWorkbook.Path + "\Sample.doc")
 Set objSelect = wdObj.Selection

 objSelect.Find.ClearFormatting
 objSelect.Find.Replacement.ClearFormatting
 
 With objSelect.Find
  .Text = "*****"
  .Replacement.Text = Format(350...続きを読む


人気Q&Aランキング

おすすめ情報