- ベストアンサー
元々はエクセルの検索置換の問題なんですが、ワード
でやったほうがいいと言う回答者がおられて、以下に問題と正解答と回答者の回答を載せます。その後、回答者の回答の中で解らないところがあるので質問させて戴きます。 また別のもっと簡単な方法があれば教えて下さっても結構です。 問題 町村合併で「香川郡」「香川市」「香川村」が「高松市」に合併されました。 表の「香川郡」「香川市」「香川村」の自治体名が「高松市」になるよう変更しなさい。 香川市松原町123 大井産婦人科 三木市江原町猿山981-1 村瀬歯科医院 香川郡香河町大河663番地 香河総合病院 香川村十日市12-3 十日市診療所 高松市志度町葵葉354番地 再生快医療法人香川県支部 大川市香川郡山町亀井330 中川病院 吉野市大川町125番地1 明日香吉野心療内科 香川郡香川町赤石54-1 明日香川島心療内科 琴平市屋島町字栗林1234-5 香川歯科大学付属病院 正解答 高松市松原町123 大井産婦人科 三木市江原町猿山981-1 村瀬歯科医院 高松市香河町大河663番地 香河総合病院 高松市十日市12-3 十日市診療所 高松市志度町葵葉354番地 再生快医療法人香川県支部 大川市香川郡山町亀井330 中川病院 吉野市大川町125番地1 明日香吉野心療内科 高松市香川町赤石54-1 明日香川島心療内科 琴平市屋島町字栗林1234-5 香川歯科大学付属病院 回答者の回答 エクセルの住所範囲を選択して「コピー」して、ワードに貼り付けます。 Ctrl+Hで置換ダイアログを出して「オプション」ボタンをクリックし「ワイルドカードを使用する」にチェックを入れ、検索する文字列に「香川[郡村市]([!山])」、置換後の文字列に「高松市\1」と入力して「すべて置換」します。 最後にこのデータ範囲をコピーしてエクセルに貼り付ければ完成です。 ちなみに、上記の検索条件は、「香川郡」「香川市」または「香川村」でその後に「山」が付かない文字列(香川郡山町を除外するため)を検索し、「山」以外の文字はそのまま表示するようにしています。 私の質問ですが、 回答者の説明に・・・置換後の文字列に「高松市\1」・・・とあるのですが、\1はどういう意味ですか? 実際には4文字が検索されているようで、\1を省くと、4文字が置換されてしまって上手くいきません。 長くなりましたが宜しくお願い致します。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
以前の質問でワードでの検索置換をお勧めした回答者です。 >また別のもっと簡単な方法があれば教えて下さっても結構です。 基本的に、複雑な検索置換はエクセルではできませんので、ワードの機能を利用されるのが最も簡単な方法です。 >\1はどういう意味ですか? 「\1」の説明についてはすでに皆さんからの回答で意味がわかったかもしれませんが、ワイルドカードを利用する場合の検索置換については検索置換例がいくつか例示されている以下のページが参考になると思います。 http://www.office-qa.com/Word/wd211.htm 上記のページの中の、()と¥数字の項目を見てください。
その他の回答 (5)
- Wendy02
- ベストアンサー率57% (3570/6232)
>別のもっと簡単な方法があれば教えて下さっても結構です。 人によって、簡単か難しいというりは、感覚的なものはあるとは思うものの、今回は、基本的にはExcelの中で処理したほうがよいと思います。できれば、中でも、関数で解決が一番よいような気がします。私は、関数はあまり得意とはしていませんが、こんな方法が出来るかと思います。 「香川郡」「香川市」「香川村」→「高松市」 =IF(A1="","",IF(ISERROR(FIND(LEFT(A1,3), "香川郡香川市香川村")),A1,REPLACE(A1,1,3,"高松市"))) 以下は、あえて、正規表現を使うほどではありませんが、正規表現を使うユーザー定義関数を作ってみました。ある程度の汎用性はあります。(VBAはパスだそうですが、興味がわいたら試してもよいかと思います) ワークシートのへの使い方は、一般関数と同じです。 =ReReplace(A1,"^香川[郡市村]","高松市") こちらは、香川県が先頭に含まれる場合です。 =ReReplace(A1,"^(香川県)*(香川[郡市村])","$1高松市") :VBAの貼りつけかた Alt + F11 (Altを押しながらF11)を押すと、Visual Basic Editor 画面が出てきます。 次に、メニューの[挿入]-[標準モジュール]と開けて、クリックすると、画面が現れますので、以下のコードを貼り付けて、Alt + Q で、画面を閉じます。 '// Public Function ReReplace(srcTxt As Variant, Pat As String, rplTxt As Variant, _ Optional Glb As Boolean = False) Dim Matches As Object Dim Match As Object Dim Ret As String, repl As String, buf As String If Pat <> "" Then With CreateObject("VBScript.RegExp") .Pattern = Pat .Global = Glb On Error GoTo ErrHandler Set Matches = .Execute(srcTxt) If Matches.Count > 0 Then buf = srcTxt For Each Match In Matches repl = .Replace(Match, rplTxt) buf = Replace(srcTxt, Match, repl) Next Ret = buf Else Ret = srcTxt End If End With Else Ret = srcTxt End If ErrHandler: If Err.Number > 0 Then ReReplace = CVErr(xlErrValue) Else ReReplace = Ret End If End Function 私は、VBAを7年も8年も掛かって、この程度しか出来きません。人によっては、半年やそこらで、すぐに出来るようになって、ここのサイトで人にも教えたりする人もいるようです。見方によっては今回のようなコードは、一目みて分かるような初歩レベルだと思います。VBAで解決する場合は、このような方法も可能です。それでも、これは、他人のものと似ているものはあっても、誰のものも参考にしない私のオリジナルです。本格的に作るなら、Basp21を使いますが、ユーザーさんへの負担を考えると、この程度でよいかと思います。
- wisemac21
- ベストアンサー率39% (171/429)
Excelでもできますよ。回答が早く閉じられたので回答してしてませんでしたが・・・ 1例ですが、B7に文字列があるとすると =IF(COUNTIF(B7,"香川市*"),SUBSTITUTE(B7,"香川市","高松市"),IF(COUNTIF(B7,"香川郡*"),SUBSTITUTE(B7,"香川郡","高松市"),IF(COUNTIF(B7,"香川村*"),SUBSTITUTE(B7,"香川村","高松市"),B7))) 式を下へコピー また検索・置換でも出来ますが、この場合は「香川*」で前方一致で検索して、該当セルをすべて選択してから、香川市、香川郡、香川村にそれぞれ置換する操作になります。(一気にに置換は一般機能では出来ません。) 前方一致を検索する方法は、検索タブで検索する文字列に「香川*」と入力、□セル内容が完全に同一であるものを検索するにチェックして「すべてを検索」ボタンをクリックする。
- enunokokoro
- ベストアンサー率74% (3543/4732)
Wordの[検索と置換]において、[ワイルドカード]を使う置換の設定 での条件も含むと理解しにくいので、検索のみでの説明からすれば 置換の意味も理解できるかと思います。 ・条件1 検索する文字列:香川市 この場合は「香川市」のみが対象になり、リストの1番目のみだけが 行頭に「香川市」があるので検索されます。 ・条件2 検索する文字列:香川[市郡村] この場合は「香川市、香川郡、香川村」が対象になり、リストでは 1番目・3番目・4番目と8番目の行頭の文字列と、6番目の大川市の 後ろにある「香川郡」が検索されます。 これは、[ ]で挟まれた一文字が、「香川」の単語と結合して検索 されるためです。 ・条件3 検索する文字列:香川[市郡村][山] この場合は、6番目の大川市の後ろにある「香川郡」+「山」が検索 されます。香川[市郡村]+[ ]で挟まれた一文字「山」がある単語が 結合して検索されるためです。 ・条件4 検索する文字列:香川[市郡村][!山] この場合は「香川市、香川郡、香川村」が対象になり、リストでは 1番目・3番目・4番目と8番目の行頭の文字列だけが検索されます。 これは、[!○]では!の後ろの一文字以外の文字がある単語と結合を しているものだけが検索されるためです。 この条件4を( )で囲むことでグループとしての式になり、その式 を置換の条件で\1のように、( )が置かれた順番を示す\#の数字で グループを残して置換対象にします。 つまり、「香川郡山」の文字列以外の「香川市松」などの文字列が 検索され、\1である( )で検索対象になった文字「松」などが置換の 対象文字列として高松市+( )である高松市\1で置換されます。 http://www.saglasie.com/tr/artl/pc/002.htm 今回のように行頭以外の文字列が対象になりやすい場合は、単語の 先頭を意味するワイルドカードのコードの「<」を香川の前につける ことで、スペースや句読点、改行などの区切り文字がない文字列 の先頭文字を検索することができる方法があります。 ・条件5 検索する文字列:<香川[市郡村] この場合は「香川市、香川郡、香川村」が対象になり、リストでは 1番目・3番目・4番目と8番目の行頭の文字列だけが検索されます。 「大川市香川郡山町」のように、区切り文字がない文字列の途中に ある「香川郡」は検索対象になりませんので、今回の場合は有効な 方法です。 条件5のような条件での検索も簡単ですので試してみてください。 この場合の置換以下の条件だけです。 置換後の文字列:高松市 ちなみにエクセルの形式を壊したくない場合に、エクセルの検索 を正規表現で対応するアドインがありますので、これで置換する 方法でも有効な手段だと思います。 Excel用正規表現検索ダイアログアドイン http://srcedit.pekori.jp/tool/excelre.html Excelで正規表現をつかう http://dreamy.boy.jp/tec3_37.htm ・条件6 検索:^香川[市郡村] 置換:高松市 正規表現については、別に調べるなり質問するなりしてください。
- keithin
- ベストアンサー率66% (5278/7941)
>\1はどういう意味ですか? ご自分で働きを理解されたとおり,「山」以外の文字を「(置換せず)そのまま表示する」機能です。 具体的には検索する文字列の中で()で囲われた範囲に相当する文字(今回のでは山以外の文字ならなんでも)を,置換する文字の中に差し戻すワイルドカードです。 丁寧に説明するなら,今回の命令は 「香川」と「郡または村または市」と「山ではない一文字何でも」の計4文字を 「高松市」と「山ではない一文字何でもを再利用」に 置換します。 \1を外してしまうと 「香川」と「郡または村または市」と「山ではない一文字何でも」の計4文字を 「高松市」に 置換してしまいます。
- edomin7777
- ベストアンサー率40% (711/1750)
通常こういう検索方法を「正規表現」と言います。 香川[郡村市]([!山]) で、正規表現で検索した文字列と検索した文字列の前後の文字列に分けます。 この場合の「\1」は、検索した文字列の後の文字列を表しています。 「香川市松原町123 大井産婦人科」 を検索するとき 「香川市」 が該当しますが、この「行」を 「高松市」 に変換するのではなく後ろの文字列もつけて 「高松市松原町123 大井産婦人科」 に変換しているのです。