- ベストアンサー
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
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 >繰り返し処理の書き方を知りたい それは、サンプルが良くないですね。 直接の回答にはならないかもしれませんが、こういうのはどうかしら? 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
その他の回答 (8)
- KenKen_SP
- ベストアンサー率62% (785/1258)
coral_japan さん、Wendy02 さん、こんにちは。 私も Word VBA を書くのは、情報が乏しくて苦労してますが、資料と しては、付属のヘルプか、WEB 検索ですねー。WEB 検索では、ほぼ 直接的に参考となるような情報は見つけることができません。 最近は Word をマクロで操作する、、同僚からの「つくってよ~」と いった需要も減ってきました。標準の機能がある程度のレベルまで 作りこまれて、マクロを使わなくても対処できることが増えたためか、 ユーザーの操作レベル全体が向上してきたためかな、などと考えて います。 かと言って、標準機能ではできないことを補完する意味でマクロは 非常に便利なツールなのは確かです。 今回 Wendy02 さんがご紹介された、数々の情報は私にも有益でした。 このスレッドに関われて、良かったです。 しかし、よくこれだけの情報を見つけますね。いや、Wendy02 さんの 研究心というか、探究心というか、、いつも関心しきりです。
- Wendy02
- ベストアンサー率57% (3570/6232)
coral_japanさんへ 私も、Word VBAの情報がほしいのです。 一部の方は、今も、のどから手が出るほど欲しいようです。Yahoo!オークションで、古本で最初500円で出ていたものが、10倍以上になりました。5,000円も出すような本ではありません。私には、とても付き合い切れませんでした。私の知っているものは全て書いておきます。できたら、どなたかに、足らない分を補ってほしいと思っています。 書籍 『標準Word2002全機能Bible』 技術評論社 × 『Word VBA 入門教室』 翔泳社 × 『VBA Word 97/98 ハンドブック』技術評論社 (データだけは手に入ります) 『Word 2002, 300の技』技術評論社 おそらく、ここらは、とても、VBAの専門にしている人には満足させるものではないでしょうね。 × 『Word97 VBAハンドブック』 ナツメ社 (×は絶版) 他に、『Microsoft Office 97 プログラマーズガイド』に出ているようですが、今調べましたが、絶版でした。また、Developer関連は、COMが中心で、かなり内容が違ってきます。 『Word 2002, 300の技』の著者の西岡さんという人は、前版(Word 2000)の別の著者(別の意味でWordのプロ中の第一級のライターさんです)の失敗?を轍に、前版のインターネット掲示板の質問等からも取り上げて、多少、VBAが書かれています。必要最低限のVBAのコードは出ているようです。ただ、この種のものは、学習用でも、Office VBAのプロ用のものではありません。 私は、少しずつOffice VBAの英語版にも慣れさせてはいるのですが、日本語ほど速くは読めません。日本語版は、売れないとすぐに絶版にしてしまいます。もう最盛期を過ぎたものに対して、とても、版権を貰って翻訳して出せるような状況ではありませんね。オライリージャパンのように、需要に関係なく、あくまでも、プロ用としてプロのライターが出版する書籍もありますが、とても、Office系は、読者を満足させるようなものではありません。
- Wendy02
- ベストアンサー率57% (3570/6232)
もう1つ訂正です。 MSDNのURLが飛びませんでしたので、プロパティからとってみました。(掲示のレイアウトが崩れますので、文末に掲載します。) Word オブジェクト 飛ばない場合は、 http://www.microsoft.com/japan/msdn/library/default.asp から、 Office ソリューション-Microsoft Office XP-VBAランゲージリファレンス-Microsoft Word Visual Basic-Microsoft Word のオブジェクト MSDNのリファレンスは、元の文章からの抄録のようなもので、意味の取りにくいものが多いのです。それでも、コードが載っていますので、それを試して、言っている意味を理解します。
お礼
参考URLありがとうございます。 ”テキストを操作する”の項を見てみてますが、使用例も載っているので、参考になります。 これですこし葛藤してみようかと思います。
- Wendy02
- ベストアンサー率57% (3570/6232)
#5の訂正文です。 訂正 × Wordを出しているライターさんでも ↓ Wordのテクニックの本を出しているライターさんでも 日本のWord VBAの掲示板が、いくつかあるようですが、Microsoft Word MVP FAQ ほどにはありませんでした。
- Wendy02
- ベストアンサー率57% (3570/6232)
coral_japanさん、こんばんは。Wendy02です。 ちょっと愚痴に聞こえるかもしれませんが、書かせてください。 >どんなものを参考にして覚えていったらよいのでしょうか。。 >その辺もアドバイスいただけたらと思います。 >自分は、ワードを使うので、ワードVBAを覚えたいと思っています。 Office VBAを扱う者として、Word VBA/Excel VBAは、標準的に使えなくてはならないのですが、今となると、Word VBAは、辛いものがありますね。Microsoft では、早々にCOMにさせるようにしているような気がしますね。でも、コンパイラーも高いし、COMというのは、やはり使用用途が違います。 私は、VBAの経歴が浅いので、VBAの資料が少ないのです。それで、他の方はどうしているのか、と思っています。Wordを出しているライターさんでも、VBAは詳しくない人もいるようです。これは、Excel VBAもある程度同じ運命にあるようですが、Word VBAのほうは、97で、ほとんどおしまいになってしまいました。 私も未だ探しています。この前、図書館で、アスキーのWord 97のプログラマーズガイドを見たけれど、ぜんぜん、イメージが違いすぎます。 今は、辛うじて、Microsoft サポート・サイトから、拾い上げたものを使っています。もう、半年間 Word VBAの本をAmazon サイトとYahooでチェックしていますが、出てきても、望んだものでなかったり、Yahoo!オークションは、プレミアがついてしまって、とてもじゃないけれど買えません。あまり初心者向けでは、高いお金を出しても無駄ですからね。 それで、諦めて洋書(英語版のAmazonでないと、高く付きます。)にするか、思案中です。 以下は、前から利用しているサイトです。 Microsoft Word MVP FAQ Site(お勧め) http://word.mvps.org/FAQs/index.htm Resources For MS Word http://www.kayodeok.btinternet.co.uk/index.htm 「MS Word」 -「Sample Macros, VBA Codes」 英語のWordは、シフトJISとかありませんから、Unicodeをあまり意識しなくてよいのですが、Wordは標準が、Unicodeになっていますから、それが、ちょっとややこしいですね。 MSDN Wordのオブジェクト
お礼
Wendy02さん、いろいろありがとうございます。 VBAを理解できれば、仕事の効率もぜんぜん違うと思い、ちょっと覚えてみようといろいろ探してみたのですが、なかなか初心者でもとっつき易い参考本というのがみつかりませんでした。 まだまだ、こちらのサイトでお世話になりそうです。 いまの私からみると、VBA分かる人は、超専門家に見えています。 今後も初心者にも、お優しく、教えてくださいませ。 よろしくお願いいたします。
- KenKen_SP
- ベストアンサー率62% (785/1258)
KenKen_SP です。 > 説明読ませていただきましたが、けっこう難しいんですね。 暴走気味でしたかね。。。 Wendy02 さんのように、シンプルな方が良かったですね。 ご質問趣旨をくめませんでした。すみません。 簡単に言えば、Find メソッドでループ処理するなら、 Find の Excute メソッドは検索に成功すると True を返すので それをループの条件句にする、、 と、考え方はこれだけのことです。
- KenKen_SP
- ベストアンサー率62% (785/1258)
#1 です。 Word VBA は説明するの結構難しいです、、、理解しにくかったら、ごめんなさい。 Sub サンプルコード() '変数の宣言 Dim Rng As Range Dim SelectionEnd As Long Dim RngEnd As Long Dim RngRepEnd As Long Dim strKEYWORD As String '検索語の指定 strKEYWORD = "あ" '(1)ユーザーのマウスやキーボードによる選択範囲を変数 Rng にセット Set Rng = Selection.Range '(2)(1)の範囲の終了位置を保存しておく⇒あとで、ループの終了条件に使う SelectionEnd = Rng.End '(1)の範囲内で検索する際の設定を行う(Find オブジェクト) With Rng.Find '検索または置換操作の条件として書式を含めない場合は、 '事前に ClearFormatting メソッドを実行します .ClearFormatting '検索語を設定します .Text = strKEYWORD '検索語のなかにワイルドカードを使用できるようにします .MatchWildcards = True End With '※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※ 'Find オブジェクトの Execute メソッドは成功すると True を返し、カーソル 'の位置が検索された場所へ移動して、変数 Rng にはその検索された語の範囲が '新たにセットされます。 '検索が成功し、かつ、この範囲 Rng の終了位置が(2)で記憶した位置よりも '前にあれば、、の条件を満たす限りループを継続します。 '例えば、検索に成功したとして、 '(2)の変数 SelectionEnd = 52 で範囲 Rng の終了位置が 15 なら 'While (Rng.Find.Excute) = True And (15 <= 52) = True 'となって、条件を満たしています。 '※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※ Do While Rng.Find.Execute And Rng.End <= SelectionEnd '(3)Exceute メソッドに得られた新しい検索語の範囲 Rng の終了位置を保存 RngEnd = Rng.End With Rng '------------------------------------------------------------ '(4)ここでマクロの目的の処理を行います。ここでは置換をおこなって 'います。 .Text = "(置換したっス)" '------------------------------------------------------------ '(4)で置換などの操作をすると文字列が増えたり、減ったりします。 'したがって、当初のループ終了位置を保存している変数 SelectionEnd 'の値を文字の増減分調整しなければなりません。 'そこで、 '(変更が加わって伸縮した選択範囲の終了位置)-(変更前の選択範囲終了位置) 'を当初の終了位置に加算します。例えば、 '置換前1文字 置換後5文字なら +(5-3)で +2 を加算すれば良いこと 'になります。 RngRepEnd = .End SelectionEnd = SelectionEnd + (RngRepEnd - RngEnd) '選択を解除し、カーソル位置を解除前の選択範囲のうしろに移動します。 .Collapse wdCollapseEnd End With Loop '使ったオブジェクト変数を解放します。 Set Rng = Nothing End Sub
お礼
KenKen_SPさん、よく見たら、前にもマクロの件でお答えをいただいた方だったんですね。 またこんな、超初心者な質問でお世話になります。 説明読ませていただきましたが、けっこう難しいんですね。 文字列から、数字も計算へ持っていったり・・・ いまの私には複雑な処理に見えます。。 ですが、揚げていただいた、お答えを実際に組み込んで動かしてみようと思います。 また分からない点など、書き込みするかもしれませんが、よろしくお願いします。(*^_^*)
- KenKen_SP
- ベストアンサー率62% (785/1258)
こんにちは。KenKen_SP です。 「あ」という文字を置換で消去しているみたいですが、、、 該当する文字がなくなるまで、というのはマクロを使わずとも置換 機能で実現できるのでは? あえてマクロを使う理由はなんですか?
補足
はい、マクロにする必要もないことなのですが、繰り返し処理の書き方を知りたいので、例として、このマクロ繰り返しにする方法ということで質問させていただきました。 検索したテキストが空になったら、ループから抜ける方法を教えてください。
お礼
お答えありがとうございます。 rngContent.Find.Foundというのが、「文字列があるかないか」を判断してくれてるのですね。 実際組み込んでみたら、うまく動きました。 VBAは難しいです。。 どんなものを参考にして覚えていったらよいのでしょうか。。 その辺もアドバイスいただけたらと思います。 自分は、ワードを使うので、ワードVBAを覚えたいと思っています。