プロが教えるわが家の防犯対策術!

ワイルドカードを用いた置換の仕方についてお伺いします.

用いているのはword for mac 2004です.

n人(1, 2, 3)や、n人(2, 3, 4)や、n人(3, 4, 5)
n人(1, 2, 3, 4)や、n人(2, 3, 4, 5)や、n人(3, 4, 5, 6)

といったものを,

3人(1, 2, 3)や、3人(2, 3, 4)や、3人(3, 4, 5)
4人(1, 2, 3, 4)や、4人(2, 3, 4, 5)や、4人(3, 4, 5, 6)

という風に,nを()内の数字の個数に一度に置換したいのですが,

検索文字列は
n人(1, 2, 3)や、n人(2, 3, 4)や、n人(3, 4, 5)の場合は

n人(?, ?, ?)

で検索できることはわかっているのですが,置換後の文字列はどのようにすればよいでしょうか?
ちなみに数字やn、カンマとその後のスペースは半角,括弧は全角です.

よろしくお願いします.

A 回答 (7件)

ワイルドカードを使用した場合、()で閉じた内容が一つの式として認識


されますので、(n)が一つ目の式で「n」だけを条件にして、(人(?, ? ))
のようにすることで二つ目の式にして「(人(?, ? )」をまとまった式
にします。

検索条件にした式を参照するのが、\ 記号と式の順番である数字である
「\1」や「\2」のようなものを置換の条件にします。(半角で指定)
今回の場合は、最初の式を変えるので n=\1 ですから \1=3 になること
から、式をそのまま参照するときの \1\2 が 3\2 になるのです。

このように式を利用することで、特定の文字列を参照したときに、その
一部だけを置換する場合に効果的に利用できるようになります。
もっと条件が多い場合では、Wordの置換機能では無理な場合もあります
ので、その場合は正規表現ができるもので置換することになりますが、
今回は関係ないことなので具体的には説明しません。

ちなみにマクロについては、私に提示できる技量が現時点では無いので
回答しませんが、条件としては以下のようなものでマクロを組むことに
なると思います。

検索・置換の条件を指定してのマクロ
**************************************************************
検索する()内の数字の個数を数え、その個数を検索する対象にある
n と置き換えることで、個数が増えても一括で n を個数に置換する。
**************************************************************
これをマクロで組むことで、数字の個数が増えてもマクロが自動で置換
してくれると思います。
    • good
    • 0
この回答へのお礼

半角括弧で囲まれたn、(n)、が式1、\1
で、
半角括弧で囲まれた人(1, 2, 3)、(人(1, 2, 3))、が式2、\2
で、
\1をaにしたい場合にa\2とするんですね

ヘルプを読めばわかったことなんでしょうか・・・

マクロはNo.4の方が書いていただけましたが、やはり私にはまだ敷居が高いようです。。

ですが、便利になることはよいことと思い、日々PC(あるいはmac)に向かっていますので、そのうちできるようになればと思いいています。

特に、エクセルを使っていて、計算式などをもっと使えれば、やりたいことが一発でできるのにっ!と、もっと勉強しないとなあと思っております。

ありがとうございます!

お礼日時:2008/09/24 23:38

こんにちは。



>>これは、ご質問者さんのためではなく、ここをROMしている人たちに対してです。
>わからない人(私)に言ってもしかたのないことですから,当然ですねぇ

これについては、関係ない話なのですが、Excel VBAが分かれば、Word VBAも分かると思い込んでいる人たちがいます。あまりレベルの低いコードで、スレをかき回されるのは、質問者さん自身にも迷惑が掛かるからです。まったく、Word VBAを知らない人が、Excel VBAだけ知って書けるという範囲かかなり限られています。

>alt(option)+F11、あるいはツール-マクロ-作成で作成すればよいのですよね?
>それらしく式を入力する窓がでたので,ペーストし,実行しましたが,うまくいきませんでした...
>なので,一度削除してからと思ったのですが,削除を実行すると一旦消えたように見えるのですが,再度ツール-マクロとすすむと削除されていません

Mac との違いは考慮したつもりでしたが、今、どこが問題なのかは分かりません。
ただ、Wordマクロは、VBEの画面を空けると、Normal.dot があれば、そちらが開いてしまい、そちらに貼り付けてしまいます。それでも構わないのですが、できれば、今のドキュメント側のモジュール(左側の窓で、エクスプローラが出ているので、ドキュメント名をクリックすれば、開きます)に、ThisDocument に書いていただければ、なお良いと思います。

しかし、どこにコードを置いても、Excelとは違い、基本的には、動くはずだと思っていましたが、もしかしたら、

私の
# F5 を押せば、マクロは走るはずです
これがまずかったかもしれません。(理由:カーソルに位置が、コードの中にないと動かない)

貼り付けた後に、表のドキュメント画面(文章を入力するいつもの画面)に戻って、Alt + F8 を押すか、

ツール-マクロ-マクロ
で、窓が出てきますから、その中から、「macFindWord」を選択し、クリックすれば実行されるはずです。(画面がめまぐるしく動くはずですから、あまり美しくないです)
    • good
    • 0

こんばんは。



VBAが一通りできるようになるまでには、半年から1年掛かりますが、Word VBAは、教本が手に入りにくいし、Word VBAは一般性がいまひとつではないでしょうか。前回のWord VBAの質問者に書きましたが、テキスト処理でよいのではないか、と申しましたが、聞き入れてもらえませんでした。

>カンマの個数でnを置換するようにされているのですね。この場合、(1, 2, 3)が(01, 02, 03)など、0が入っていたり、(01-1, 01-2, 01-3)、(a, b, c)でも対応できるのでしょうか?

コンマ(,)の数を数えていますから、もちろん可能です。二桁でも可能なはずです。

>Split で、Ubound で、添え字の上限を取る???

これは、ご質問者さんのためではなく、ここをROMしている人たちに対してです。
    • good
    • 0

こんばんは。



>マクロはNo.4の方が書いていただけましたが、やはり私にはまだ敷居が高いようです。。

マクロを理解するというなら無理に近いし、ここの掲示板でも、一般のWord VBAを書ける人は、何人もいないと思います。(一般のWord VBAという意味は、Mac で、Word の標準コードを無視しないで書くという意味です。)

マクロの登録の仕方程度なら、誰でも出来るというか、Excelのようなややこしさはありません。Alt + F11 で開いて、自分のDocument のThisDocument 辺りに貼り付けて、F5 を押せば、マクロは走るはずです。(セキュリティは、「中」以下です)

この回答への補足

ナンバー6へと合わせての投稿とさせて頂きます.

>これは、ご質問者さんのためではなく、ここをROMしている人たちに対してです。
わからない人(私)に言ってもしかたのないことですから,当然ですねぇ

ワイルドカードでの操作(検索と置換の操作)は,慣れの点で理解できたので,ワイルドカードを用いて,今回は置換いたしました.

しかし,マクロも勉強だと思い,マクロでも一度やってみました.
そこで,少々問題が...

alt(option)+F11、あるいはツール-マクロ-作成で作成すればよいのですよね?

それらしく式を入力する窓がでたので,ペーストし,実行しましたが,うまくいきませんでした...

なので,一度削除してからと思ったのですが,削除を実行すると一旦消えたように見えるのですが,再度ツール-マクロとすすむと削除されていません...

なにか間違った操作をしているのでしょうか?

補足日時:2008/09/25 21:44
    • good
    • 0

こんばんは。



途中まで作ってみて、問題がひとつあるのが気が付きました。それは、Mac ですと、IEのVBScript の正規表現が使えなかったように思います。ですから、一旦、作ったものを全部やり直しました。

原理は、コンマ(,)の数を数えて、その数に1を足して、n に入れるという方法です。数字を数える方法もよいのですが、Split で、Ubound で、添え字の上限を取るというのも、月並みでしたし、配列を使う必要もないのでやめました。最後の検索値でとまります。

Sub macFindWord()
  Dim myRange As Range
  Selection.HomeKey Unit:=wdStory
  With Selection.Find
    .ClearFormatting
    .Text = "n人(*)"
    .Replacement.Text = ""
    .Forward = True
    .Wrap = wdFindContinue
    .Format = True
    .MatchCase = False
    .MatchWholeWord = False
    .MatchByte = False
    .MatchAllWordForms = False
    .MatchSoundsLike = False
    .MatchFuzzy = False
    While .Execute(FindText:="n人(*)", _
      Wrap:=wdFindContinue, _
      MatchWildcards:=True) = True
      Set myRange = Selection.Range
      WordRep myRange
    Wend
  End With
  Set myRange = Nothing
End Sub
Sub WordRep(rng As Range)
Dim i As Integer
Dim j As Integer
Dim buf As String
Dim n As Variant
Dim m As Variant
Dim rept As Variant
   i = InStr(1, rng.Text, "(", 1) + 1
   j = InStr(1, rng.Text, ")", 1)
   buf = Mid(rng.Text, i, j - i)
   n = Len(buf) - Len(Replace(buf, ",", "", , , 1)) + 1
   m = InStr(rng.Text, "人")
   rep = Mid(rng.Text, 1, m - 1)
   Selection = Replace(rng.Text, rep, n)
End Sub
    • good
    • 0
この回答へのお礼

マクロ、ありがとうございます!

Split で、Ubound で、添え字の上限を取る???

今の私にはさっぱりです。。。残念です。。。

マクロについて知っていると、便利なんですよね。。きっと。。。。

今は時間がないので難しいですが、なんとかマクロについて理解できる日が来るように努力しないとだめですね

とりあえずわかることは、Wendy02様が作成させた式をコピーしてペーストすればよいのだ!ということです(汗)

カンマの個数でnを置換するようにされているのですね。この場合、(1, 2, 3)が(01, 02, 03)など、0が入っていたり、(01-1, 01-2, 01-3)、(a, b, c)でも対応できるのでしょうか?

うーむ。。。マクロっていうのはこういう風に、文書(ファイル)に対して、ああしろこうしろと命令するためにあったのですね。

エクセルを使用していて、このセルにこう入力したら、全部でああなれば。。。みたいなときに、マクロを知っていれば、すばらしく便利にいろんなことができるんですねっ

コマンドプロンプロ(でしたっけ)や、ターミナルもそうですよね。

もっと深く(私からしたら)できると可能性がうんと広がるのにと、PC(あるいはMac)に向かっていて思うことが多いです。

>ですから、一旦、作ったものを全部やり直しました。
ここまでしていただきありがとうございました!

お礼日時:2008/09/24 23:55

マクロにしたほうが簡単だとは思いますが、私はマクロのアドバイスは


できかねますので、置換だけでの説明です。

ワイルドカードを使用してとあるので

[検索する文字列] (n)(人(?, ?, ? ))
[置換後の文字列] 3\2

n人の部分を (n)(人(?, ?, ?, ? )) の4人に対応する場合は、「, ?」を
増やして数字部分と同じに数にして、置換後の文字列で「4\2」のように
最初の数字を増やします。あとは[すべて置換]ボタンで必要数置換する
ことで対応できるかと思います。
    • good
    • 0
この回答へのお礼

ありがとうございます!
ナンバー1の方にお礼を投稿していたら,enunokokoro様からも回答がありました...

マクロは難しいものと私は食わず嫌いしてきたので,私もマクロの使い方がわかりません...
簡単なのでしょうか?

nや人(?, ?, ? )の前後の括弧,は何を指示する括弧なのでしょうか?
また,バックスラッシュ2,も何の意味があるのでしょう?半角,でしょうか?

ヘルプも見てみますっ

置換でワイルドカードを用いてだと,一度に全部とはいかず,ある程度,繰り返さないといけないのですね.

でも,n=3や4などだけでも,一度に置換できるだけでとても助かります!

お礼日時:2008/09/24 20:19

たぶんもっといい方法があるのでしょうが、お急ぎなら・・・



たとえば3人の場合、置換後の文字列を 3^& (^& は検索文字列)にして、いったん 3n人(1, 2, 3) などへ置換して、あとでよぶんな n を削除されたら(検索する文字列を n にして、置換後の文字列を指定せずに置換)どうでしょう。
    • good
    • 0
この回答へのお礼

ありがとうございます!

検索文字列にn人(?, ?, ?)で,置換後を3^&ということでしょうか?
そうすれば,3n人(1, 2, 3)になるのですね...

置換後の文字列について,よく調べきれなかったので,よかったですっ

なるほどっ.一括して同じものを削除するのは簡単ですものね!

やってみます.もし,さらに何かいい方法があれば,今後のためにお願いします.

n人(1, 2, 3)や、n人(2, 3, 4)、n人(1, 2, 3, 4)、n人(2, 3, 4, 5)が混在しているので,はじめは,検索文字列を「n人」、置換後を3人にし,次を検索を何度もクリックしてn人(1, 2, 3)や、n人(2, 3, 4)の所だけ置換をして,次は4人を...という風にしていたのですが,あまりにも多くて...

お礼日時:2008/09/24 20:07

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